2011-01-11 23:06 UTC+0100 Viktor Szakats (harbour.01 syenar.hu)

* contrib/hbmxml/tests/reminder.prg
  * contrib/hbmxml/tests/test.prg
    ! Fixed warnings and errors preventing these
      tests from building.

  * contrib/hbexpat/hbexpat.c
  * contrib/hbcurl/hbcurl.c
  * contrib/hbssl/ssl.c
  * contrib/hbssl/pem.c
    + Added support also for function pointers where codeblocks
      were accepted. Please test it.
      NOTE: It was easy change because PHB_ITEM was already
            used to store the callback value and official Eval API
            was used to call the callbacks.

  * contrib/hbssl/tests/pem.prg
    + Added example for function pointer callback.

  * contrib/hbssl/pem.c
    % Minor optimization.
This commit is contained in:
Viktor Szakats
2011-01-11 22:07:02 +00:00
parent 849c1b8723
commit 4fa468eb9d
8 changed files with 103 additions and 72 deletions

View File

@@ -16,6 +16,28 @@
The license applies to all entries newer than 2009-04-28.
*/
2011-01-11 23:06 UTC+0100 Viktor Szakats (harbour.01 syenar.hu)
* contrib/hbmxml/tests/reminder.prg
* contrib/hbmxml/tests/test.prg
! Fixed warnings and errors preventing these
tests from building.
* contrib/hbexpat/hbexpat.c
* contrib/hbcurl/hbcurl.c
* contrib/hbssl/ssl.c
* contrib/hbssl/pem.c
+ Added support also for function pointers where codeblocks
were accepted. Please test it.
NOTE: It was easy change because PHB_ITEM was already
used to store the callback value and official Eval API
was used to call the callbacks.
* contrib/hbssl/tests/pem.prg
+ Added example for function pointer callback.
* contrib/hbssl/pem.c
% Minor optimization.
2011-01-11 19:35 UTC+0100 Viktor Szakats (harbour.01 syenar.hu)
* contrib/hbsqlit3/hbsqlit3.c
+ Switched to use codeblocks for callbacks (instead of function

View File

@@ -116,7 +116,7 @@ typedef struct _HB_CURL
size_t dl_len;
size_t dl_pos;
PHB_ITEM pProgressBlock;
PHB_ITEM pProgressCallback;
HB_HASH_TABLE_PTR pHash;
@@ -519,10 +519,10 @@ static void PHB_CURL_free( PHB_CURL hb_curl, HB_BOOL bFree )
hb_curl_buff_ul_free( hb_curl );
hb_curl_buff_dl_free( hb_curl );
if( hb_curl->pProgressBlock )
if( hb_curl->pProgressCallback )
{
hb_itemRelease( hb_curl->pProgressBlock );
hb_curl->pProgressBlock = NULL;
hb_itemRelease( hb_curl->pProgressCallback );
hb_curl->pProgressCallback = NULL;
}
if( hb_curl->pHash )
@@ -586,8 +586,8 @@ static HB_GARBAGE_FUNC( PHB_CURL_mark )
{
PHB_CURL hb_curl = * hb_curl_ptr;
if( hb_curl->pProgressBlock )
hb_gcMark( hb_curl->pProgressBlock );
if( hb_curl->pProgressCallback )
hb_gcMark( hb_curl->pProgressCallback );
}
}
@@ -1589,25 +1589,25 @@ HB_FUNC( CURL_EASY_SETOPT )
case HB_CURLOPT_PROGRESSBLOCK:
{
PHB_ITEM pProgressBlock = hb_param( 3, HB_IT_BLOCK );
PHB_ITEM pProgressCallback = hb_param( 3, HB_IT_BLOCK | HB_IT_SYMBOL );
if( hb_curl->pProgressBlock )
if( hb_curl->pProgressCallback )
{
curl_easy_setopt( hb_curl->curl, CURLOPT_PROGRESSFUNCTION, NULL );
curl_easy_setopt( hb_curl->curl, CURLOPT_PROGRESSDATA, NULL );
hb_itemRelease( hb_curl->pProgressBlock );
hb_curl->pProgressBlock = NULL;
hb_itemRelease( hb_curl->pProgressCallback );
hb_curl->pProgressCallback = NULL;
}
if( pProgressBlock )
if( pProgressCallback )
{
hb_curl->pProgressBlock = hb_itemNew( pProgressBlock );
hb_curl->pProgressCallback = hb_itemNew( pProgressCallback );
/* unlock the item so GC will not mark them as used */
hb_gcUnlock( hb_curl->pProgressBlock );
hb_gcUnlock( hb_curl->pProgressCallback );
curl_easy_setopt( hb_curl->curl, CURLOPT_PROGRESSFUNCTION, hb_curl_progress_callback );
res = curl_easy_setopt( hb_curl->curl, CURLOPT_PROGRESSDATA, hb_curl->pProgressBlock );
res = curl_easy_setopt( hb_curl->curl, CURLOPT_PROGRESSDATA, hb_curl->pProgressCallback );
}
}
break;

View File

@@ -118,7 +118,7 @@ typedef struct _HB_EXPAT
{ \
PHB_EXPAT hb_expat = PHB_EXPAT_par( 1 ); \
\
hb_expat_setvar( hb_expat, _VAR_b##_name_, hb_param( 2, HB_IT_BLOCK ) ); \
hb_expat_setvar( hb_expat, _VAR_b##_name_, hb_param( 2, HB_IT_BLOCK | HB_IT_SYMBOL ) ); \
\
XML_Set##_name_ ( hb_expat->parser, hb_expat->pVar[ _VAR_b##_name_ ] ? hb_expat_##_name_ : NULL ); \
\
@@ -854,8 +854,8 @@ HB_FUNC( XML_SETELEMENTHANDLER )
{
PHB_EXPAT hb_expat = PHB_EXPAT_par( 1 );
hb_expat_setvar( hb_expat, _VAR_bStartElementHandler, hb_param( 2, HB_IT_BLOCK ) );
hb_expat_setvar( hb_expat, _VAR_bEndElementHandler, hb_param( 3, HB_IT_BLOCK ) );
hb_expat_setvar( hb_expat, _VAR_bStartElementHandler, hb_param( 2, HB_IT_BLOCK | HB_IT_SYMBOL ) );
hb_expat_setvar( hb_expat, _VAR_bEndElementHandler, hb_param( 3, HB_IT_BLOCK | HB_IT_SYMBOL ) );
XML_SetElementHandler( hb_expat->parser,
hb_expat->pVar[ _VAR_bStartElementHandler ] ? hb_expat_StartElementHandler : NULL,
@@ -873,8 +873,8 @@ HB_FUNC( XML_SETCDATASECTIONHANDLER )
{
PHB_EXPAT hb_expat = PHB_EXPAT_par( 1 );
hb_expat_setvar( hb_expat, _VAR_bStartCdataSectionHandler, hb_param( 2, HB_IT_BLOCK ) );
hb_expat_setvar( hb_expat, _VAR_bEndCdataSectionHandler, hb_param( 3, HB_IT_BLOCK ) );
hb_expat_setvar( hb_expat, _VAR_bStartCdataSectionHandler, hb_param( 2, HB_IT_BLOCK | HB_IT_SYMBOL ) );
hb_expat_setvar( hb_expat, _VAR_bEndCdataSectionHandler, hb_param( 3, HB_IT_BLOCK | HB_IT_SYMBOL ) );
XML_SetCdataSectionHandler( hb_expat->parser,
hb_expat->pVar[ _VAR_bStartCdataSectionHandler ] ? hb_expat_StartCdataSectionHandler : NULL,
@@ -892,8 +892,8 @@ HB_FUNC( XML_SETNAMESPACEDECLHANDLER )
{
PHB_EXPAT hb_expat = PHB_EXPAT_par( 1 );
hb_expat_setvar( hb_expat, _VAR_bStartNamespaceDeclHandler, hb_param( 2, HB_IT_BLOCK ) );
hb_expat_setvar( hb_expat, _VAR_bEndNamespaceDeclHandler, hb_param( 3, HB_IT_BLOCK ) );
hb_expat_setvar( hb_expat, _VAR_bStartNamespaceDeclHandler, hb_param( 2, HB_IT_BLOCK | HB_IT_SYMBOL ) );
hb_expat_setvar( hb_expat, _VAR_bEndNamespaceDeclHandler, hb_param( 3, HB_IT_BLOCK | HB_IT_SYMBOL ) );
XML_SetNamespaceDeclHandler( hb_expat->parser,
hb_expat->pVar[ _VAR_bStartNamespaceDeclHandler ] ? hb_expat_StartNamespaceDeclHandler : NULL,
@@ -911,7 +911,7 @@ HB_FUNC( XML_SETUNKNOWNENCODINGHANDLER )
{
PHB_EXPAT hb_expat = PHB_EXPAT_par( 1 );
hb_expat_setvar( hb_expat, _VAR_bUnknownEncodingHandler, hb_param( 2, HB_IT_BLOCK ) );
hb_expat_setvar( hb_expat, _VAR_bUnknownEncodingHandler, hb_param( 2, HB_IT_BLOCK | HB_IT_SYMBOL ) );
hb_expat_setvar( hb_expat, _VAR_xEncodingHandlerData, hb_param( 3, HB_IT_ANY ) );
XML_SetUnknownEncodingHandler( hb_expat->parser,

View File

@@ -13,7 +13,7 @@ PROCEDURE main()
IF hb_fileExists( 'rem.xml' )
xml := simplexml_load_file( 'rem.xml' )
ELSE
RETURN -1
RETURN
ENDIF
IF ! s_mxml_error
@@ -27,6 +27,8 @@ PROCEDURE main()
IF s_mxml_error
OutErr( "hbmxml:", s_mxml_error_msg, hb_eol() )
ELSE
OutStd( asXML( xml ), hb_eol() )
ENDIF
ENDIF
@@ -56,7 +58,7 @@ STATIC FUNCTION asXML( xml )
subnode := mxmlGetFirstChild( node )
DO WHILE ! Empty( subnode := mxmlGetNextSibling( subnode ) )
IF mxmlGetType( subnode ) == MXML_ELEMENT
IF mxmlGetType( subnode ) == MXML_ELEMENT
IF mxmlGetElement( subnode ) == "body"
c := mxmlGetOpaque( subnode )
ELSE
@@ -64,7 +66,7 @@ STATIC FUNCTION asXML( xml )
ENDIF
cText += ( c + " " )
ENDIF
ENDDO
ENDDO
RETURN cText
@@ -74,7 +76,7 @@ FUNCTION type_cb( node )
LOCAL cType
/* You can lookup attributes and/or use the element name, hierarchy, etc... */
IF Empty( cType := mxmlElementGetAttr( node, "type" ) )
cType := mxmlGetElement( node )
ENDIF

View File

@@ -5,17 +5,19 @@
#include "hbmxml.ch"
#include "hbinkey.ch"
STATIC event_counts
STATIC s_event_counts
FUNCTION main( cFile )
LOCAL tree
LOCAL node, tmpnode
LOCAL index
LOCAL nType, nLen, nFile
LOCAL nType
LOCAL cBuffer
LOCAL whitespace := 1
LOCAL i
OutStd( hb_mxmlVersion(), hb_eol() )
mxmlSetErrorCallback( @my_mxmlError() )
@@ -413,11 +415,11 @@ FUNCTION main( cFile )
OutStd( cBuffer + hb_eol() )
mxmlDelete( tree )
cBuffer := mxmlSaveAllocString( node, 0 )
cBuffer := mxmlSaveAllocString( node, 0 )
IF Len( cBuffer ) > 0
hb_memoWrit( "test3.xml", cBuffer )
ENDIF
IF mxmlSaveFile( node, "test4.xml" ) < 0
OutErr( "ERROR: Can't execute mxmlSaveFile()!", hb_eol() )
ENDIF
@@ -430,53 +432,53 @@ FUNCTION main( cFile )
IF mxmlSetUserData( node, whitespace ) > -1
OutStd( mxmlGetUserData( node ), hb_eol() )
ENDIF
mxmlDelete( node )
/*
* Test SAX methods...
*/
event_counts := Array( 6 ) ; AFill( event_counts, 0 )
s_event_counts := Array( 6 ) ; AFill( s_event_counts, 0 )
/* mxmlSAXLoadString( NIL, hb_memoRead( "test.xml" ), @type_cb(), @sax_cb() ) */
mxmlSAXLoadFile( NIL, "test.xml", @type_cb(), @sax_cb() )
IF event_counts[ MXML_SAX_CDATA ] != 1
IF s_event_counts[ MXML_SAX_CDATA ] != 1
OutErr( hb_strFormat( e"MXML_SAX_CDATA seen %d times, expected 1 times!\n", ;
event_counts[ MXML_SAX_CDATA ] ) )
s_event_counts[ MXML_SAX_CDATA ] ) )
RETURN -6
ENDIF
ENDIF
IF event_counts[ MXML_SAX_COMMENT ] != 1
IF s_event_counts[ MXML_SAX_COMMENT ] != 1
OutErr( hb_strFormat( e"MXML_SAX_COMMENT seen %d times, expected 1 times!\n", ;
event_counts[ MXML_SAX_COMMENT ] ) )
s_event_counts[ MXML_SAX_COMMENT ] ) )
RETURN -6
ENDIF
ENDIF
IF event_counts[ MXML_SAX_DATA ] != 61
IF s_event_counts[ MXML_SAX_DATA ] != 61
OutErr( hb_strFormat( e"MXML_SAX_DATA seen %d times, expected 61 times!\n", ;
event_counts[ MXML_SAX_DATA ] ) )
s_event_counts[ MXML_SAX_DATA ] ) )
RETURN -6
ENDIF
ENDIF
IF event_counts[ MXML_SAX_DIRECTIVE ] != 1
IF s_event_counts[ MXML_SAX_DIRECTIVE ] != 1
OutErr( hb_strFormat( e"MXML_SAX_DIRECTIVE seen %d times, expected 1 times!\n", ;
event_counts[ MXML_SAX_DIRECTIVE ] ) )
s_event_counts[ MXML_SAX_DIRECTIVE ] ) )
RETURN -6
ENDIF
ENDIF
IF event_counts[ MXML_SAX_ELEMENT_CLOSE ] != 20
IF s_event_counts[ MXML_SAX_ELEMENT_CLOSE ] != 20
OutErr( hb_strFormat( e"MXML_SAX_ELEMENT_CLOSE seen %d times, expected 20 times!\n", ;
event_counts[ MXML_SAX_ELEMENT_CLOSE ] ) )
s_event_counts[ MXML_SAX_ELEMENT_CLOSE ] ) )
RETURN -6
ENDIF
ENDIF
IF event_counts[ MXML_SAX_ELEMENT_OPEN ] != 20
IF s_event_counts[ MXML_SAX_ELEMENT_OPEN ] != 20
OutErr( hb_strFormat( e"MXML_SAX_ELEMENT_OPEN seen %d times, expected 20 times!\n", ;
event_counts[ MXML_SAX_ELEMENT_OPEN ] ) )
s_event_counts[ MXML_SAX_ELEMENT_OPEN ] ) )
RETURN -6
ENDIF
ENDIF
OutStd( "--- The End! ---", hb_eol() )
@@ -502,7 +504,7 @@ FUNCTION type_cb( node )
LOCAL cType
/* You can lookup attributes and/or use the element name, hierarchy, etc... */
IF Empty( cType := mxmlElementGetAttr( node, "type" ) )
cType := mxmlGetElement( node )
ENDIF
@@ -530,7 +532,7 @@ FUNCTION type_cb( node )
/* mxmlSaveString */
FUNCTION whitespace_cb( node, where )
FUNCTION whitespace_cb( node, where )
LOCAL parent /* Parent node */
LOCAL nLevel := -1 /* Indentation level */
@@ -547,8 +549,8 @@ FUNCTION whitespace_cb( node, where )
SWITCH Lower( name )
CASE "html"
CASE "head"
CASE "body"
CASE "pre"
CASE "body"
CASE "pre"
CASE "p"
CASE "h1"
CASE "h2"
@@ -571,7 +573,7 @@ FUNCTION whitespace_cb( node, where )
ENDIF
EXIT
CASE "dd"
CASE "dd"
CASE "dt"
CASE "li"
/* Put a tab before <li>'s, <dd>'s, and <dt>'s, and a newline after them... */
@@ -584,7 +586,7 @@ FUNCTION whitespace_cb( node, where )
ENDSWITCH
IF Left( name, 4 ) == "?xml"
IF where == MXML_WS_AFTER_OPEN
IF where == MXML_WS_AFTER_OPEN
RETURN hb_eol()
ELSE
RETURN NIL
@@ -600,9 +602,9 @@ FUNCTION whitespace_cb( node, where )
parent := mxmlGetParent( parent )
ENDDO
IF nLevel > 8
IF nLevel > 8
nLevel := 8
ELSEIF nLevel < 0
ELSEIF nLevel < 0
nLevel := 0
ENDIF
@@ -625,8 +627,9 @@ PROCEDURE sax_cb( node, sax_event, user_data )
/* mxmlRetain( node ) */
HB_SYMBOL_UNUSED( node )
HB_SYMBOL_UNUSED( user_data )
event_counts[ sax_event ] += 1
s_event_counts[ sax_event ] += 1
RETURN

View File

@@ -112,12 +112,11 @@ static void hb_PEM_read_bio( PEM_READ_BIO * func )
if( bio )
{
PHB_ITEM pPassBlock = NULL;
PHB_ITEM pPassCallback = hb_param( 2, HB_IT_BLOCK | HB_IT_SYMBOL );
if( HB_ISBLOCK( 2 ) )
if( pPassCallback )
{
pPassBlock = hb_itemNew( hb_param( 2, HB_IT_BLOCK ) );
hb_retptr( ( * func )( bio, NULL, hb_ssl_pem_password_cb, pPassBlock ) );
hb_retptr( ( * func )( bio, NULL, hb_ssl_pem_password_cb, pPassCallback ) );
}
else if( HB_ISCHAR( 2 ) )
{
@@ -125,9 +124,6 @@ static void hb_PEM_read_bio( PEM_READ_BIO * func )
hb_retptr( ( * func )( bio, NULL, NULL, ( void * ) hb_parc( 2 ) ) );
}
if( pPassBlock )
hb_itemRelease( pPassBlock );
if( ! HB_ISPOINTER( 1 ) )
BIO_free( bio );
}

View File

@@ -1511,10 +1511,12 @@ HB_FUNC( SSL_SET_MSG_CALLBACK )
if( ssl )
{
if( HB_ISBLOCK( 2 ) )
PHB_ITEM pCallback = hb_param( 2, HB_IT_BLOCK | HB_IT_SYMBOL );
if( pCallback )
{
PHB_ITEM pPassBlock = hb_itemNew( hb_param( 2, HB_IT_BLOCK ) );
SSL_set_msg_callback_arg( ssl, pPassBlock );
PHB_ITEM pPassCallback = hb_itemNew( pCallback );
SSL_set_msg_callback_arg( ssl, pPassCallback );
SSL_set_msg_callback( ssl, hb_ssl_msg_callback );
}
else

View File

@@ -21,11 +21,13 @@ PROCEDURE Main()
bioe := BIO_new_fd( 1, HB_BIO_NOCLOSE )
? PEM_READ_BIO_RSAPRIVATEKEY( "privkey.pem", {| lWrite | QOut( "Callback", lWrite, hb_eol() ), "test" } )
? PEM_READ_BIO_RSAPRIVATEKEY( "privkey.pem", {| lWrite | QOut( "Callback (block)", lWrite, hb_eol() ), "test" } )
? ; ERR_print_errors( bioe )
? PEM_READ_BIO_RSAPRIVATEKEY( "privkey.pem", @cb_function() )
? ; ERR_print_errors( bioe )
? PEM_READ_BIO_RSAPRIVATEKEY( "privkey.pem", "test" )
? ; ERR_print_errors( bioe )
? PEM_READ_BIO_RSAPUBLICKEY( "privkey.pem", {| lWrite | QOut( "Callback", lWrite, hb_eol() ), "test" } )
? PEM_READ_BIO_RSAPUBLICKEY( "privkey.pem", {| lWrite | QOut( "Callback (block)", lWrite, hb_eol() ), "test" } )
? ; ERR_print_errors( bioe )
? PEM_READ_BIO_RSAPUBLICKEY( "privkey.pem", "test" )
? ; ERR_print_errors( bioe )
@@ -64,3 +66,7 @@ ENDTEXT
BIO_free( bioe )
RETURN
STATIC FUNCTION cb_function( lWrite )
QOut( "Callback (func)", lWrite, hb_eol() )
RETURN "test"