From 9f86f649abd21926b18ada4dafd39e5f85ba5ad1 Mon Sep 17 00:00:00 2001 From: Viktor Szakats Date: Sat, 7 Jun 2008 18:43:25 +0000 Subject: [PATCH] 2008-06-07 20:41 UTC+0100 Viktor Szakats (harbour.01 syenar hu) * contrib/hbodbc/make_vc.bat ! Removed .dll -> .lib conversion for MSVC, since the .lib is provided by the MS SDK anyway. ; [TOMERGE RC1] * contrib/hbcurl/hbcurl.c * contrib/hbcurl/hbcurl.ch * contrib/hbcurl/tests/ftp_uldl.prg ! Cleanup the rare case when curl_easy_init() returns NULL. Functions always return the same type, even in case libcurl failed to initialize. + Returns value for above cases is now HB_CURLE_ERROR (== -1). ! CURL_*() passed pointers now are also checked for the pointer's type, and RTE is thrown if they are not HBCURL ones. So for example in the very rare case that any hbcurl functions would get passed a GC pointer returned by another API, an argument error would be thrown now. ! CURL_ESCAPE()/CURL_UNESCAPE() fixed picked parameter ordinal. + CURL_ESCAPE()/CURL_UNESCAPE() added parameter checking. ; [TOMERGE RC1] * contrib/rddads/adsmgmnt.c * Minor formatting. --- harbour/ChangeLog | 25 + harbour/contrib/hbcurl/hbcurl.c | 632 +++++++++++----------- harbour/contrib/hbcurl/hbcurl.ch | 1 + harbour/contrib/hbcurl/tests/ftp_uldl.prg | 10 +- harbour/contrib/hbodbc/make_vc.bat | 18 - harbour/contrib/rddads/adsmgmnt.c | 28 +- 6 files changed, 359 insertions(+), 355 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 811667bad2..d7489731d5 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,31 @@ 2008-12-31 13:59 UTC+0100 Foo Bar */ +2008-06-07 20:41 UTC+0100 Viktor Szakats (harbour.01 syenar hu) + * contrib/hbodbc/make_vc.bat + ! Removed .dll -> .lib conversion for MSVC, + since the .lib is provided by the MS SDK anyway. + ; [TOMERGE RC1] + + * contrib/hbcurl/hbcurl.c + * contrib/hbcurl/hbcurl.ch + * contrib/hbcurl/tests/ftp_uldl.prg + ! Cleanup the rare case when curl_easy_init() returns NULL. + Functions always return the same type, even in case libcurl + failed to initialize. + + Returns value for above cases is now HB_CURLE_ERROR (== -1). + ! CURL_*() passed pointers now are also checked for the pointer's + type, and RTE is thrown if they are not HBCURL ones. So for + example in the very rare case that any hbcurl functions would + get passed a GC pointer returned by another API, an argument + error would be thrown now. + ! CURL_ESCAPE()/CURL_UNESCAPE() fixed picked parameter ordinal. + + CURL_ESCAPE()/CURL_UNESCAPE() added parameter checking. + ; [TOMERGE RC1] + + * contrib/rddads/adsmgmnt.c + * Minor formatting. + 2008-06-07 13:26 UTC+0100 Viktor Szakats (harbour.01 syenar hu) * contrib/hbmisc/common.mak * contrib/hbmisc/Makefile diff --git a/harbour/contrib/hbcurl/hbcurl.c b/harbour/contrib/hbcurl/hbcurl.c index 3571b19cac..c8611b7d52 100644 --- a/harbour/contrib/hbcurl/hbcurl.c +++ b/harbour/contrib/hbcurl/hbcurl.c @@ -52,9 +52,9 @@ * */ -/* NOTE: Harbour requires libcurl 7.17.0 or upper. - This was the version where curl_easy_setopt() started to - make copies of passed strings, which we currently require. +/* NOTE: Harbour requires libcurl 7.17.0 or upper. + This was the version where curl_easy_setopt() started to + make copies of passed strings, which we currently require. [vszakats] */ #include "curl/curl.h" @@ -472,10 +472,12 @@ static void PHB_CURL_ret( PHB_CURL from ) * ph = ( void * ) PHB_CURL_create( from ); - if( * ph ) - hb_retptrGC( ph ); - else - hb_retptr( NULL ); + hb_retptrGC( ph ); +} + +static void ** PHB_CURL_is( int iParam ) +{ + return hb_parptrGC( PHB_CURL_release, iParam ); } static PHB_CURL PHB_CURL_par( int iParam ) @@ -495,7 +497,7 @@ HB_FUNC( CURL_EASY_INIT ) HB_FUNC( CURL_EASY_DUPLICATE ) { - if( ISPOINTER( 1 ) ) + if( PHB_CURL_is( 1 ) ) PHB_CURL_ret( PHB_CURL_par( 1 ) ); else hb_errRT_BASE( EG_ARG, 2010, NULL, "CURL_EASY_DUPLICATE", HB_ERR_ARGS_BASEPARAMS ); @@ -503,15 +505,15 @@ HB_FUNC( CURL_EASY_DUPLICATE ) HB_FUNC( CURL_EASY_CLEANUP ) { - if( ISPOINTER( 1 ) ) + if( PHB_CURL_is( 1 ) ) { void ** ph = ( void ** ) hb_parptrGC( PHB_CURL_release, 1 ); - + if( ph && * ph ) { /* Destroy the object */ PHB_CURL_free( ( PHB_CURL ) * ph, TRUE ); - + /* set pointer to NULL to avoid multiple freeing */ * ph = NULL; } @@ -524,10 +526,10 @@ HB_FUNC( CURL_EASY_CLEANUP ) HB_FUNC( CURL_EASY_RESET ) { - if( ISPOINTER( 1 ) ) + if( PHB_CURL_is( 1 ) ) { PHB_CURL hb_curl = PHB_CURL_par( 1 ); - + if( hb_curl ) PHB_CURL_free( hb_curl, FALSE ); } @@ -541,12 +543,11 @@ HB_FUNC( CURL_EASY_RESET ) HB_FUNC( CURL_EASY_PAUSE ) { - if( ISPOINTER( 1 ) ) + if( PHB_CURL_is( 1 ) ) { PHB_CURL hb_curl = PHB_CURL_par( 1 ); - - if( hb_curl ) - hb_retnl( ( long ) curl_easy_pause( hb_curl->curl, hb_parni( 2 ) ) ); + + hb_retnl( hb_curl ? ( long ) curl_easy_pause( hb_curl->curl, hb_parni( 2 ) ) : HB_CURLE_ERROR ); } else hb_errRT_BASE( EG_ARG, 2010, NULL, "CURL_EASY_PAUSE", HB_ERR_ARGS_BASEPARAMS ); @@ -556,12 +557,11 @@ HB_FUNC( CURL_EASY_PAUSE ) HB_FUNC( CURL_EASY_PERFORM ) { - if( ISPOINTER( 1 ) ) + if( PHB_CURL_is( 1 ) ) { PHB_CURL hb_curl = PHB_CURL_par( 1 ); - - if( hb_curl ) - hb_retnl( ( long ) curl_easy_perform( hb_curl->curl ) ); + + hb_retnl( hb_curl ? ( long ) curl_easy_perform( hb_curl->curl ) : HB_CURLE_ERROR ); } else hb_errRT_BASE( EG_ARG, 2010, NULL, "CURL_EASY_PERFORM", HB_ERR_ARGS_BASEPARAMS ); @@ -572,18 +572,21 @@ HB_FUNC( CURL_EASY_PERFORM ) /* NOTE: curl_easy_send( curl, cBuffer, @nSentBytes ) -> nResult */ HB_FUNC( CURL_EASY_SEND ) { - if( ISPOINTER( 1 ) ) + if( PHB_CURL_is( 1 ) ) { PHB_CURL hb_curl = PHB_CURL_par( 1 ); - + CURLcode res = ( CURLcode ) HB_CURLE_ERROR; + if( hb_curl ) { size_t size = 0; - - hb_retnl( ( long ) curl_easy_send( hb_curl->curl, ( void * ) hb_parcx( 2 ), ( size_t ) hb_parclen( 2 ), &size ) ); - + + res = curl_easy_send( hb_curl->curl, ( void * ) hb_parcx( 2 ), ( size_t ) hb_parclen( 2 ), &size ); + hb_stornl( size, 3 ); } + + hb_retnl( ( long ) res ); } else hb_errRT_BASE( EG_ARG, 2010, NULL, "CURL_EASY_SEND", HB_ERR_ARGS_BASEPARAMS ); @@ -592,25 +595,28 @@ HB_FUNC( CURL_EASY_SEND ) /* NOTE: curl_easy_recv( curl, @cBuffer ) -> nResult */ HB_FUNC( CURL_EASY_RECV ) { - if( ISPOINTER( 1 ) ) + if( PHB_CURL_is( 1 ) ) { PHB_CURL hb_curl = PHB_CURL_par( 1 ); - + CURLcode res = ( CURLcode ) HB_CURLE_ERROR; + if( hb_curl ) { size_t size = ( size_t ) hb_parclen( 2 ); void * buffer; - + if( size < 1024 ) size = 1024; - + buffer = hb_xgrab( size ); - - hb_retnl( ( long ) curl_easy_recv( hb_curl->curl, buffer, size, &size ) ); - + + res = curl_easy_recv( hb_curl->curl, buffer, size, &size ); + if( ! hb_storclen_buffer( ( char * ) buffer, size, 2 ) ) hb_free( buffer ); } + + hb_retnl( ( long ) res ); } else hb_errRT_BASE( EG_ARG, 2010, NULL, "CURL_EASY_RECV", HB_ERR_ARGS_BASEPARAMS ); @@ -620,17 +626,17 @@ HB_FUNC( CURL_EASY_RECV ) HB_FUNC( CURL_EASY_SETOPT ) { - if( ISPOINTER( 1 ) && ISNUM( 2 ) ) + if( PHB_CURL_is( 1 ) && ISNUM( 2 ) ) { PHB_CURL hb_curl = PHB_CURL_par( 1 ); - CURLcode res = ( CURLcode ) -1; - + CURLcode res = ( CURLcode ) HB_CURLE_ERROR; + if( hb_curl ) { switch( hb_parni( 2 ) ) { /* Behavior */ - + case HB_CURLOPT_VERBOSE: res = curl_easy_setopt( hb_curl->curl, CURLOPT_VERBOSE, HB_CURL_OPT_BOOL( 3 ) ); break; @@ -643,9 +649,9 @@ HB_FUNC( CURL_EASY_SETOPT ) case HB_CURLOPT_NOSIGNAL: res = curl_easy_setopt( hb_curl->curl, CURLOPT_NOSIGNAL, HB_CURL_OPT_BOOL( 3 ) ); break; - + /* Callback */ - + /* These are hidden on the Harbour level: */ /* HB_CURLOPT_WRITEFUNCTION */ /* HB_CURLOPT_WRITEDATA */ @@ -672,18 +678,18 @@ HB_FUNC( CURL_EASY_SETOPT ) /* HB_CURLOPT_CONV_TO_NETWORK_FUNCTION */ /* HB_CURLOPT_CONV_FROM_NETWORK_FUNCTION */ /* HB_CURLOPT_CONV_FROM_UTF8_FUNCTION */ - + /* Error */ - + /* HB_CURLOPT_ERRORBUFFER */ /* HB_CURLOPT_STDERR */ - + case HB_CURLOPT_FAILONERROR: res = curl_easy_setopt( hb_curl->curl, CURLOPT_FAILONERROR, HB_CURL_OPT_BOOL( 3 ) ); break; - + /* Network */ - + /* This is the only option that must be set before curl_easy_perform() is called. */ case HB_CURLOPT_URL: res = curl_easy_setopt( hb_curl->curl, CURLOPT_URL, hb_parc( 3 ) ); @@ -700,11 +706,11 @@ HB_FUNC( CURL_EASY_SETOPT ) case HB_CURLOPT_HTTPPROXYTUNNEL: res = curl_easy_setopt( hb_curl->curl, CURLOPT_HTTPPROXYTUNNEL, HB_CURL_OPT_BOOL( 3 ) ); break; -/* +/* case HB_CURLOPT_SOCKS5_RESOLVE_LOCAL: res = curl_easy_setopt( hb_curl->curl, CURLOPT_SOCKS5_RESOLVE_LOCAL, HB_CURL_OPT_BOOL( 3 ) ); break; -*/ +*/ case HB_CURLOPT_INTERFACE: res = curl_easy_setopt( hb_curl->curl, CURLOPT_INTERFACE, hb_parc( 3 ) ); break; @@ -729,9 +735,9 @@ HB_FUNC( CURL_EASY_SETOPT ) case HB_CURLOPT_TCP_NODELAY: res = curl_easy_setopt( hb_curl->curl, CURLOPT_TCP_NODELAY, HB_CURL_OPT_BOOL( 3 ) ); break; - + /* Names and passwords options (Authentication) */ - + case HB_CURLOPT_NETRC: res = curl_easy_setopt( hb_curl->curl, CURLOPT_NETRC, hb_parnl( 3 ) ); break; @@ -750,9 +756,9 @@ HB_FUNC( CURL_EASY_SETOPT ) case HB_CURLOPT_PROXYAUTH: res = curl_easy_setopt( hb_curl->curl, CURLOPT_PROXYAUTH, hb_parnl( 3 ) ); break; - + /* HTTP options */ - + case HB_CURLOPT_AUTOREFERER: res = curl_easy_setopt( hb_curl->curl, CURLOPT_AUTOREFERER, HB_CURL_OPT_BOOL( 3 ) ); break; @@ -790,23 +796,23 @@ HB_FUNC( CURL_EASY_SETOPT ) case HB_CURLOPT_HTTPPOST: { PHB_ITEM pArray = hb_param( 3, HB_IT_ARRAY ); - + if( pArray ) { ULONG ulPos; ULONG ulArrayLen = hb_arrayLen( pArray ); - + for( ulPos = 0; ulPos < ulArrayLen; ulPos++ ) { PHB_ITEM pSubArray = hb_arrayGetItemPtr( pArray, ulPos + 1 ); - + curl_formadd( &hb_curl->pHTTPPOST_First, &hb_curl->pHTTPPOST_Last, CURLFORM_COPYNAME, hb_arrayGetCPtr( pSubArray, 1 ), CURLFORM_FILE, hb_arrayGetCPtr( pSubArray, 2 ), CURLFORM_END ); } - + res = curl_easy_setopt( hb_curl->curl, CURLOPT_HTTPPOST, hb_curl->pHTTPPOST_First ); } } @@ -820,18 +826,18 @@ HB_FUNC( CURL_EASY_SETOPT ) case HB_CURLOPT_HTTPHEADER: { PHB_ITEM pArray = hb_param( 3, HB_IT_ARRAY ); - + curl_easy_setopt( hb_curl->curl, CURLOPT_HTTPHEADER, NULL ); hb_curl_slist_free( &hb_curl->pHTTPHEADER ); - + if( pArray ) { ULONG ulPos; ULONG ulArrayLen = hb_arrayLen( pArray ); - + for( ulPos = 0; ulPos < ulArrayLen; ulPos++ ) hb_curl->pHTTPHEADER = curl_slist_append( hb_curl->pHTTPHEADER, hb_arrayGetCPtr( pArray, ulPos + 1 ) ); - + res = curl_easy_setopt( hb_curl->curl, CURLOPT_HTTPHEADER, hb_curl->pHTTPHEADER ); } } @@ -839,18 +845,18 @@ HB_FUNC( CURL_EASY_SETOPT ) case HB_CURLOPT_HTTP200ALIASES: { PHB_ITEM pArray = hb_param( 3, HB_IT_ARRAY ); - + curl_easy_setopt( hb_curl->curl, CURLOPT_HTTP200ALIASES, NULL ); hb_curl_slist_free( &hb_curl->pHTTP200ALIASES ); - + if( pArray ) { ULONG ulPos; ULONG ulArrayLen = hb_arrayLen( pArray ); - + for( ulPos = 0; ulPos < ulArrayLen; ulPos++ ) hb_curl->pHTTP200ALIASES = curl_slist_append( hb_curl->pHTTP200ALIASES, hb_arrayGetCPtr( pArray, ulPos + 1 ) ); - + res = curl_easy_setopt( hb_curl->curl, CURLOPT_HTTP200ALIASES, hb_curl->pHTTP200ALIASES ); } } @@ -885,27 +891,27 @@ HB_FUNC( CURL_EASY_SETOPT ) case HB_CURLOPT_HTTP_TRANSFER_DECODING: res = curl_easy_setopt( hb_curl->curl, CURLOPT_HTTP_TRANSFER_DECODING, HB_CURL_OPT_BOOL( 3 ) ); break; - + /* FTP options */ - + case HB_CURLOPT_FTPPORT: res = curl_easy_setopt( hb_curl->curl, CURLOPT_FTPPORT, hb_parc( 3 ) ); break; case HB_CURLOPT_QUOTE: { PHB_ITEM pArray = hb_param( 3, HB_IT_ARRAY ); - + curl_easy_setopt( hb_curl->curl, CURLOPT_QUOTE, NULL ); hb_curl_slist_free( &hb_curl->pQUOTE ); - + if( pArray ) { ULONG ulPos; ULONG ulArrayLen = hb_arrayLen( pArray ); - + for( ulPos = 0; ulPos < ulArrayLen; ulPos++ ) hb_curl->pQUOTE = curl_slist_append( hb_curl->pQUOTE, hb_arrayGetCPtr( pArray, ulPos + 1 ) ); - + res = curl_easy_setopt( hb_curl->curl, CURLOPT_QUOTE, hb_curl->pQUOTE ); } } @@ -913,18 +919,18 @@ HB_FUNC( CURL_EASY_SETOPT ) case HB_CURLOPT_POSTQUOTE: { PHB_ITEM pArray = hb_param( 3, HB_IT_ARRAY ); - + curl_easy_setopt( hb_curl->curl, CURLOPT_POSTQUOTE, NULL ); hb_curl_slist_free( &hb_curl->pPOSTQUOTE ); - + if( pArray ) { ULONG ulPos; ULONG ulArrayLen = hb_arrayLen( pArray ); - + for( ulPos = 0; ulPos < ulArrayLen; ulPos++ ) hb_curl->pPOSTQUOTE = curl_slist_append( hb_curl->pPOSTQUOTE, hb_arrayGetCPtr( pArray, ulPos + 1 ) ); - + res = curl_easy_setopt( hb_curl->curl, CURLOPT_POSTQUOTE, hb_curl->pPOSTQUOTE ); } } @@ -932,18 +938,18 @@ HB_FUNC( CURL_EASY_SETOPT ) case HB_CURLOPT_PREQUOTE: { PHB_ITEM pArray = hb_param( 3, HB_IT_ARRAY ); - + curl_easy_setopt( hb_curl->curl, CURLOPT_PREQUOTE, NULL ); hb_curl_slist_free( &hb_curl->pPREQUOTE ); - + if( pArray ) { ULONG ulPos; ULONG ulArrayLen = hb_arrayLen( pArray ); - + for( ulPos = 0; ulPos < ulArrayLen; ulPos++ ) hb_curl->pQUOTE = curl_slist_append( hb_curl->pPREQUOTE, hb_arrayGetCPtr( pArray, ulPos + 1 ) ); - + res = curl_easy_setopt( hb_curl->curl, CURLOPT_PREQUOTE, hb_curl->pPREQUOTE ); } } @@ -989,9 +995,9 @@ HB_FUNC( CURL_EASY_SETOPT ) case HB_CURLOPT_FTP_FILEMETHOD: res = curl_easy_setopt( hb_curl->curl, CURLOPT_FTP_FILEMETHOD, hb_parnl( 3 ) ); break; - + /* Protocol */ - + case HB_CURLOPT_TRANSFERTEXT: res = curl_easy_setopt( hb_curl->curl, CURLOPT_TRANSFERTEXT, HB_CURL_OPT_BOOL( 3 ) ); break; @@ -1043,9 +1049,9 @@ HB_FUNC( CURL_EASY_SETOPT ) case HB_CURLOPT_TIMEVALUE: res = curl_easy_setopt( hb_curl->curl, CURLOPT_TIMEVALUE, hb_parnl( 3 ) ); break; - + /* Connection */ - + case HB_CURLOPT_TIMEOUT: res = curl_easy_setopt( hb_curl->curl, CURLOPT_TIMEOUT, hb_parnl( 3 ) ); break; @@ -1088,9 +1094,9 @@ HB_FUNC( CURL_EASY_SETOPT ) case HB_CURLOPT_CONNECT_ONLY: res = curl_easy_setopt( hb_curl->curl, CURLOPT_CONNECT_ONLY, HB_CURL_OPT_BOOL( 3 ) ); break; - + /* SSL and Security */ - + case HB_CURLOPT_SSLCERT: res = curl_easy_setopt( hb_curl->curl, CURLOPT_SSLCERT, hb_parc( 3 ) ); break; @@ -1142,9 +1148,9 @@ HB_FUNC( CURL_EASY_SETOPT ) case HB_CURLOPT_KRBLEVEL: /* HB_CURLOPT_KRB4LEVEL */ res = curl_easy_setopt( hb_curl->curl, CURLOPT_KRBLEVEL, hb_parc( 3 ) ); break; - + /* SSH options */ - + case HB_CURLOPT_SSH_AUTH_TYPES: res = curl_easy_setopt( hb_curl->curl, CURLOPT_SSH_AUTH_TYPES, hb_parnl( 3 ) ); break; @@ -1157,160 +1163,160 @@ HB_FUNC( CURL_EASY_SETOPT ) case HB_CURLOPT_SSH_PRIVATE_KEYFILE: res = curl_easy_setopt( hb_curl->curl, CURLOPT_SSH_PRIVATE_KEYFILE, hb_parc( 3 ) ); break; - + /* Other options */ - + case HB_CURLOPT_PRIVATE: res = curl_easy_setopt( hb_curl->curl, CURLOPT_PRIVATE, hb_parptr( 3 ) ); break; - + /* HB_CURLOPT_SHARE */ - + case HB_CURLOPT_NEW_FILE_PERMS: res = curl_easy_setopt( hb_curl->curl, CURLOPT_NEW_FILE_PERMS, hb_parnl( 3 ) ); break; case HB_CURLOPT_NEW_DIRECTORY_PERMS: res = curl_easy_setopt( hb_curl->curl, CURLOPT_NEW_DIRECTORY_PERMS, hb_parnl( 3 ) ); break; - + /* Telnet options */ - + case HB_CURLOPT_TELNETOPTIONS: { PHB_ITEM pArray = hb_param( 3, HB_IT_ARRAY ); - + curl_easy_setopt( hb_curl->curl, CURLOPT_TELNETOPTIONS, NULL ); hb_curl_slist_free( &hb_curl->pTELNETOPTIONS ); - + if( pArray ) { ULONG ulPos; ULONG ulArrayLen = hb_arrayLen( pArray ); - + for( ulPos = 0; ulPos < ulArrayLen; ulPos++ ) hb_curl->pTELNETOPTIONS = curl_slist_append( hb_curl->pTELNETOPTIONS, hb_arrayGetCPtr( pArray, ulPos + 1 ) ); - + res = curl_easy_setopt( hb_curl->curl, CURLOPT_TELNETOPTIONS, hb_curl->pTELNETOPTIONS ); } } break; - + /* Undocumented */ - + /* HB_CURLOPT_WRITEINFO */ - + /* Harbour specials */ - + case HB_CURLOPT_PROGRESSBLOCK: { PHB_ITEM pProgressBlock = hb_param( 3, HB_IT_BLOCK ); - + if( hb_curl->pProgressBlock ) { 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; } - + if( pProgressBlock ) { hb_curl->pProgressBlock = hb_itemNew( pProgressBlock ); - + curl_easy_setopt( hb_curl->curl, CURLOPT_PROGRESSFUNCTION, hb_curl_progress_callback ); res = curl_easy_setopt( hb_curl->curl, CURLOPT_PROGRESSDATA, ( void * ) hb_curl->pProgressBlock ); } } break; - + case HB_CURLOPT_UL_FILE_SETUP: { hb_curl_file_ul_free( hb_curl ); - + if( ISCHAR( 3 ) ) { hb_curl->ul_name = ( BYTE * ) hb_strdup( hb_parc( 3 ) ); hb_curl->ul_handle = FS_ERROR; - + curl_easy_setopt( hb_curl->curl, CURLOPT_READFUNCTION, hb_curl_read_file_callback ); res = curl_easy_setopt( hb_curl->curl, CURLOPT_READDATA, ( void * ) hb_curl ); } } break; - + case HB_CURLOPT_UL_FILE_CLOSE: hb_curl_file_ul_free( hb_curl ); res = CURLE_OK; break; - + case HB_CURLOPT_DL_FILE_SETUP: { hb_curl_file_dl_free( hb_curl ); - + if( ISCHAR( 3 ) ) { hb_curl->dl_name = ( BYTE * ) hb_strdup( hb_parc( 3 ) ); hb_curl->dl_handle = FS_ERROR; - + curl_easy_setopt( hb_curl->curl, CURLOPT_WRITEFUNCTION, hb_curl_write_file_callback ); res = curl_easy_setopt( hb_curl->curl, CURLOPT_WRITEDATA, ( void * ) hb_curl ); } } break; - + case HB_CURLOPT_DL_FILE_CLOSE: hb_curl_file_dl_free( hb_curl ); res = CURLE_OK; break; - + case HB_CURLOPT_UL_BUFF_SETUP: { hb_curl_buff_ul_free( hb_curl ); - + if( ISCHAR( 3 ) ) { hb_curl->ul_pos = 0; hb_curl->ul_len = hb_parclen( 3 ); hb_curl->ul_ptr = ( BYTE * ) hb_xgrab( hb_curl->ul_len ); - + hb_xmemcpy( hb_curl->ul_ptr, hb_parc( 3 ), hb_curl->ul_len ); - + curl_easy_setopt( hb_curl->curl, CURLOPT_READFUNCTION, hb_curl_read_buff_callback ); res = curl_easy_setopt( hb_curl->curl, CURLOPT_READDATA, ( void * ) hb_curl ); } } break; - + case HB_CURLOPT_DL_BUFF_SETUP: { hb_curl_buff_dl_free( hb_curl ); - + hb_curl->dl_pos = 0; hb_curl->dl_len = ISNUM( 3 ) ? hb_parnl( 3 ) : HB_CURL_DL_BUFF_SIZE_INIT; hb_curl->dl_ptr = ( BYTE * ) hb_xgrab( hb_curl->dl_len ); - + curl_easy_setopt( hb_curl->curl, CURLOPT_WRITEFUNCTION, hb_curl_write_buff_callback ); res = curl_easy_setopt( hb_curl->curl, CURLOPT_WRITEDATA, ( void * ) hb_curl ); } break; - + case HB_CURLOPT_DL_BUFF_GET: hb_storclen( ( char * ) hb_curl->dl_ptr, hb_curl->dl_pos, 3 ); if( hb_curl->dl_ptr ) res = CURLE_OK; break; - + case HB_CURLOPT_UL_NULL_SETUP: hb_curl_file_ul_free( hb_curl ); hb_curl_buff_ul_free( hb_curl ); - + curl_easy_setopt( hb_curl->curl, CURLOPT_READFUNCTION, hb_curl_read_dummy_callback ); res = curl_easy_setopt( hb_curl->curl, CURLOPT_READDATA, ( void * ) hb_curl ); break; } } - + hb_retnl( ( long ) res ); } else @@ -1320,7 +1326,7 @@ HB_FUNC( CURL_EASY_SETOPT ) /* Harbour extension. */ HB_FUNC( CURL_EASY_DL_BUFF_GET ) { - if( ISPOINTER( 1 ) ) + if( PHB_CURL_is( 1 ) ) { PHB_CURL hb_curl = PHB_CURL_par( 1 ); @@ -1340,214 +1346,214 @@ HB_FUNC( CURL_EASY_DL_BUFF_GET ) #define HB_CURL_INFO_TYPE_DOUBLE 4 #define HB_CURL_INFO_TYPE_SLIST 5 +#define HB_CURL_EASY_GETINFO( hb_curl, n, p ) \ + ( ( hb_curl && hb_curl->curl ) ? curl_easy_getinfo( hb_curl->curl, n, p ) : ( CURLcode ) HB_CURLE_ERROR ) + /* NOTE: curl_easy_getinfo( curl, x, @nError ) -> xValue */ HB_FUNC( CURL_EASY_GETINFO ) { - if( ISPOINTER( 1 ) && ISNUM( 2 ) ) + if( PHB_CURL_is( 1 ) && ISNUM( 2 ) ) { PHB_CURL hb_curl = PHB_CURL_par( 1 ); - CURLcode res = ( CURLcode ) -1; - - if( hb_curl ) + CURLcode res = ( CURLcode ) HB_CURLE_ERROR; + + int type = HB_CURL_INFO_TYPE_INVALID; + + char * ret_string = NULL; + char * ret_ptr = NULL; + long ret_long = 0; + struct curl_slist * ret_slist = NULL; + double ret_double = 0.0; + + switch( hb_parni( 2 ) ) { - int type = HB_CURL_INFO_TYPE_INVALID; - - char * ret_string = NULL; - char * ret_ptr = NULL; - long ret_long = 0; - struct curl_slist * ret_slist = NULL; - double ret_double = 0.0; - - switch( hb_parni( 2 ) ) - { - case HB_CURLINFO_EFFECTIVE_URL: - res = curl_easy_getinfo( hb_curl->curl, CURLINFO_EFFECTIVE_URL, &ret_string ); - type = HB_CURL_INFO_TYPE_STR; - break; - case HB_CURLINFO_RESPONSE_CODE: - res = curl_easy_getinfo( hb_curl->curl, CURLINFO_RESPONSE_CODE, &ret_long ); - type = HB_CURL_INFO_TYPE_LONG; - break; - case HB_CURLINFO_HTTP_CONNECTCODE: - res = curl_easy_getinfo( hb_curl->curl, CURLINFO_HTTP_CONNECTCODE, &ret_long ); - type = HB_CURL_INFO_TYPE_LONG; - break; - case HB_CURLINFO_FILETIME: - res = curl_easy_getinfo( hb_curl->curl, CURLINFO_FILETIME, &ret_long ); - type = HB_CURL_INFO_TYPE_LONG; - break; - case HB_CURLINFO_TOTAL_TIME: - res = curl_easy_getinfo( hb_curl->curl, CURLINFO_TOTAL_TIME, &ret_double ); - type = HB_CURL_INFO_TYPE_DOUBLE; - break; - case HB_CURLINFO_NAMELOOKUP_TIME: - res = curl_easy_getinfo( hb_curl->curl, CURLINFO_NAMELOOKUP_TIME, &ret_double ); - type = HB_CURL_INFO_TYPE_DOUBLE; - break; - case HB_CURLINFO_CONNECT_TIME: - res = curl_easy_getinfo( hb_curl->curl, CURLINFO_CONNECT_TIME, &ret_double ); - type = HB_CURL_INFO_TYPE_DOUBLE; - break; - case HB_CURLINFO_PRETRANSFER_TIME: - res = curl_easy_getinfo( hb_curl->curl, CURLINFO_PRETRANSFER_TIME, &ret_double ); - type = HB_CURL_INFO_TYPE_DOUBLE; - break; - case HB_CURLINFO_STARTTRANSFER_TIME: - res = curl_easy_getinfo( hb_curl->curl, CURLINFO_STARTTRANSFER_TIME, &ret_double ); - type = HB_CURL_INFO_TYPE_DOUBLE; - break; + case HB_CURLINFO_EFFECTIVE_URL: + res = HB_CURL_EASY_GETINFO( hb_curl, CURLINFO_EFFECTIVE_URL, &ret_string ); + type = HB_CURL_INFO_TYPE_STR; + break; + case HB_CURLINFO_RESPONSE_CODE: + res = HB_CURL_EASY_GETINFO( hb_curl, CURLINFO_RESPONSE_CODE, &ret_long ); + type = HB_CURL_INFO_TYPE_LONG; + break; + case HB_CURLINFO_HTTP_CONNECTCODE: + res = HB_CURL_EASY_GETINFO( hb_curl, CURLINFO_HTTP_CONNECTCODE, &ret_long ); + type = HB_CURL_INFO_TYPE_LONG; + break; + case HB_CURLINFO_FILETIME: + res = HB_CURL_EASY_GETINFO( hb_curl, CURLINFO_FILETIME, &ret_long ); + type = HB_CURL_INFO_TYPE_LONG; + break; + case HB_CURLINFO_TOTAL_TIME: + res = HB_CURL_EASY_GETINFO( hb_curl, CURLINFO_TOTAL_TIME, &ret_double ); + type = HB_CURL_INFO_TYPE_DOUBLE; + break; + case HB_CURLINFO_NAMELOOKUP_TIME: + res = HB_CURL_EASY_GETINFO( hb_curl, CURLINFO_NAMELOOKUP_TIME, &ret_double ); + type = HB_CURL_INFO_TYPE_DOUBLE; + break; + case HB_CURLINFO_CONNECT_TIME: + res = HB_CURL_EASY_GETINFO( hb_curl, CURLINFO_CONNECT_TIME, &ret_double ); + type = HB_CURL_INFO_TYPE_DOUBLE; + break; + case HB_CURLINFO_PRETRANSFER_TIME: + res = HB_CURL_EASY_GETINFO( hb_curl, CURLINFO_PRETRANSFER_TIME, &ret_double ); + type = HB_CURL_INFO_TYPE_DOUBLE; + break; + case HB_CURLINFO_STARTTRANSFER_TIME: + res = HB_CURL_EASY_GETINFO( hb_curl, CURLINFO_STARTTRANSFER_TIME, &ret_double ); + type = HB_CURL_INFO_TYPE_DOUBLE; + break; #if LIBCURL_VERSION_NUM >= 0x070907 - case HB_CURLINFO_REDIRECT_TIME: - res = curl_easy_getinfo( hb_curl->curl, CURLINFO_REDIRECT_TIME, &ret_double ); - type = HB_CURL_INFO_TYPE_DOUBLE; - break; - case HB_CURLINFO_REDIRECT_COUNT: - res = curl_easy_getinfo( hb_curl->curl, CURLINFO_REDIRECT_COUNT, &ret_long ); - type = HB_CURL_INFO_TYPE_LONG; - break; + case HB_CURLINFO_REDIRECT_TIME: + res = HB_CURL_EASY_GETINFO( hb_curl, CURLINFO_REDIRECT_TIME, &ret_double ); + type = HB_CURL_INFO_TYPE_DOUBLE; + break; + case HB_CURLINFO_REDIRECT_COUNT: + res = HB_CURL_EASY_GETINFO( hb_curl, CURLINFO_REDIRECT_COUNT, &ret_long ); + type = HB_CURL_INFO_TYPE_LONG; + break; #endif #if LIBCURL_VERSION_NUM >= 0x071802 - case HB_CURLINFO_REDIRECT_URL: - res = curl_easy_getinfo( hb_curl->curl, CURLINFO_REDIRECT_URL, &ret_string ); - type = HB_CURL_INFO_TYPE_STR; - break; + case HB_CURLINFO_REDIRECT_URL: + res = HB_CURL_EASY_GETINFO( hb_curl, CURLINFO_REDIRECT_URL, &ret_string ); + type = HB_CURL_INFO_TYPE_STR; + break; #endif - case HB_CURLINFO_SIZE_UPLOAD: - res = curl_easy_getinfo( hb_curl->curl, CURLINFO_SIZE_UPLOAD, &ret_double ); - type = HB_CURL_INFO_TYPE_DOUBLE; - break; - case HB_CURLINFO_SIZE_DOWNLOAD: - res = curl_easy_getinfo( hb_curl->curl, CURLINFO_SIZE_DOWNLOAD, &ret_double ); - type = HB_CURL_INFO_TYPE_DOUBLE; - break; - case HB_CURLINFO_SPEED_DOWNLOAD: - res = curl_easy_getinfo( hb_curl->curl, CURLINFO_SPEED_DOWNLOAD, &ret_double ); - type = HB_CURL_INFO_TYPE_DOUBLE; - break; - case HB_CURLINFO_SPEED_UPLOAD: - res = curl_easy_getinfo( hb_curl->curl, CURLINFO_SPEED_UPLOAD, &ret_double ); - type = HB_CURL_INFO_TYPE_DOUBLE; - break; - case HB_CURLINFO_HEADER_SIZE: - res = curl_easy_getinfo( hb_curl->curl, CURLINFO_HEADER_SIZE, &ret_long ); - type = HB_CURL_INFO_TYPE_LONG; - break; - case HB_CURLINFO_REQUEST_SIZE: - res = curl_easy_getinfo( hb_curl->curl, CURLINFO_REQUEST_SIZE, &ret_long ); - type = HB_CURL_INFO_TYPE_LONG; - break; - case HB_CURLINFO_SSL_VERIFYRESULT: - res = curl_easy_getinfo( hb_curl->curl, CURLINFO_SSL_VERIFYRESULT, &ret_long ); - type = HB_CURL_INFO_TYPE_LONG; - break; + case HB_CURLINFO_SIZE_UPLOAD: + res = HB_CURL_EASY_GETINFO( hb_curl, CURLINFO_SIZE_UPLOAD, &ret_double ); + type = HB_CURL_INFO_TYPE_DOUBLE; + break; + case HB_CURLINFO_SIZE_DOWNLOAD: + res = HB_CURL_EASY_GETINFO( hb_curl, CURLINFO_SIZE_DOWNLOAD, &ret_double ); + type = HB_CURL_INFO_TYPE_DOUBLE; + break; + case HB_CURLINFO_SPEED_DOWNLOAD: + res = HB_CURL_EASY_GETINFO( hb_curl, CURLINFO_SPEED_DOWNLOAD, &ret_double ); + type = HB_CURL_INFO_TYPE_DOUBLE; + break; + case HB_CURLINFO_SPEED_UPLOAD: + res = HB_CURL_EASY_GETINFO( hb_curl, CURLINFO_SPEED_UPLOAD, &ret_double ); + type = HB_CURL_INFO_TYPE_DOUBLE; + break; + case HB_CURLINFO_HEADER_SIZE: + res = HB_CURL_EASY_GETINFO( hb_curl, CURLINFO_HEADER_SIZE, &ret_long ); + type = HB_CURL_INFO_TYPE_LONG; + break; + case HB_CURLINFO_REQUEST_SIZE: + res = HB_CURL_EASY_GETINFO( hb_curl, CURLINFO_REQUEST_SIZE, &ret_long ); + type = HB_CURL_INFO_TYPE_LONG; + break; + case HB_CURLINFO_SSL_VERIFYRESULT: + res = HB_CURL_EASY_GETINFO( hb_curl, CURLINFO_SSL_VERIFYRESULT, &ret_long ); + type = HB_CURL_INFO_TYPE_LONG; + break; #if LIBCURL_VERSION_NUM >= 0x071203 - case HB_CURLINFO_SSL_ENGINES: - res = curl_easy_getinfo( hb_curl->curl, CURLINFO_SSL_ENGINES, &ret_slist ); - type = HB_CURL_INFO_TYPE_SLIST; - break; + case HB_CURLINFO_SSL_ENGINES: + res = HB_CURL_EASY_GETINFO( hb_curl, CURLINFO_SSL_ENGINES, &ret_slist ); + type = HB_CURL_INFO_TYPE_SLIST; + break; #endif - case HB_CURLINFO_CONTENT_LENGTH_DOWNLOAD: - res = curl_easy_getinfo( hb_curl->curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &ret_double ); - type = HB_CURL_INFO_TYPE_DOUBLE; - break; - case HB_CURLINFO_CONTENT_LENGTH_UPLOAD: - res = curl_easy_getinfo( hb_curl->curl, CURLINFO_CONTENT_LENGTH_UPLOAD, &ret_double ); - type = HB_CURL_INFO_TYPE_DOUBLE; - break; - case HB_CURLINFO_CONTENT_TYPE: - res = curl_easy_getinfo( hb_curl->curl, CURLINFO_CONTENT_TYPE, &ret_string ); - type = HB_CURL_INFO_TYPE_STR; - break; + case HB_CURLINFO_CONTENT_LENGTH_DOWNLOAD: + res = HB_CURL_EASY_GETINFO( hb_curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &ret_double ); + type = HB_CURL_INFO_TYPE_DOUBLE; + break; + case HB_CURLINFO_CONTENT_LENGTH_UPLOAD: + res = HB_CURL_EASY_GETINFO( hb_curl, CURLINFO_CONTENT_LENGTH_UPLOAD, &ret_double ); + type = HB_CURL_INFO_TYPE_DOUBLE; + break; + case HB_CURLINFO_CONTENT_TYPE: + res = HB_CURL_EASY_GETINFO( hb_curl, CURLINFO_CONTENT_TYPE, &ret_string ); + type = HB_CURL_INFO_TYPE_STR; + break; #if LIBCURL_VERSION_NUM >= 0x071003 - case HB_CURLINFO_PRIVATE: - res = curl_easy_getinfo( hb_curl->curl, CURLINFO_PRIVATE, &ret_ptr ); - type = HB_CURL_INFO_TYPE_PTR; - break; + case HB_CURLINFO_PRIVATE: + res = HB_CURL_EASY_GETINFO( hb_curl, CURLINFO_PRIVATE, &ret_ptr ); + type = HB_CURL_INFO_TYPE_PTR; + break; #endif #if LIBCURL_VERSION_NUM >= 0x071008 - case HB_CURLINFO_HTTPAUTH_AVAIL: - res = curl_easy_getinfo( hb_curl->curl, CURLINFO_HTTPAUTH_AVAIL, &ret_long ); - type = HB_CURL_INFO_TYPE_LONG; - break; - case HB_CURLINFO_PROXYAUTH_AVAIL: - res = curl_easy_getinfo( hb_curl->curl, CURLINFO_PROXYAUTH_AVAIL, &ret_long ); - type = HB_CURL_INFO_TYPE_LONG; - break; + case HB_CURLINFO_HTTPAUTH_AVAIL: + res = HB_CURL_EASY_GETINFO( hb_curl, CURLINFO_HTTPAUTH_AVAIL, &ret_long ); + type = HB_CURL_INFO_TYPE_LONG; + break; + case HB_CURLINFO_PROXYAUTH_AVAIL: + res = HB_CURL_EASY_GETINFO( hb_curl, CURLINFO_PROXYAUTH_AVAIL, &ret_long ); + type = HB_CURL_INFO_TYPE_LONG; + break; #endif #if LIBCURL_VERSION_NUM >= 0x071202 - case HB_CURLINFO_OS_ERRNO: - res = curl_easy_getinfo( hb_curl->curl, CURLINFO_OS_ERRNO, &ret_long ); - type = HB_CURL_INFO_TYPE_LONG; - break; + case HB_CURLINFO_OS_ERRNO: + res = HB_CURL_EASY_GETINFO( hb_curl, CURLINFO_OS_ERRNO, &ret_long ); + type = HB_CURL_INFO_TYPE_LONG; + break; #endif #if LIBCURL_VERSION_NUM >= 0x071203 - case HB_CURLINFO_NUM_CONNECTS: - res = curl_easy_getinfo( hb_curl->curl, CURLINFO_NUM_CONNECTS, &ret_long ); - type = HB_CURL_INFO_TYPE_LONG; - break; + case HB_CURLINFO_NUM_CONNECTS: + res = HB_CURL_EASY_GETINFO( hb_curl, CURLINFO_NUM_CONNECTS, &ret_long ); + type = HB_CURL_INFO_TYPE_LONG; + break; #endif #if LIBCURL_VERSION_NUM >= 0x071401 - case HB_CURLINFO_COOKIELIST: - res = curl_easy_getinfo( hb_curl->curl, CURLINFO_COOKIELIST, &ret_slist ); - type = HB_CURL_INFO_TYPE_SLIST; - break; + case HB_CURLINFO_COOKIELIST: + res = HB_CURL_EASY_GETINFO( hb_curl, CURLINFO_COOKIELIST, &ret_slist ); + type = HB_CURL_INFO_TYPE_SLIST; + break; #endif #if LIBCURL_VERSION_NUM >= 0x071502 - case HB_CURLINFO_LASTSOCKET: - res = curl_easy_getinfo( hb_curl->curl, CURLINFO_LASTSOCKET, &ret_long ); - type = HB_CURL_INFO_TYPE_LONG; - break; + case HB_CURLINFO_LASTSOCKET: + res = HB_CURL_EASY_GETINFO( hb_curl, CURLINFO_LASTSOCKET, &ret_long ); + type = HB_CURL_INFO_TYPE_LONG; + break; #endif #if LIBCURL_VERSION_NUM >= 0x071504 - case HB_CURLINFO_FTP_ENTRY_PATH: - res = curl_easy_getinfo( hb_curl->curl, CURLINFO_FTP_ENTRY_PATH, &ret_string ); - type = HB_CURL_INFO_TYPE_STR; - break; + case HB_CURLINFO_FTP_ENTRY_PATH: + res = HB_CURL_EASY_GETINFO( hb_curl, CURLINFO_FTP_ENTRY_PATH, &ret_string ); + type = HB_CURL_INFO_TYPE_STR; + break; #endif - } - - switch( type ) + } + + switch( type ) + { + case HB_CURL_INFO_TYPE_STR: + hb_retc( ret_string ); + break; + case HB_CURL_INFO_TYPE_PTR: + hb_retptr( ( void * ) ret_ptr ); + break; + case HB_CURL_INFO_TYPE_LONG: + hb_retnl( ret_long ); + break; + case HB_CURL_INFO_TYPE_DOUBLE: + hb_retnd( ret_double ); + break; + case HB_CURL_INFO_TYPE_SLIST: { - case HB_CURL_INFO_TYPE_STR: - hb_retc( ret_string ); - break; - case HB_CURL_INFO_TYPE_PTR: - hb_retptr( ( void * ) ret_ptr ); - break; - case HB_CURL_INFO_TYPE_LONG: - hb_retnl( ret_long ); - break; - case HB_CURL_INFO_TYPE_DOUBLE: - hb_retnd( ret_double ); - break; - case HB_CURL_INFO_TYPE_SLIST: + if( ret_slist ) { - if( ret_slist ) + PHB_ITEM pArray; + int nCount; + struct curl_slist * walk_ret_slist; + + /* Count */ + for( walk_ret_slist = ret_slist, nCount = 0; walk_ret_slist->next; nCount++ ) + walk_ret_slist = walk_ret_slist->next; + + /* Fill */ + pArray = hb_itemArrayNew( nCount ); + for( walk_ret_slist = ret_slist, nCount = 1; walk_ret_slist->next; ) { - PHB_ITEM pArray; - int nCount; - struct curl_slist * walk_ret_slist; - - /* Count */ - for( walk_ret_slist = ret_slist, nCount = 0; walk_ret_slist->next; nCount++ ) - walk_ret_slist = walk_ret_slist->next; - - /* Fill */ - pArray = hb_itemArrayNew( nCount ); - for( walk_ret_slist = ret_slist, nCount = 1; walk_ret_slist->next; ) - { - hb_arraySetC( pArray, nCount++, walk_ret_slist->data ); - walk_ret_slist = walk_ret_slist->next; - } - hb_itemReturnRelease( pArray ); - - curl_slist_free_all( ret_slist ); + hb_arraySetC( pArray, nCount++, walk_ret_slist->data ); + walk_ret_slist = walk_ret_slist->next; } - else - hb_reta( 0 ); + hb_itemReturnRelease( pArray ); + + curl_slist_free_all( ret_slist ); } - break; + else + hb_reta( 0 ); } + break; } hb_stornl( ( long ) res, 3 ); @@ -1560,10 +1566,10 @@ HB_FUNC( CURL_EASY_GETINFO ) HB_FUNC( CURL_EASY_ESCAPE ) { - if( ISPOINTER( 1 ) ) + if( PHB_CURL_is( 1 ) ) { PHB_CURL hb_curl = PHB_CURL_par( 1 ); - + if( hb_curl ) { char * buffer = curl_easy_escape( hb_curl->curl, hb_parcx( 2 ), hb_parclen( 2 ) ); @@ -1579,10 +1585,10 @@ HB_FUNC( CURL_EASY_ESCAPE ) HB_FUNC( CURL_EASY_UNESCAPE ) { - if( ISPOINTER( 1 ) ) + if( PHB_CURL_is( 1 ) ) { PHB_CURL hb_curl = PHB_CURL_par( 1 ); - + if( hb_curl ) { int nLen = 0; @@ -1607,17 +1613,27 @@ HB_FUNC( CURL_EASY_UNESCAPE ) /* NOTE: Obsolete, superceded by curl_easy_escape() */ HB_FUNC( CURL_ESCAPE ) { - char * buffer = curl_escape( hb_parcx( 2 ), hb_parclen( 2 ) ); - hb_retc( buffer ); - curl_free( buffer ); + if( ISCHAR( 1 ) ) + { + char * buffer = curl_escape( hb_parc( 1 ), hb_parclen( 1 ) ); + hb_retc( buffer ); + curl_free( buffer ); + } + else + hb_retc_null(); } /* NOTE: Obsolete, superceded by curl_easy_unescape() */ HB_FUNC( CURL_UNESCAPE ) { - char * buffer = curl_unescape( hb_parcx( 2 ), hb_parclen( 2 ) ); - hb_retc( buffer ); - curl_free( buffer ); + if( ISCHAR( 1 ) ) + { + char * buffer = curl_unescape( hb_parc( 1 ), hb_parclen( 1 ) ); + hb_retc( buffer ); + curl_free( buffer ); + } + else + hb_retc_null(); } #endif diff --git a/harbour/contrib/hbcurl/hbcurl.ch b/harbour/contrib/hbcurl/hbcurl.ch index c224fa6480..19282f087f 100644 --- a/harbour/contrib/hbcurl/hbcurl.ch +++ b/harbour/contrib/hbcurl/hbcurl.ch @@ -362,6 +362,7 @@ /* curl result codes. */ +#define HB_CURLE_ERROR -1 /* request not passed to libcurl (libcurl not initialized or unknown parameter) */ #define HB_CURLE_OK 0 #define HB_CURLE_UNSUPPORTED_PROTOCOL 1 /* */ #define HB_CURLE_FAILED_INIT 2 /* */ diff --git a/harbour/contrib/hbcurl/tests/ftp_uldl.prg b/harbour/contrib/hbcurl/tests/ftp_uldl.prg index 1026d3f5db..a9da187461 100644 --- a/harbour/contrib/hbcurl/tests/ftp_uldl.prg +++ b/harbour/contrib/hbcurl/tests/ftp_uldl.prg @@ -70,8 +70,8 @@ FUNCTION Main( cDL, cUL ) ? curl_easy_getinfo( curl, HB_CURLINFO_EFFECTIVE_URL ) ? curl_easy_getinfo( curl, HB_CURLINFO_TOTAL_TIME ) - info := curl_easy_getinfo( curl, HB_CURLINFO_SSL_ENGINES ) - ? + info := curl_easy_getinfo( curl, HB_CURLINFO_SSL_ENGINES, @tmp ) + ? "SSL ENGINES: ", tmp, Len( info ) FOR tmp := 1 TO Len( info ) ?? info[ tmp ] + " " NEXT @@ -116,12 +116,6 @@ FUNCTION Main( cDL, cUL ) ? curl_easy_getinfo( curl, HB_CURLINFO_EFFECTIVE_URL ) ? curl_easy_getinfo( curl, HB_CURLINFO_TOTAL_TIME ) - info := curl_easy_getinfo( curl, HB_CURLINFO_SSL_ENGINES ) - ? - FOR tmp := 1 TO Len( info ) - ?? info[ tmp ] + " " - NEXT - curl_easy_reset( curl ) ? "Press key..." diff --git a/harbour/contrib/hbodbc/make_vc.bat b/harbour/contrib/hbodbc/make_vc.bat index 33269a1618..b6ece760f7 100644 --- a/harbour/contrib/hbodbc/make_vc.bat +++ b/harbour/contrib/hbodbc/make_vc.bat @@ -26,24 +26,6 @@ if "%1" == "INSTALL" goto POST_INSTALL :POST_BUILD - rem --------------------------------------------------------------- - rem This .dll to .lib conversion needs GNU sed.exe in the path - rem --------------------------------------------------------------- - echo./[ \t]*ordinal hint/,/^^[ \t]*Summary/{> _temp.sed - echo. /^^[ \t]\+[0-9]\+/{>> _temp.sed - echo. s/^^[ \t]\+[0-9]\+[ \t]\+[0-9A-Fa-f]\+[ \t]\+[0-9A-Fa-f]\+[ \t]\+\(.*\)/\1/p>> _temp.sed - echo. }>> _temp.sed - echo.}>> _temp.sed - DUMPBIN /EXPORTS "%HB_DLL_DIR%\%HB_DLL_NAME%.dll" > _dump.tmp - echo.LIBRARY "%HB_DLL_DIR%\%HB_DLL_NAME%.dll" > _temp.def - echo.EXPORTS >> _temp.def - sed -nf _temp.sed < _dump.tmp >> _temp.def - LIB /MACHINE:X86 /DEF:_temp.def /OUT:..\..\lib\%_HB_CC_NAME%\%HB_DLL_NAME%.lib >> %_HB_MAKELOG% - del _dump.tmp - del _temp.def - del _temp.sed - rem --------------------------------------------------------------- - goto POST_EXIT :POST_CLEAN diff --git a/harbour/contrib/rddads/adsmgmnt.c b/harbour/contrib/rddads/adsmgmnt.c index 93409fb83f..e7b7d760c2 100644 --- a/harbour/contrib/rddads/adsmgmnt.c +++ b/harbour/contrib/rddads/adsmgmnt.c @@ -367,9 +367,7 @@ HB_FUNC( ADSMGGETUSERNAMES ) { UNSIGNED16 usArrayLen = ISNUM( 2 ) ? ( UNSIGNED16 ) hb_parni( 2 ) : 2000; /* needed for array memory allocation; caller can set with 2nd arg */ UNSIGNED16 usStructSize = sizeof( ADS_MGMT_USER_INFO ); - ADS_MGMT_USER_INFO * pastUserInfo; - - pastUserInfo = ( ADS_MGMT_USER_INFO * ) hb_xgrab( sizeof( ADS_MGMT_USER_INFO ) * usArrayLen ); + ADS_MGMT_USER_INFO * pastUserInfo = ( ADS_MGMT_USER_INFO * ) hb_xgrab( sizeof( ADS_MGMT_USER_INFO ) * usArrayLen ); if( AdsMgGetUserNames( s_hMgmtHandle, ( UNSIGNED8 * ) hb_parc( 1 ) /* pucFileName */, @@ -433,9 +431,7 @@ HB_FUNC( ADSMGGETLOCKOWNER ) { UNSIGNED16 pusLockType = 0; UNSIGNED16 usStructSize = sizeof( ADS_MGMT_USER_INFO ); - ADS_MGMT_USER_INFO * pstUserInfo; - - pstUserInfo = ( ADS_MGMT_USER_INFO * ) hb_xgrab( sizeof( ADS_MGMT_USER_INFO ) ); + ADS_MGMT_USER_INFO * pstUserInfo = ( ADS_MGMT_USER_INFO * ) hb_xgrab( sizeof( ADS_MGMT_USER_INFO ) ); if( AdsMgGetLockOwner( s_hMgmtHandle, ( UNSIGNED8 * ) hb_parcx( 1 ) /* pucTableName */, @@ -473,9 +469,7 @@ HB_FUNC( ADSMGGETOPENTABLES ) /* nMaxNumberOfFilesToReturn, cUserName, nConnecti { UNSIGNED16 usArrayLen = ISNUM( 1 ) ? ( UNSIGNED16 ) hb_parni( 1 ) : 300; UNSIGNED16 usStructSize = sizeof( ADS_MGMT_TABLE_INFO ); - ADS_MGMT_TABLE_INFO * astOpenTableInfo; - - astOpenTableInfo = ( ADS_MGMT_TABLE_INFO * ) hb_xgrab( sizeof( ADS_MGMT_TABLE_INFO ) * usArrayLen ); + ADS_MGMT_TABLE_INFO * astOpenTableInfo = ( ADS_MGMT_TABLE_INFO * ) hb_xgrab( sizeof( ADS_MGMT_TABLE_INFO ) * usArrayLen ); if( AdsMgGetOpenTables( s_hMgmtHandle, ( UNSIGNED8 * ) ( hb_parclen( 2 ) > 0 ? hb_parc( 2 ) : NULL ) /* pucUserName */, @@ -507,9 +501,7 @@ HB_FUNC( ADSMGGETOPENTABLES2 ) /* nMaxNumberOfFilesToReturn, cUserName, nConnect { UNSIGNED16 usArrayLen = ISNUM( 1 ) ? ( UNSIGNED16 ) hb_parni( 1 ) : 300; UNSIGNED16 usStructSize = sizeof( ADS_MGMT_TABLE_INFO ); - ADS_MGMT_TABLE_INFO * astOpenTableInfo; - - astOpenTableInfo = ( ADS_MGMT_TABLE_INFO * ) hb_xgrab( sizeof( ADS_MGMT_TABLE_INFO ) * usArrayLen ); + ADS_MGMT_TABLE_INFO * astOpenTableInfo = ( ADS_MGMT_TABLE_INFO * ) hb_xgrab( sizeof( ADS_MGMT_TABLE_INFO ) * usArrayLen ); if( AdsMgGetOpenTables( s_hMgmtHandle, ( UNSIGNED8 * ) ( hb_parclen( 2 ) > 0 ? hb_parc( 2 ) : NULL ) /* pucUserName */, @@ -547,9 +539,7 @@ HB_FUNC( ADSMGGETOPENINDEXES ) /* nMaxNumberOfFilesToReturn, cTableName, cUserNa { UNSIGNED16 usArrayLen = ISNUM( 1 ) ? ( UNSIGNED16 ) hb_parni( 1 ) : 300; UNSIGNED16 usStructSize = sizeof( ADS_MGMT_INDEX_INFO ); - ADS_MGMT_INDEX_INFO * astOpenIndexInfo; - - astOpenIndexInfo = ( ADS_MGMT_INDEX_INFO * ) hb_xgrab( sizeof( ADS_MGMT_INDEX_INFO ) * usArrayLen ); + ADS_MGMT_INDEX_INFO * astOpenIndexInfo = ( ADS_MGMT_INDEX_INFO * ) hb_xgrab( sizeof( ADS_MGMT_INDEX_INFO ) * usArrayLen ); if( AdsMgGetOpenIndexes( s_hMgmtHandle, ( UNSIGNED8 * ) ( hb_parclen( 2 ) > 0 ? hb_parc( 2 ) : NULL ) /* pucTableName */, /* fully qualified path to that table */ @@ -582,9 +572,7 @@ HB_FUNC( ADSMGGETLOCKS ) { UNSIGNED16 usArrayLen = ISNUM( 1 ) ? ( UNSIGNED16 ) hb_parni( 1 ) : 2000; UNSIGNED16 usStructSize = sizeof( ADS_MGMT_RECORD_INFO ); - ADS_MGMT_RECORD_INFO * astRecordInfo; - - astRecordInfo = ( ADS_MGMT_RECORD_INFO * ) hb_xgrab( sizeof( ADS_MGMT_RECORD_INFO ) * usArrayLen ); + ADS_MGMT_RECORD_INFO * astRecordInfo = ( ADS_MGMT_RECORD_INFO * ) hb_xgrab( sizeof( ADS_MGMT_RECORD_INFO ) * usArrayLen ); if( AdsMgGetLocks( s_hMgmtHandle, ( UNSIGNED8 * ) ( hb_parclen( 2 ) > 0 ? hb_parc( 2 ) : NULL ) /* pucTableName */, /* fully qualified path to that table */ @@ -617,9 +605,7 @@ HB_FUNC( ADSMGGETWORKERTHREADACTIVITY ) { UNSIGNED16 usArrayLen = ISNUM( 1 ) ? ( UNSIGNED16 ) hb_parni( 1 ) : 2000; UNSIGNED16 usStructSize = sizeof( ADS_MGMT_THREAD_ACTIVITY ); - ADS_MGMT_THREAD_ACTIVITY * astWorkerThreadActivity; - - astWorkerThreadActivity = ( ADS_MGMT_THREAD_ACTIVITY * ) hb_xgrab( sizeof( ADS_MGMT_THREAD_ACTIVITY ) * usArrayLen ); + ADS_MGMT_THREAD_ACTIVITY * astWorkerThreadActivity = ( ADS_MGMT_THREAD_ACTIVITY * ) hb_xgrab( sizeof( ADS_MGMT_THREAD_ACTIVITY ) * usArrayLen ); if( AdsMgGetWorkerThreadActivity( s_hMgmtHandle, astWorkerThreadActivity,