2011-01-09 12:20 UTC+0200 Petr Chornyj (myorg63 at mail.ru)

* contrib/hbmxml/tests/test.prg
    * Minor changes
  * contrib/hbmxml/hbmxml.c
  * contrib/hbmxml/tests/custom.prg
    + Added mxml[Get|New|Set]Custom()
This commit is contained in:
Petr Chornyj
2011-01-09 10:15:20 +00:00
parent 2a551c3ea1
commit c8fc35ec2e
4 changed files with 445 additions and 107 deletions

View File

@@ -16,6 +16,13 @@
The license applies to all entries newer than 2009-04-28.
*/
2011-01-09 12:20 UTC+0200 Petr Chornyj (myorg63 at mail.ru)
* contrib/hbmxml/tests/test.prg
* Minor changes
* contrib/hbmxml/hbmxml.c
* contrib/hbmxml/tests/custom.prg
+ Added mxml[Get|New|Set]Custom()
2011-01-08 22:09 UTC+0100 Viktor Szakats (harbour.01 syenar.hu)
- config/hbc.cfg
+ config/hb_c.cfg

View File

@@ -76,42 +76,36 @@ typedef struct /* placeholder for mxml_node_t */
typedef struct
{
PHB_DYNS type_cb;
} HB_TYPE_CB_VAR;
typedef struct
{
PHB_DYNS save_cb;
} HB_SAVE_CB_VAR;
PHB_DYNS sax_cb;
} HB_CBS_VAR;
typedef struct
{
PHB_DYNS sax_cb;
} HB_SAX_CB_VAR;
PHB_DYNS load_cb;
PHB_DYNS save_cb;
} HB_CUSTOM_CBS_VAR;
typedef struct
{
PHB_DYNS error_cb;
} HB_ERROR_CB_VAR;
static void hb_type_cb_var_init( void * cargo )
static void hb_cbs_var_init( void * cargo )
{
HB_TYPE_CB_VAR * pType_cb = ( HB_TYPE_CB_VAR * ) cargo;
HB_CBS_VAR * pCbs = ( HB_CBS_VAR * ) cargo;
pType_cb->type_cb = NULL;
pCbs->type_cb = NULL;
pCbs->save_cb = NULL;
pCbs->sax_cb = NULL;
}
static void hb_save_cb_var_init( void * cargo )
static void hb_custom_cbs_var_init( void * cargo )
{
HB_SAVE_CB_VAR * pSave_cb = ( HB_SAVE_CB_VAR * ) cargo;
HB_CUSTOM_CBS_VAR * pCCbs = ( HB_CUSTOM_CBS_VAR * ) cargo;
pSave_cb->save_cb = NULL;
}
static void hb_sax_cb_var_init( void * cargo )
{
HB_SAX_CB_VAR * pSax_cb = ( HB_SAX_CB_VAR * ) cargo;
pSax_cb->sax_cb = NULL;
pCCbs->load_cb = NULL;
pCCbs->save_cb = NULL;
}
static void hb_error_cb_var_init( void * cargo )
@@ -121,9 +115,8 @@ static void hb_error_cb_var_init( void * cargo )
pError_cb->error_cb = NULL;
}
static HB_TSD_NEW( s_type_cb_var, sizeof( HB_TYPE_CB_VAR ), hb_type_cb_var_init, NULL );
static HB_TSD_NEW( s_save_cb_var, sizeof( HB_SAVE_CB_VAR ), hb_save_cb_var_init, NULL );
static HB_TSD_NEW( s_sax_cb_var, sizeof( HB_SAX_CB_VAR ), hb_sax_cb_var_init, NULL );
static HB_TSD_NEW( s_cbs_var, sizeof( HB_CBS_VAR ), hb_cbs_var_init, NULL );
static HB_TSD_NEW( s_custom_cbs_var, sizeof( HB_CUSTOM_CBS_VAR ), hb_custom_cbs_var_init, NULL );
static HB_TSD_NEW( s_error_cb_var, sizeof( HB_ERROR_CB_VAR ), hb_error_cb_var_init, NULL );
/* ========================= mxml_node_t * support ============================== */
@@ -143,7 +136,7 @@ static HB_GARBAGE_FUNC( hbmxml_nodeDestructor )
if( pHbnode->flags == 1 )
{
mxmlDelete( pHbnode->node );
pHbnode->node = NULL;
}
}
@@ -256,14 +249,10 @@ HB_FUNC( HB_MXMLVERSION )
/*
* - mxmlEntityAddCallback
* - mxmlEntityRemoveCallback
* - mxmlGetCustom
* - mxmlLoadFd
* - mxmlNewCustom
* - mxmlSAXLoadFd
* - mxmlSAXLoadString
* - mxmlSaveFd
* - mxmlSetCustom
* - mxmlSetCustomHandlers
*/
/* void mxmlAdd( mxml_node_t * parent, int where, mxml_node_t * child, mxml_node_t * node ) */
@@ -278,7 +267,11 @@ HB_FUNC( MXMLADD )
where = ( ( where == MXML_ADD_BEFORE ) ? MXML_ADD_BEFORE : MXML_ADD_AFTER );
if( parent && node )
{
int TODO;
mxmlAdd( parent, where, ( child != NULL ) ? child : MXML_ADD_TO_PARENT, node );
}
else
MXML_ERR_ARGS;
}
@@ -287,7 +280,8 @@ HB_FUNC( MXMLADD )
HB_FUNC( MXMLDELETE )
{
HBMXML_NODE * pHbnode = ( HBMXML_NODE * ) hb_parptrGC( &s_gc_mxml_nodeFuncs, 1 );
HBMXML_NODE * pHbnode = ( HBMXML_NODE * ) hb_parptrGC( &s_gc_mxml_nodeFuncs, 1 );
int TODO;
if( pHbnode && pHbnode->node )
{
@@ -740,11 +734,11 @@ HB_FUNC( MXMLINDEXRESET )
static mxml_type_t type_cb( mxml_node_t * node )
{
HB_TYPE_CB_VAR * pType_cb = ( HB_TYPE_CB_VAR * ) hb_stackGetTSD( &s_type_cb_var );
HB_CBS_VAR * pCbs = ( HB_CBS_VAR * ) hb_stackGetTSD( &s_cbs_var );
if( pType_cb != NULL )
if( pCbs != NULL )
{
PHB_DYNS pSym = pType_cb->type_cb;
PHB_DYNS pSym = pCbs->type_cb;
if( pSym && hb_vmRequestReenter() )
{
@@ -765,21 +759,18 @@ static mxml_type_t type_cb( mxml_node_t * node )
hb_vmRequestRestore();
return ( mxml_type_t ) iResult;
}
else
return MXML_TEXT;
}
else
return MXML_TEXT;
return MXML_TEXT;
}
HB_FUNC( MXMLLOADFILE )
{
void * hFree;
mxml_node_t * node_top;
mxml_node_t * node;
mxml_load_cb_t cb = MXML_NO_CALLBACK;
HB_TYPE_CB_VAR * pType_cb = ( HB_TYPE_CB_VAR * ) hb_stackGetTSD( &s_type_cb_var );
FILE * file;
void * hFree;
mxml_node_t * node_top;
mxml_node_t * node;
mxml_load_cb_t cb = MXML_NO_CALLBACK;
HB_CBS_VAR * pCbs = ( HB_CBS_VAR * ) hb_stackGetTSD( &s_cbs_var );
FILE * file;
if( HB_ISNIL( 1 ) || ( HB_ISNUM( 1 ) && hb_parni( 1 ) == MXML_NO_PARENT ) )
{
@@ -802,7 +793,7 @@ HB_FUNC( MXMLLOADFILE )
if( pDynSym && hb_dynsymIsFunction( pDynSym ) )
{
pType_cb->type_cb = pDynSym;
pCbs->type_cb = pDynSym;
cb = type_cb;
}
}
@@ -820,7 +811,7 @@ HB_FUNC( MXMLLOADFILE )
}
}
file = hb_fopen( hb_parstr_utf8( 2, &hFree, NULL ), "r" );
file = hb_fopen( hb_parstr_utf8( 2, &hFree, NULL ), "rb" );
if( file )
{
node = mxmlLoadFile( node_top, file, cb );
@@ -829,7 +820,7 @@ HB_FUNC( MXMLLOADFILE )
mxml_node_ret( node, ( node_top == MXML_NO_PARENT ) ? 1 : 0 );
}
pType_cb->type_cb = NULL;
pCbs->type_cb = NULL;
hb_strfree( hFree );
}
@@ -840,11 +831,11 @@ HB_FUNC( MXMLLOADFILE )
HB_FUNC( MXMLLOADSTRING )
{
void * hFree;
mxml_node_t * node_top;
mxml_node_t * node;
mxml_load_cb_t cb = MXML_NO_CALLBACK;
HB_TYPE_CB_VAR * pType_cb = ( HB_TYPE_CB_VAR * ) hb_stackGetTSD( &s_type_cb_var );
void * hFree;
mxml_node_t * node_top;
mxml_node_t * node;
mxml_load_cb_t cb = MXML_NO_CALLBACK;
HB_CBS_VAR * pCbs = ( HB_CBS_VAR * ) hb_stackGetTSD( &s_cbs_var );
if( HB_ISNIL( 1 ) || ( HB_ISNUM( 1 ) && hb_parni( 1 ) == MXML_NO_PARENT ) )
@@ -868,7 +859,7 @@ HB_FUNC( MXMLLOADSTRING )
if( pDynSym && hb_dynsymIsFunction( pDynSym ) )
{
pType_cb->type_cb = pDynSym;
pCbs->type_cb = pDynSym;
cb = type_cb;
}
}
@@ -887,7 +878,7 @@ HB_FUNC( MXMLLOADSTRING )
}
node = mxmlLoadString( node_top, hb_parstr_utf8( 2, &hFree, NULL ), cb );
pType_cb->type_cb = NULL;
pCbs->type_cb = NULL;
if( node )
mxml_node_ret( node, ( node_top == MXML_NO_PARENT ) ? 1 : 0 );
@@ -1095,8 +1086,8 @@ HB_FUNC( MXMLNEWTEXT )
HB_FUNC( MXMLNEWXML )
{
mxml_node_t * node;
void * hVersion;
mxml_node_t * node;
node = mxmlNewXML( HB_ISCHAR( 1 ) ? hb_parstr_utf8( 1, &hVersion, NULL ) : NULL );
@@ -1147,16 +1138,16 @@ HB_FUNC( MXMLRETAIN )
static void sax_cb( mxml_node_t * node, mxml_sax_event_t event, void * data )
{
HB_SAX_CB_VAR * pSax_cb = ( HB_SAX_CB_VAR * ) hb_stackGetTSD( &s_sax_cb_var );
HB_CBS_VAR * pCbs = ( HB_CBS_VAR * ) hb_stackGetTSD( &s_cbs_var );
if( node != NULL && pSax_cb != NULL )
if( node != NULL && pCbs != NULL )
{
PHB_DYNS pSym = pSax_cb->sax_cb;
PHB_DYNS pSym = pCbs->sax_cb;
if( pSym && hb_vmRequestReenter() )
{
PHB_ITEM pNode = hb_itemNew( NULL );
HB_USHORT uPCount = 2;
PHB_ITEM pNode = hb_itemNew( NULL );
HB_USHORT uPCount = 2;
hbmxml_node_ItemPut( pNode, node, 0 );
@@ -1168,7 +1159,7 @@ static void sax_cb( mxml_node_t * node, mxml_sax_event_t event, void * data )
if( data != NULL )
{
hb_vmPush( ( PHB_ITEM ) data );
uPCount += 1;
uPCount += 1;
}
hb_vmProc( uPCount );
@@ -1178,7 +1169,7 @@ static void sax_cb( mxml_node_t * node, mxml_sax_event_t event, void * data )
}
}
/*
/*
mxml_node_t * mxmlSAXLoadFile( mxml_node_t * top,
FILE * fp,
mxml_load_cb_t cb,
@@ -1188,15 +1179,14 @@ static void sax_cb( mxml_node_t * node, mxml_sax_event_t event, void * data )
HB_FUNC( MXMLSAXLOADFILE )
{
void * hFree;
mxml_node_t * node_top;
mxml_node_t * node;
mxml_load_cb_t cb = MXML_NO_CALLBACK;
mxml_sax_cb_t cb_sax = MXML_NO_CALLBACK;
PHB_ITEM pData = ( hb_pcount() > 4 ) ? hb_param( 5, HB_IT_ANY ) : NULL;
HB_TYPE_CB_VAR * pType_cb = ( HB_TYPE_CB_VAR * ) hb_stackGetTSD( &s_type_cb_var );
HB_SAX_CB_VAR * pSax_cb = ( HB_SAX_CB_VAR * ) hb_stackGetTSD( &s_sax_cb_var );
FILE * file;
void * hFree;
mxml_node_t * node_top;
mxml_node_t * node;
mxml_load_cb_t cb = MXML_NO_CALLBACK;
mxml_sax_cb_t cb_sax = MXML_NO_CALLBACK;
PHB_ITEM pData = ( hb_pcount() > 4 ) ? hb_param( 5, HB_IT_ANY ) : NULL;
HB_CBS_VAR * pCbs = ( HB_CBS_VAR * ) hb_stackGetTSD( &s_cbs_var );
FILE * file;
if( HB_ISNIL( 1 ) || ( HB_ISNUM( 1 ) && hb_parni( 1 ) == MXML_NO_PARENT ) )
{
@@ -1219,7 +1209,7 @@ HB_FUNC( MXMLSAXLOADFILE )
if( pDynSym && hb_dynsymIsFunction( pDynSym ) )
{
pType_cb->type_cb = pDynSym;
pCbs->type_cb = pDynSym;
cb = type_cb;
}
}
@@ -1243,12 +1233,12 @@ HB_FUNC( MXMLSAXLOADFILE )
if( pDynSym && hb_dynsymIsFunction( pDynSym ) )
{
pSax_cb->sax_cb = pDynSym;
pCbs->sax_cb = pDynSym;
cb_sax = sax_cb;
}
}
file = hb_fopen( hb_parstr_utf8( 2, &hFree, NULL ), "rb+" );
file = hb_fopen( hb_parstr_utf8( 2, &hFree, NULL ), "rb" );
if( file )
{
node = mxmlSAXLoadFile( node_top, file, cb, cb_sax, pData );
@@ -1259,8 +1249,8 @@ HB_FUNC( MXMLSAXLOADFILE )
fclose( file );
}
pType_cb->type_cb = NULL;
pSax_cb->sax_cb = NULL;
pCbs->type_cb = NULL;
pCbs->sax_cb = NULL;
hb_strfree( hFree );
}
@@ -1269,11 +1259,11 @@ HB_FUNC( MXMLSAXLOADFILE )
static const char * save_cb( mxml_node_t * node, int where )
{
HB_SAVE_CB_VAR * pSave_cb = ( HB_SAVE_CB_VAR * ) hb_stackGetTSD( &s_save_cb_var );
HB_CBS_VAR * pCbs = ( HB_CBS_VAR * ) hb_stackGetTSD( &s_cbs_var );
if( node != NULL && pSave_cb != NULL )
if( node != NULL && pCbs != NULL )
{
PHB_DYNS pSym = pSave_cb->save_cb;
PHB_DYNS pSym = pCbs->save_cb;
if( pSym && hb_vmRequestReenter() )
{
@@ -1308,11 +1298,8 @@ static const char * save_cb( mxml_node_t * node, int where )
return pszResult;
}
else
return NULL;
}
else
return NULL;
return NULL;
}
/* char * mxmlSaveAllocString( mxml_node_t *node, mxml_save_cb_t cb ) */
@@ -1323,11 +1310,10 @@ HB_FUNC( MXMLSAVEALLOCSTRING )
if( node )
{
mxml_save_cb_t cb = MXML_NO_CALLBACK;
HB_SAVE_CB_VAR * pSave_cb = ( HB_SAVE_CB_VAR * ) hb_stackGetTSD( &s_save_cb_var );
char buffer[ BUFFER_SIZE ];
int bytes;
mxml_save_cb_t cb = MXML_NO_CALLBACK;
HB_CBS_VAR * pCbs = ( HB_CBS_VAR * ) hb_stackGetTSD( &s_cbs_var );
char buffer[ BUFFER_SIZE ];
int bytes;
if( HB_ISSYMBOL( 2 ) )
{
@@ -1335,13 +1321,13 @@ HB_FUNC( MXMLSAVEALLOCSTRING )
if( pDynSym && hb_dynsymIsFunction( pDynSym ) )
{
pSave_cb->save_cb = pDynSym;
pCbs->save_cb = pDynSym;
cb = save_cb;
}
}
bytes = mxmlSaveString( node, buffer, BUFFER_SIZE, cb );
pSave_cb->save_cb = NULL;
pCbs->save_cb = NULL;
if( bytes <= 0 )
hb_retc_null();
@@ -1366,14 +1352,14 @@ HB_FUNC( MXMLSAVEALLOCSTRING )
HB_FUNC( MXMLSAVEFILE )
{
mxml_node_t * node = mxml_node_param( 1 );
FILE * file;
void * hFree;
mxml_node_t * node = mxml_node_param( 1 );
FILE * file;
void * hFree;
if( node && HB_ISCHAR( 2 ) )
{
mxml_save_cb_t cb = MXML_NO_CALLBACK;
HB_SAVE_CB_VAR * pSave_cb = ( HB_SAVE_CB_VAR * ) hb_stackGetTSD( &s_save_cb_var );
mxml_save_cb_t cb = MXML_NO_CALLBACK;
HB_CBS_VAR * pCbs = ( HB_CBS_VAR * ) hb_stackGetTSD( &s_cbs_var );
if( HB_ISSYMBOL( 3 ) )
{
@@ -1381,19 +1367,19 @@ HB_FUNC( MXMLSAVEFILE )
if( pDynSym && hb_dynsymIsFunction( pDynSym ) )
{
pSave_cb->save_cb = pDynSym;
pCbs->save_cb = pDynSym;
cb = save_cb;
}
}
file = hb_fopen( hb_parstr_utf8( 2, &hFree, NULL ), "w" );
if (file )
{
file = hb_fopen( hb_parstr_utf8( 2, &hFree, NULL ), "wb" );
if( file )
{
hb_retni( mxmlSaveFile( node, file, cb ) );
fclose( file );
}
pSave_cb->save_cb = NULL;
pCbs->save_cb = NULL;
hb_strfree( hFree );
}
else
@@ -1409,8 +1395,8 @@ HB_FUNC( MXMLSAVESTRING )
if( node )
{
mxml_save_cb_t cb = MXML_NO_CALLBACK;
HB_SAVE_CB_VAR * pSave_cb = ( HB_SAVE_CB_VAR * ) hb_stackGetTSD( &s_save_cb_var );
mxml_save_cb_t cb = MXML_NO_CALLBACK;
HB_CBS_VAR * pCbs = ( HB_CBS_VAR * ) hb_stackGetTSD( &s_cbs_var );
if( pBuffer && HB_ISBYREF( 2 ) )
{
@@ -1423,7 +1409,7 @@ HB_FUNC( MXMLSAVESTRING )
if( pDynSym && hb_dynsymIsFunction( pDynSym ) )
{
pSave_cb->save_cb = pDynSym;
pCbs->save_cb = pDynSym;
cb = save_cb;
}
}
@@ -1431,7 +1417,7 @@ HB_FUNC( MXMLSAVESTRING )
if( hb_itemGetWriteCL( pBuffer, &buffer, &buffer_size ) )
{
int bytes = mxmlSaveString( node, buffer, ( int ) buffer_size, cb );
pSave_cb->save_cb = NULL;
pCbs->save_cb = NULL;
if( bytes <= 0 )
hb_retni( -1 );
@@ -1652,3 +1638,200 @@ HB_FUNC( MXMLWALKPREV )
else
MXML_ERR_ARGS;
}
/* const void * mxmlGetCustom( mxml_node_t * node ) */
HB_FUNC( MXMLGETCUSTOM )
{
mxml_node_t * node = mxml_node_param( 1 );
if( node )
{
PHB_ITEM pItem = ( PHB_ITEM ) mxmlGetCustom( node );
if( pItem )
hb_itemReturn( pItem );
}
else
MXML_ERR_ARGS;
}
/* =============== void ( *mxml_custom_destroy_cb_t )( void * ) ================= */
static void custom_destroy_cb( void * Cargo )
{
PHB_ITEM pItem = ( PHB_ITEM ) Cargo;
if( pItem != NULL )
hb_itemRelease( pItem );
}
/*
mxml_node_t * mxmlNewCustom( mxml_node_t * parent,
void * data, mxml_custom_destroy_cb_t destroy )
*/
HB_FUNC( MXMLNEWCUSTOM )
{
mxml_node_t * node = MXML_NO_PARENT;
if( hb_pcount() > 1 )
{
if( HB_ISNIL( 1 ) || ( HB_ISNUM( 1 ) && hb_parni( 1 ) == MXML_NO_PARENT ) )
{
PHB_ITEM pItem = hb_itemClone( hb_param( 2, HB_IT_ANY ) );
node = mxmlNewCustom( MXML_NO_PARENT, pItem, custom_destroy_cb );
if( node )
mxml_node_ret( node, 1 );
else
hb_itemRelease( pItem );
}
else
{
mxml_node_t * node_parent = mxml_node_param( 1 );
if( node_parent )
{
PHB_ITEM pItem = hb_itemClone( hb_param( 2, HB_IT_ANY ) );
node = mxmlNewCustom( node_parent, pItem, custom_destroy_cb );
if( node )
mxml_node_ret( node, 0 );
else
hb_itemRelease( pItem );
}
else
MXML_ERR_ARGS;
}
}
else
MXML_ERR_ARGS;
}
/*
int mxmlSetCustom ( mxml_node_t * node,
void * data, mxml_custom_destroy_cb_t destroy )
*/
HB_FUNC( MXMLSETCUSTOM )
{
mxml_node_t * node = mxml_node_param( 1 );
if( node && hb_pcount() > 1 )
{
PHB_ITEM pItem = hb_itemClone( hb_param( 2, HB_IT_ANY ) );
int iResult;
if( pItem )
{
iResult = mxmlSetCustom( node, pItem, custom_destroy_cb );
hb_retni( iResult );
if( iResult < 0 )
hb_itemRelease( pItem );
}
}
else
MXML_ERR_ARGS;
}
/* ======= int ( *mxml_custom_load_cb_t )( mxml_node_t *, const char * ) ======== */
static int custom_load_cb( mxml_node_t * node, const char * data )
{
HB_CUSTOM_CBS_VAR * pCCbs = ( HB_CUSTOM_CBS_VAR * ) hb_stackGetTSD( &s_custom_cbs_var );
if( node != NULL && pCCbs != NULL && data != NULL )
{
PHB_DYNS pSym = pCCbs->load_cb;
if( pSym && hb_vmRequestReenter() )
{
PHB_ITEM pNode = hb_itemNew( NULL );
int iResult;
hbmxml_node_ItemPut( pNode, node, 0 );
hb_vmPushDynSym( pSym );
hb_vmPushNil();
hb_vmPushItemRef( pNode );
hb_itemPutCConst( hb_stackAllocItem(), data );
hb_vmFunction( 2 );
iResult = hb_parnidef( -1, 1 );
hb_itemRelease( pNode );
hb_vmRequestRestore();
return iResult;
}
}
return 1;
}
/* ============ char * ( *mxml_custom_save_cb_t )( mxml_node_t * ) ============= */
static char * custom_save_cb( mxml_node_t * node )
{
HB_CUSTOM_CBS_VAR * pCCbs = ( HB_CUSTOM_CBS_VAR * ) hb_stackGetTSD( &s_custom_cbs_var );
if( node != NULL && pCCbs != NULL )
{
PHB_DYNS pSym = pCCbs->save_cb;
if( pSym && hb_vmRequestReenter() )
{
PHB_ITEM pNode = hb_itemNew( NULL );
char * pszResult = NULL;
hbmxml_node_ItemPut( pNode, node, 0 );
hb_vmPushDynSym( pSym );
hb_vmPushNil();
hb_vmPushItemRef( pNode );
hb_vmFunction( 1 );
if( HB_ISCHAR( -1 ) )
pszResult = strdup( hb_parc( -1 ) );
hb_itemRelease( pNode );
hb_vmRequestRestore();
return pszResult;
}
}
return NULL;
}
/* void mxmlSetCustomHandlers( mxml_custom_load_cb_t load, mxml_custom_save_cb_t save ) */
HB_FUNC( MXMLSETCUSTOMHANDLERS )
{
mxml_custom_load_cb_t load = NULL;
mxml_custom_save_cb_t save = NULL;
if( HB_ISSYMBOL( 1 ) && HB_ISSYMBOL( 2 ) )
{
HB_CUSTOM_CBS_VAR * pCCbs = ( HB_CUSTOM_CBS_VAR * ) hb_stackGetTSD( &s_custom_cbs_var );
PHB_DYNS pDynLoad = hb_dynsymNew( hb_itemGetSymbol( hb_param( 1, HB_IT_SYMBOL ) ) );
PHB_DYNS pDynSave = hb_dynsymNew( hb_itemGetSymbol( hb_param( 2, HB_IT_SYMBOL ) ) );
if( pDynLoad && hb_dynsymIsFunction( pDynLoad ) && pDynSave && hb_dynsymIsFunction( pDynSave ) )
{
pCCbs->load_cb = pDynLoad;
pCCbs->save_cb = pDynSave;
load = custom_load_cb;
save = custom_save_cb;
}
else
{
pCCbs->load_cb = NULL;
pCCbs->save_cb = NULL;
}
}
mxmlSetCustomHandlers( load, save );
}

View File

@@ -0,0 +1,149 @@
/*
* $Id$
*/
#xtranslate _ENCODE( <xData> ) => ( hb_base64encode( hb_serialize( mxmlGetCustom( <xData> ) ) ) )
#include "hbmxml.ch"
#include "hbinkey.ch"
FUNCTION main( )
LOCAL tree, node
LOCAL xData
mxmlSetErrorCallback( @my_mxmlError() )
mxmlSetCustomHandlers( @load_c(), @save_c() )
IF ! hb_FileExists( "cust.xml" )
create_cust()
ENDIF
tree := mxmlLoadFile( tree, "cust.xml", @type_cb() )
node := mxmlFindElement( tree, tree, "hash", NIL, NIL, MXML_DESCEND )
IF Empty( node )
OutErr( "Unable to find <hash> element in XML tree!" )
mxmlDelete( tree )
RETURN -1
ENDIF
IF hb_md5( _ENCODE( node ) ) != mxmlElementGetAttr( node, "checksum" )
OutErr( "Custom data of element <hash> is corrupted!" )
mxmlDelete( tree )
RETURN -1
ENDIF
xData := mxmlGetCustom( node )
IF hb_isHash( xData ) .AND. hb_hHasKey( xData, "Today" )
OutStd( xData[ "Today" ], hb_eol() )
ENDIF
mxmlSetErrorCallback( NIL )
mxmlSetCustomHandlers( NIL, NIL )
RETURN 0
STATIC PROCEDURE create_cust()
LOCAL tree, group, element, node
LOCAL hData := {=>}
hData[ "Today" ] := hb_tsToStr( hb_dateTime() )
/* etc. */
tree := mxmlNewXML()
group := mxmlNewElement( tree, "group" )
element := mxmlNewElement( group, "hash" )
node := mxmlNewCustom( element, hData )
mxmlElementSetAttr( element, "type", "custom" )
mxmlElementSetAttr( element, "checksum", hb_md5( _ENCODE( node ) ) )
mxmlSaveFile( tree, "cust.xml", @whitespace_cb() )
RETURN
PROCEDURE my_mxmlError( cErrorMsg )
OutErr( cErrorMsg, hb_eol() )
RETURN
FUNCTION load_c( node, cString )
mxmlSetCustom( node, hb_deserialize( hb_base64decode( cString ) ) )
RETURN 0 /* 0 on success or non-zero on error */
FUNCTION save_c( node )
RETURN _ENCODE( node ) /* string on success or NIL on error */
FUNCTION whitespace_cb( node, where )
LOCAL parent /* Parent node */
LOCAL nLevel := -1 /* Indentation level */
LOCAL name /* Name of element */
name := mxmlGetElement( node )
IF Left( name, 4 ) == "?xml"
IF where == MXML_WS_AFTER_OPEN
RETURN hb_eol()
ELSE
RETURN NIL
ENDIF
ELSEIF where == MXML_WS_BEFORE_OPEN .OR. ;
( ( name == "choice" .OR. name == "option" ) .AND. ;
where == MXML_WS_BEFORE_CLOSE )
parent := mxmlGetParent( node )
DO WHILE ! Empty( parent )
nLevel++
parent := mxmlGetParent( parent )
ENDDO
IF nLevel > 8
nLevel := 8
ELSEIF nLevel < 0
nLevel := 0
ENDIF
RETURN Replicate( Chr( HB_K_TAB ), nLevel )
ELSEIF where == MXML_WS_AFTER_CLOSE .OR. ;
( ( name == "group".OR. name == "option" .OR. name == "choice" ) .AND. ;
where == MXML_WS_AFTER_OPEN )
RETURN hb_eol()
ELSEIF where == MXML_WS_AFTER_OPEN .AND. Empty( mxmlGetFirstChild( node ) )
RETURN hb_eol()
ENDIF
RETURN NIL /* Return NIL for no added whitespace... */
FUNCTION type_cb( node )
LOCAL nResult
LOCAL cType
IF Empty( cType := mxmlElementGetAttr( node, "type" ) )
cType := mxmlGetElement( node )
ENDIF
SWITCH Lower( cType )
CASE "custom" /* don't forget */
CASE "hash"
nResult := MXML_CUSTOM
EXIT
OTHERWISE
nResult := MXML_TEXT
EXIT
ENDSWITCH
RETURN nResult

View File

@@ -3,7 +3,6 @@
*/
#include "hbmxml.ch"
#include "fileio.ch"
#include "hbinkey.ch"
STATIC event_counts
@@ -408,7 +407,7 @@ FUNCTION main( cFile )
cBuffer := Space( abs( i ) )
IF ( mxmlSaveString( tree, @cBuffer, @whitespace_cb() ) > 0 )
hb_memoWrit( "test2.xml", cBuffer + hb_eol() )
hb_memoWrit( "test2.xml", cBuffer )
ENDIF
OutStd( cBuffer + hb_eol() )
@@ -416,7 +415,7 @@ FUNCTION main( cFile )
cBuffer := mxmlSaveAllocString( node, 0 )
IF Len( cBuffer ) > 0
hb_memoWrit( "test3.xml", cBuffer + hb_eol() )
hb_memoWrit( "test3.xml", cBuffer )
ENDIF
IF mxmlSaveFile( node, "test4.xml" ) < 0
@@ -623,7 +622,7 @@ FUNCTION whitespace_cb( node, where )
PROCEDURE sax_cb( node, sax_event, user_data )
//mxmlRetain( node )
/* mxmlRetain( node ) */
HB_SYMBOL_UNUSED( user_data )