Skip to content

Commit 2e17594

Browse files
committed
Removed callback function and added in OpenReaderWithBuffer
1 parent 376ee21 commit 2e17594

File tree

8 files changed

+74
-184
lines changed

8 files changed

+74
-184
lines changed

io/src/ArrayDataReader.cpp

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@
4848

4949
using namespace std;
5050

51-
ArrayDataReader * ArrayDataReader::create( FieldmlIoContext *context, const string root, FmlObjectHandle source,
52-
int externalReadEnabled)
51+
ArrayDataReader * ArrayDataReader::createInternal( FieldmlIoContext *context, const string root,
52+
FmlObjectHandle source, void *buffer )
5353
{
5454
ArrayDataReader *reader = NULL;
5555

@@ -74,7 +74,7 @@ ArrayDataReader * ArrayDataReader::create( FieldmlIoContext *context, const stri
7474
}
7575
else if( format == StringUtil::PLAIN_TEXT_NAME )
7676
{
77-
reader = TextArrayDataReader::create( context, root, source, externalReadEnabled );
77+
reader = TextArrayDataReader::create( context, root, source, buffer );
7878
}
7979
else
8080
{
@@ -84,6 +84,17 @@ ArrayDataReader * ArrayDataReader::create( FieldmlIoContext *context, const stri
8484
return reader;
8585
}
8686

87+
ArrayDataReader * ArrayDataReader::create( FieldmlIoContext *context, const string root, FmlObjectHandle source )
88+
{
89+
return ArrayDataReader::createInternal( context, root, source, 0 );
90+
}
91+
92+
93+
ArrayDataReader * ArrayDataReader::createWithBuffer( FieldmlIoContext *context, const string root, FmlObjectHandle source, void *buffer )
94+
{
95+
return ArrayDataReader::createInternal( context, root, source, buffer );
96+
}
97+
8798

8899
ArrayDataReader::ArrayDataReader( FieldmlIoContext *_context ) :
89100
context( _context )

io/src/ArrayDataReader.h

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,23 @@
4444

4545
#include "FieldmlIoContext.h"
4646

47+
enum ArrayDataSourceType
48+
{
49+
ARRAY_DATA_SOURCE_UNKNOWN,
50+
ARRAY_DATA_SOURCE_DEFAULT,
51+
ARRAY_DATA_SOURCE_BUFFER,
52+
};
53+
4754
class ArrayDataReader
4855
{
4956
protected:
5057
FieldmlIoContext * const context;
5158

5259
ArrayDataReader( FieldmlIoContext *_context );
5360

61+
static ArrayDataReader *createInternal( FieldmlIoContext *context, const std::string root,
62+
FmlObjectHandle source, void *buffer );
63+
5464
public:
5565
virtual FmlIoErrorNumber readIntSlab( const int *offsets, const int *sizes, int *valueBuffer ) = 0;
5666

@@ -59,14 +69,14 @@ class ArrayDataReader
5969
//TODO Provide options for reading into 32/64 bit packed boolean arrays?
6070
virtual FmlIoErrorNumber readBooleanSlab( const int *offsets, const int *sizes, FmlBoolean *valueBuffer ) = 0;
6171

62-
virtual FmlIoErrorNumber setStreamRequestCallback( Fieldml_StreamRequestCallbackFunction function, void *user_data_in ) = 0;
63-
6472
virtual FmlIoErrorNumber close() = 0;
6573

6674
virtual ~ArrayDataReader();
6775

68-
static ArrayDataReader *create( FieldmlIoContext *context, const std::string root, FmlObjectHandle source,
69-
int externalReadEnabled);
76+
static ArrayDataReader *create( FieldmlIoContext *context, const std::string root, FmlObjectHandle source);
77+
78+
static ArrayDataReader *createWithBuffer( FieldmlIoContext *context, const std::string root,
79+
FmlObjectHandle source, void *buffer );
7080
};
7181

7282

io/src/FieldmlIoApi.cpp

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,8 @@ FmlIoErrorNumber FieldmlIo_GetLastError()
7272
return FieldmlIoSession::getSession().getLastError();
7373
}
7474

75-
FmlReaderHandle Fieldml_OpenReaderInternal( FmlSessionHandle handle, FmlObjectHandle objectHandle, int externalReadEnabled )
75+
FmlReaderHandle Fieldml_OpenReaderInternal( FmlSessionHandle handle, FmlObjectHandle objectHandle,
76+
ArrayDataSourceType sourceType, void *buffer)
7677
{
7778
if( Fieldml_IsObjectLocal( handle, objectHandle, 0 ) != 1 )
7879
{
@@ -91,7 +92,11 @@ FmlReaderHandle Fieldml_OpenReaderInternal( FmlSessionHandle handle, FmlObjectHa
9192
}
9293
else
9394
{
94-
reader = ArrayDataReader::create( FieldmlIoSession::getSession().createContext( handle ), root, objectHandle, externalReadEnabled);
95+
if (sourceType == ARRAY_DATA_SOURCE_DEFAULT)
96+
reader = ArrayDataReader::create( FieldmlIoSession::getSession().createContext( handle ), root, objectHandle);
97+
else
98+
reader = ArrayDataReader::createWithBuffer( FieldmlIoSession::getSession().createContext( handle ),
99+
root, objectHandle, buffer);
95100
}
96101
Fieldml_FreeString(region_string);
97102
}
@@ -112,12 +117,12 @@ FmlReaderHandle Fieldml_OpenReaderInternal( FmlSessionHandle handle, FmlObjectHa
112117

113118
FmlReaderHandle Fieldml_OpenReader( FmlSessionHandle handle, FmlObjectHandle objectHandle)
114119
{
115-
return Fieldml_OpenReaderInternal(handle, objectHandle, 0);
120+
return Fieldml_OpenReaderInternal(handle, objectHandle, ARRAY_DATA_SOURCE_DEFAULT, 0);
116121
}
117122

118-
FmlReaderHandle Fieldml_OpenReaderWithExternalCallback( FmlSessionHandle handle, FmlObjectHandle objectHandle)
123+
FmlReaderHandle Fieldml_OpenReaderWithBuffer( FmlSessionHandle handle, FmlObjectHandle objectHandle, void *buffer)
119124
{
120-
return Fieldml_OpenReaderInternal(handle, objectHandle, 1);
125+
return Fieldml_OpenReaderInternal(handle, objectHandle, ARRAY_DATA_SOURCE_BUFFER, buffer);
121126
}
122127

123128
FmlIoErrorNumber Fieldml_ReadIntSlab( FmlReaderHandle readerHandle, const int *offsets, const int *sizes, int *valueBuffer )
@@ -155,18 +160,6 @@ FmlIoErrorNumber Fieldml_ReadBooleanSlab( FmlReaderHandle readerHandle, const in
155160
return reader->readBooleanSlab( offsets, sizes, valueBuffer );
156161
}
157162

158-
FmlIoErrorNumber Fieldml_SetStreamRequestCallback( FmlReaderHandle readerHandle,
159-
Fieldml_StreamRequestCallbackFunction function, void *user_data_in )
160-
{
161-
ArrayDataReader *reader = FieldmlIoSession::getSession().handleToReader( readerHandle );
162-
if( reader == NULL )
163-
{
164-
return FieldmlIoSession::getSession().setError( FML_IOERR_UNKNOWN_OBJECT );
165-
}
166-
167-
return reader->setStreamRequestCallback( function, user_data_in );
168-
}
169-
170163

171164
FmlIoErrorNumber Fieldml_CloseReader( FmlReaderHandle readerHandle )
172165
{

io/src/FieldmlIoApi.h

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -142,13 +142,7 @@ FmlReaderHandle Fieldml_OpenReader( FmlSessionHandle handle, FmlObjectHandle obj
142142
* \see Fieldml_CloseReader
143143
* \see Fieldml_SetStreamRequestCallback
144144
*/
145-
FmlReaderHandle Fieldml_OpenReaderWithExternalCallback( FmlSessionHandle handle, FmlObjectHandle objectHandle);
146-
147-
typedef FmlIoErrorNumber (*Fieldml_StreamRequestCallbackFunction)( const char *href, void **buffer,
148-
unsigned int *bufferSize, enum FieldmlStreamRequestStatus status, void *client_data);
149-
150-
FmlIoErrorNumber Fieldml_SetStreamRequestCallback( FmlReaderHandle handle,
151-
Fieldml_StreamRequestCallbackFunction function, void *user_data_in );
145+
FmlReaderHandle Fieldml_OpenReaderWithBuffer( FmlSessionHandle handle, FmlObjectHandle objectHandle, void *buffer);
152146

153147
/**
154148
* Reads data from the multi-dimensional array specified by the given offsets and sizes into the given buffer. The first

io/src/InputStream.cpp

Lines changed: 0 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,6 @@ class StringInputStream :
9090
public FieldmlInputStream
9191
{
9292
private:
93-
Fieldml_StreamRequestCallbackFunction callbackFunction;
9493
const std::string href;
9594
int requested;
9695
int requestedBufferPos;
@@ -106,10 +105,7 @@ class StringInputStream :
106105

107106
virtual long tell();
108107
virtual bool seek( long pos );
109-
virtual FmlIoErrorNumber setStreamRequestCallback( Fieldml_StreamRequestCallbackFunction function, void *user_data_in );
110108

111-
CallbackStream( const std::string filename );
112-
virtual ~CallbackStream();
113109
};
114110

115111
static const int BUFFER_SIZE = 1024;
@@ -310,12 +306,6 @@ FieldmlInputStream *FieldmlInputStream::createStringStream( const string sourceS
310306
return new StringInputStream( sourceString );
311307
}
312308

313-
FieldmlInputStream *FieldmlInputStream::createCallbackStream( const string filename )
314-
{
315-
return new CallbackStream( filename );
316-
}
317-
318-
319309
bool FieldmlInputStream::eof()
320310
{
321311
return isEof;
@@ -430,99 +420,3 @@ bool StringInputStream::seek( long pos )
430420
StringInputStream::~StringInputStream()
431421
{
432422
}
433-
434-
CallbackStream::CallbackStream( const std::string filename ) :
435-
href( filename ),
436-
requested( 0 ),
437-
requestedBufferPos( 0 ),
438-
user_data( NULL ),
439-
requestedBuffer( NULL ),
440-
memoryBufferSize( 0 ),
441-
status( FML_STREAM_REQUEST_STATUS_OK )
442-
{
443-
callbackFunction = NULL;
444-
}
445-
446-
int CallbackStream::loadBuffer()
447-
{
448-
if (status == FML_STREAM_REQUEST_STATUS_OK)
449-
{
450-
if (callbackFunction)
451-
{
452-
status = FML_STREAM_REQUEST_STATUS_START;
453-
FmlIoErrorNumber err = callbackFunction(href.c_str(), &requestedBuffer, &memoryBufferSize, status, user_data);
454-
requested = 1;
455-
if ((err == FML_IOERR_NO_ERROR) && (memoryBufferSize > 0) && (requestedBuffer != NULL))
456-
{
457-
status = FML_STREAM_REQUEST_STATUS_REQUESTED;
458-
}
459-
else
460-
{
461-
status = FML_STREAM_REQUEST_STATUS_ERROR;
462-
return 0;
463-
}
464-
}
465-
else
466-
{
467-
return 0;
468-
}
469-
}
470-
if (status == FML_STREAM_REQUEST_STATUS_REQUESTED)
471-
{
472-
int len;
473-
bufferPos = 0;
474-
len = BUFFER_SIZE;
475-
if( len + requestedBufferPos > memoryBufferSize )
476-
{
477-
len = memoryBufferSize - requestedBufferPos;
478-
}
479-
memcpy( buffer, (char *)requestedBuffer + requestedBufferPos, len );
480-
requestedBufferPos += len;
481-
bufferCount = len;
482-
483-
if( bufferCount <= 0 )
484-
{
485-
isEof = true;
486-
return 0;
487-
}
488-
}
489-
else
490-
{
491-
return 0;
492-
}
493-
return 1;
494-
}
495-
496-
long CallbackStream::tell()
497-
{
498-
return requestedBufferPos - ( bufferCount - bufferPos );
499-
}
500-
501-
bool CallbackStream::seek( long pos )
502-
{
503-
if( ( pos < 0 ) || ( pos >= memoryBufferSize ) )
504-
{
505-
return false;
506-
}
507-
508-
requestedBufferPos = pos;
509-
bufferPos = bufferCount;
510-
return true;
511-
}
512-
513-
FmlIoErrorNumber CallbackStream::setStreamRequestCallback( Fieldml_StreamRequestCallbackFunction function, void *user_data_in )
514-
{
515-
callbackFunction = function;
516-
user_data = user_data_in;
517-
printf("\nCallbackStream::setStreamRequestCallback\n");
518-
return FML_IOERR_NO_ERROR;
519-
}
520-
521-
CallbackStream::~CallbackStream()
522-
{
523-
if (callbackFunction && status == FML_STREAM_REQUEST_STATUS_REQUESTED)
524-
{
525-
status = FML_STREAM_REQUEST_STATUS_END;
526-
callbackFunction(href.c_str(), &requestedBuffer, &memoryBufferSize, status, NULL);
527-
}
528-
}

io/src/InputStream.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,14 +71,8 @@ class FieldmlInputStream
7171
virtual long tell() = 0;
7272
virtual bool seek( long pos ) = 0;
7373

74-
virtual FmlIoErrorNumber setStreamRequestCallback( Fieldml_StreamRequestCallbackFunction function, void *user_data_in )
75-
{
76-
return 0;
77-
}
78-
7974
static FieldmlInputStream *createTextFileStream( const std::string filename );
8075
static FieldmlInputStream *createStringStream( const std::string string );
81-
static FieldmlInputStream *createCallbackStream( const std::string filename );
8276
};
8377

8478
#endif //H_FIELDML_INPUT_STREAM

io/src/TextArrayDataReader.cpp

Lines changed: 34 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ class BooleanBufferReader :
131131

132132

133133
TextArrayDataReader *TextArrayDataReader::create( FieldmlIoContext *context, const string root, FmlObjectHandle source,
134-
int externalReadEnabled)
134+
void *buffer)
135135
{
136136
FieldmlInputStream *stream = NULL;
137137

@@ -159,35 +159,41 @@ TextArrayDataReader *TextArrayDataReader::create( FieldmlIoContext *context, con
159159
return NULL;
160160
}
161161

162-
if( type == FML_DATA_RESOURCE_HREF )
163-
{
164-
string href;
165-
char *temp_href = Fieldml_GetDataResourceHref( context->getSession(), resource );
166-
if( !StringUtil::safeString( temp_href, href ) )
167-
{
168-
context->setError( FML_IOERR_CORE_ERROR );
169-
return NULL;
170-
}
171-
Fieldml_FreeString(temp_href);
172-
if ( externalReadEnabled == 0)
173-
{
174-
stream = FieldmlInputStream::createTextFileStream( StringUtil::makeFilename( root, href ) );
175-
}
176-
else
177-
{
178-
stream = FieldmlInputStream::createCallbackStream( StringUtil::makeFilename( root, href ) );
179-
}
162+
if (buffer == 0)
163+
{
164+
if( type == FML_DATA_RESOURCE_HREF )
165+
{
166+
string href;
167+
char *temp_href = Fieldml_GetDataResourceHref( context->getSession(), resource );
168+
if( !StringUtil::safeString( temp_href, href ) )
169+
{
170+
context->setError( FML_IOERR_CORE_ERROR );
171+
return NULL;
172+
}
173+
Fieldml_FreeString(temp_href);
174+
stream = FieldmlInputStream::createTextFileStream( StringUtil::makeFilename( root, href ) );
175+
}
176+
else if( type == FML_DATA_RESOURCE_INLINE )
177+
{
178+
string data;
179+
char *temp_inline_data = Fieldml_GetInlineData( context->getSession(), resource );
180+
if( !StringUtil::safeString( temp_inline_data, data ) )
181+
{
182+
return NULL;
183+
}
184+
Fieldml_FreeString(temp_inline_data);
185+
stream = FieldmlInputStream::createStringStream( data );
186+
}
180187
}
181-
else if( type == FML_DATA_RESOURCE_INLINE )
188+
else
182189
{
183-
string data;
184-
char *temp_inline_data = Fieldml_GetInlineData( context->getSession(), resource );
185-
if( !StringUtil::safeString( temp_inline_data, data ) )
186-
{
187-
return NULL;
188-
}
189-
Fieldml_FreeString(temp_inline_data);
190-
stream = FieldmlInputStream::createStringStream( data );
190+
string data;
191+
char *temp_data = (char *)buffer;
192+
if( !StringUtil::safeString( temp_data, data ) )
193+
{
194+
return NULL;
195+
}
196+
stream = FieldmlInputStream::createStringStream( data );
191197
}
192198

193199
if( stream == NULL )
@@ -444,16 +450,6 @@ FmlIoErrorNumber TextArrayDataReader::readBooleanSlab( const int *offsets, const
444450
return readSlab( offsets, sizes, reader );
445451
}
446452

447-
FmlIoErrorNumber TextArrayDataReader::setStreamRequestCallback( Fieldml_StreamRequestCallbackFunction function, void *user_data_in )
448-
{
449-
if( closed )
450-
{
451-
return FML_IOERR_RESOURCE_CLOSED;
452-
}
453-
454-
return stream->setStreamRequestCallback( function, user_data_in );
455-
}
456-
457453

458454
FmlIoErrorNumber TextArrayDataReader::close()
459455
{

0 commit comments

Comments
 (0)