Files
harbour-core/contrib/hbmxml/tests/custom.prg
Przemysław Czerpak 96ca3fe470 2014-01-21 20:41 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl)
* Makefile
  * config/*
  * contrib/*
  * doc/*
  * extras/*
  * include/*
  * lib/*
  * package/*
  * src/*
  * tests/*
  * utils/*
    * removed empty lines left after removed '$' + 'Id' + '$' identifiers
2014-01-21 20:41:05 +01:00

149 lines
3.4 KiB
Plaintext

#require "hbmxml"
#xtranslate _ENCODE( <xData> ) => ( hb_base64Encode( hb_Serialize( mxmlGetCustom( <xData> ) ) ) )
PROCEDURE 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 )
ErrorLevel( -1 )
RETURN
ENDIF
IF !( hb_MD5( _ENCODE( node ) ) == mxmlElementGetAttr( node, "checksum" ) )
OutErr( "Custom data of element <hash> is corrupted!" )
mxmlDelete( tree )
ErrorLevel( -1 )
RETURN
ENDIF
xData := mxmlGetCustom( node )
IF HB_ISHASH( xData ) .AND. hb_HHasKey( xData, "Today" )
OutStd( xData[ "Today" ], hb_eol() )
ENDIF
mxmlSetErrorCallback( NIL )
mxmlSetCustomHandlers( NIL, NIL )
ErrorLevel( 0 )
RETURN
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( 9 ), 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