Skip to content

Commit 376ee21

Browse files
committed
Committed changes supporting stream request callback.
1 parent f568d04 commit 376ee21

13 files changed

+293
-17
lines changed

core/src/FieldmlSession.cpp

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,46 @@ FieldmlRegion *FieldmlSession::addResourceRegion( string href, string name )
200200
return resourceRegion;
201201
}
202202

203+
FieldmlRegion *FieldmlSession::addResourceRegionFromBuffer( const void *buffer, unsigned int buffer_length, string name )
204+
{
205+
if((buffer == 0) || (1 > buffer_length))
206+
{
207+
return 0;
208+
}
209+
210+
//NOTE: This will be insufficient when the region name starts being used.
211+
if( FmlUtil::contains( importHrefStack, name ) )
212+
{
213+
addError( "Recursive import involving " + name );
214+
return NULL;
215+
}
216+
217+
importHrefStack.push_back( name );
218+
219+
FieldmlRegion *resourceRegion = new FieldmlRegion( name, name, "", objects );
220+
FieldmlRegion *currentRegion = region;
221+
region = resourceRegion;
222+
223+
int result = 0;
224+
225+
result = FieldmlDOM::parseFieldmlString( (const char *)buffer, "memory buffer", "memory", this, getSessionHandle() );
226+
227+
importHrefStack.pop_back();
228+
229+
region = currentRegion;
230+
231+
if( ( result != 0 ) || ( getErrorCount() != 0 ) )
232+
{
233+
delete resourceRegion;
234+
resourceRegion = NULL;
235+
}
236+
else
237+
{
238+
regions.push_back( resourceRegion );
239+
}
240+
241+
return resourceRegion;
242+
}
203243

204244
void FieldmlSession::pushErrorContext( const char *file, const int line, const char *function )
205245
{

core/src/FieldmlSession.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,8 @@ class FieldmlSession :
117117

118118
FieldmlRegion *addResourceRegion( std::string location, std::string name );
119119

120+
FieldmlRegion *addResourceRegionFromBuffer( const void *buffer, unsigned int buffer_length, std::string name );
121+
120122
FieldmlRegion *addNewRegion( std::string location, std::string name );
121123

122124
FieldmlRegion *getRegion( std::string location, std::string name );

core/src/fieldml_api.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -514,6 +514,31 @@ FmlSessionHandle Fieldml_CreateFromFile( const char * filename )
514514
return session->getSessionHandle();
515515
}
516516

517+
FmlSessionHandle Fieldml_CreateFromBuffer( const void *buffer, unsigned int buffer_length, const char * name )
518+
{
519+
FieldmlSession *session = new FieldmlSession();
520+
ErrorContextAutostack bob( session, __FILE__, __LINE__, __ECA_FUNC__ );
521+
522+
if( buffer == NULL || 1 > buffer_length )
523+
{
524+
session->setError( FML_ERR_INVALID_PARAMETER_1, "Cannot create FieldML session. Invalid buffer." );
525+
}
526+
else
527+
{
528+
session->region = session->addResourceRegionFromBuffer( buffer, buffer_length, name );
529+
if( session->region == NULL )
530+
{
531+
session->setError( FML_ERR_READ_ERR, "Cannot create FieldML session. Invalid document or read error." );
532+
}
533+
else
534+
{
535+
session->region->finalize();
536+
}
537+
}
538+
539+
return session->getSessionHandle();
540+
}
541+
517542

518543
FmlSessionHandle Fieldml_Create( const char * location, const char * name )
519544
{

core/src/fieldml_api.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,8 @@ extern "C" {
273273
*/
274274
FmlSessionHandle Fieldml_CreateFromFile( const char * filename );
275275

276+
FmlSessionHandle Fieldml_CreateFromBuffer( const void *buffer, unsigned int buffer_length, const char * name );
277+
276278

277279
/**
278280
* Creates an empty FieldML handle.

io/src/ArrayDataReader.cpp

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

4949
using namespace std;
5050

51-
ArrayDataReader * ArrayDataReader::create( FieldmlIoContext *context, const string root, FmlObjectHandle source )
51+
ArrayDataReader * ArrayDataReader::create( FieldmlIoContext *context, const string root, FmlObjectHandle source,
52+
int externalReadEnabled)
5253
{
5354
ArrayDataReader *reader = NULL;
5455

@@ -73,7 +74,7 @@ ArrayDataReader * ArrayDataReader::create( FieldmlIoContext *context, const stri
7374
}
7475
else if( format == StringUtil::PLAIN_TEXT_NAME )
7576
{
76-
reader = TextArrayDataReader::create( context, root, source );
77+
reader = TextArrayDataReader::create( context, root, source, externalReadEnabled );
7778
}
7879
else
7980
{

io/src/ArrayDataReader.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,14 @@ class ArrayDataReader
5959
//TODO Provide options for reading into 32/64 bit packed boolean arrays?
6060
virtual FmlIoErrorNumber readBooleanSlab( const int *offsets, const int *sizes, FmlBoolean *valueBuffer ) = 0;
6161

62+
virtual FmlIoErrorNumber setStreamRequestCallback( Fieldml_StreamRequestCallbackFunction function, void *user_data_in ) = 0;
63+
6264
virtual FmlIoErrorNumber close() = 0;
6365

6466
virtual ~ArrayDataReader();
6567

66-
static ArrayDataReader *create( FieldmlIoContext *context, const std::string root, FmlObjectHandle source );
68+
static ArrayDataReader *create( FieldmlIoContext *context, const std::string root, FmlObjectHandle source,
69+
int externalReadEnabled);
6770
};
6871

6972

io/src/FieldmlIoApi.cpp

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

75-
76-
FmlReaderHandle Fieldml_OpenReader( FmlSessionHandle handle, FmlObjectHandle objectHandle )
75+
FmlReaderHandle Fieldml_OpenReaderInternal( FmlSessionHandle handle, FmlObjectHandle objectHandle, int externalReadEnabled )
7776
{
7877
if( Fieldml_IsObjectLocal( handle, objectHandle, 0 ) != 1 )
7978
{
@@ -92,7 +91,7 @@ FmlReaderHandle Fieldml_OpenReader( FmlSessionHandle handle, FmlObjectHandle obj
9291
}
9392
else
9493
{
95-
reader = ArrayDataReader::create( FieldmlIoSession::getSession().createContext( handle ), root, objectHandle );
94+
reader = ArrayDataReader::create( FieldmlIoSession::getSession().createContext( handle ), root, objectHandle, externalReadEnabled);
9695
}
9796
Fieldml_FreeString(region_string);
9897
}
@@ -111,6 +110,16 @@ FmlReaderHandle Fieldml_OpenReader( FmlSessionHandle handle, FmlObjectHandle obj
111110
}
112111

113112

113+
FmlReaderHandle Fieldml_OpenReader( FmlSessionHandle handle, FmlObjectHandle objectHandle)
114+
{
115+
return Fieldml_OpenReaderInternal(handle, objectHandle, 0);
116+
}
117+
118+
FmlReaderHandle Fieldml_OpenReaderWithExternalCallback( FmlSessionHandle handle, FmlObjectHandle objectHandle)
119+
{
120+
return Fieldml_OpenReaderInternal(handle, objectHandle, 1);
121+
}
122+
114123
FmlIoErrorNumber Fieldml_ReadIntSlab( FmlReaderHandle readerHandle, const int *offsets, const int *sizes, int *valueBuffer )
115124
{
116125
ArrayDataReader *reader = FieldmlIoSession::getSession().handleToReader( readerHandle );
@@ -146,6 +155,18 @@ FmlIoErrorNumber Fieldml_ReadBooleanSlab( FmlReaderHandle readerHandle, const in
146155
return reader->readBooleanSlab( offsets, sizes, valueBuffer );
147156
}
148157

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+
149170

150171
FmlIoErrorNumber Fieldml_CloseReader( FmlReaderHandle readerHandle )
151172
{

io/src/FieldmlIoApi.h

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,6 @@ typedef int32_t FmlWriterHandle; ///< A handle to a data writer.
7777

7878
typedef int32_t FmlIoErrorNumber; ///< A FieldML IO library error code.
7979

80-
8180
/*
8281
8382
Constants
@@ -104,6 +103,15 @@ typedef int32_t FmlIoErrorNumber; ///< A FieldML IO library error
104103
105104
*/
106105

106+
enum FieldmlStreamRequestStatus
107+
{
108+
FML_STREAM_REQUEST_STATUS_UNKNOWN,
109+
FML_STREAM_REQUEST_STATUS_OK,
110+
FML_STREAM_REQUEST_STATUS_START,
111+
FML_STREAM_REQUEST_STATUS_REQUESTED,
112+
FML_STREAM_REQUEST_STATUS_ERROR,
113+
FML_STREAM_REQUEST_STATUS_END,
114+
};
107115

108116
/*
109117
@@ -124,6 +132,23 @@ extern "C" {
124132
*/
125133
FmlReaderHandle Fieldml_OpenReader( FmlSessionHandle handle, FmlObjectHandle objectHandle );
126134

135+
/**
136+
* Creates a new reader for the given data source's raw data. Fieldml_CloseReader() should be called
137+
* when the caller no longer needs to use it. Reader created using this function will use an
138+
* external callback function user set later to read the required data in.
139+
*
140+
* \see Fieldml_ReadIntSlab
141+
* \see Fieldml_ReadDoubleSlab
142+
* \see Fieldml_CloseReader
143+
* \see Fieldml_SetStreamRequestCallback
144+
*/
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 );
127152

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

io/src/Hdf5ArrayDataReader.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,11 @@ class Hdf5ArrayDataReader :
7777

7878
virtual FmlIoErrorNumber readBooleanSlab( const int *offsets, const int *sizes, FmlBoolean *valueBuffer );
7979

80+
virtual FmlIoErrorNumber setStreamRequestCallback( Fieldml_StreamRequestCallbackFunction function, void *user_data_in )
81+
{
82+
return 0;
83+
}
84+
8085
virtual FmlIoErrorNumber close();
8186

8287
virtual ~Hdf5ArrayDataReader();

0 commit comments

Comments
 (0)