From 770eb9f04691286cd9b4140d72ff39be03fda383 Mon Sep 17 00:00:00 2001 From: Przemyslaw Czerpak Date: Wed, 23 Jul 2008 10:19:33 +0000 Subject: [PATCH] 2008-07-23 12:18 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) * harbour/source/common/hbwince.c * formatting * harbour/contrib/hbcurl/hbcurl.c + use hash table to keep strings passed to CURL library accessible even if HVM destroys them. It should allow to safely use HBCURL wrapper also with CURL library older then 7.17.0 though it can be a little bit expensive in some cases. The allocated strings are freed when CURL pointer is destroyed (directly or by CURL_EASY_CLEANUP()) or reset by CURL_EASY_RESET(). This feature is enabled only when compiled for CURL libraries older then 7.17.0 or when user set explicitly compile time macro HB_CURL_HASH_STRINGS Viktor, you are more familiar with this code so please check it. --- harbour/ChangeLog | 16 +++ harbour/contrib/hbcurl/hbcurl.c | 169 +++++++++++++++++++++++--------- harbour/source/common/hbwince.c | 138 +++++++++++++------------- 3 files changed, 206 insertions(+), 117 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index c33158873b..2e0cac7ee9 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,22 @@ 2008-12-31 13:59 UTC+0100 Foo Bar */ +2008-07-23 12:18 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) + * harbour/source/common/hbwince.c + * formatting + + * harbour/contrib/hbcurl/hbcurl.c + + use hash table to keep strings passed to CURL library accessible + even if HVM destroys them. It should allow to safely use HBCURL + wrapper also with CURL library older then 7.17.0 though it can + be a little bit expensive in some cases. The allocated strings + are freed when CURL pointer is destroyed (directly or by + CURL_EASY_CLEANUP()) or reset by CURL_EASY_RESET(). + This feature is enabled only when compiled for CURL libraries + older then 7.17.0 or when user set explicitly compile time macro + HB_CURL_HASH_STRINGS + Viktor, you are more familiar with this code so please check it. + 2008-07-23 01:04 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) * harbour/make_xmingwce.sh * fixed CCPATH setting - it has to be ended with ":" diff --git a/harbour/contrib/hbcurl/hbcurl.c b/harbour/contrib/hbcurl/hbcurl.c index 737e3f84cc..a4dcf5688d 100644 --- a/harbour/contrib/hbcurl/hbcurl.c +++ b/harbour/contrib/hbcurl/hbcurl.c @@ -67,6 +67,7 @@ #include "hbapierr.h" #include "hbapifs.h" #include "hbvm.h" +#include "hbhash.h" #include "hbcurl.ch" @@ -74,7 +75,10 @@ #define HB_CURL_OPT_LARGENUM( n ) ( ( curl_off_t ) hb_parnint( n ) ) #if LIBCURL_VERSION_NUM < 0x071100 - #error hbcurl: Harbour hbcurl needs libcurl 7.17.0 or upper. + /* #error hbcurl: Harbour hbcurl needs libcurl 7.17.0 or upper. */ +# ifndef HB_CURL_HASH_STRINGS +# define HB_CURL_HASH_STRINGS +# endif #endif typedef struct _HB_CURL @@ -106,8 +110,70 @@ typedef struct _HB_CURL PHB_ITEM pProgressBlock; +#ifdef HB_CURL_HASH_STRINGS + HB_HASH_TABLE_PTR pHash; +#endif + } HB_CURL, * PHB_CURL; +#ifdef HB_CURL_HASH_STRINGS + +/* functions to keep passed string values accessible even if HVM + * destroy them. It's necessary for old CURL versions which do not + * make own copy of passed strings + */ +#define HB_CURL_HASH_TABLE_SIZE 509UL + +static const char * hb_curl_StrHash( PHB_CURL hb_curl, const char * szValue ) +{ + char * szHash; + + szHash = ( char * ) hb_hashTableFind( hb_curl->pHash, ( void * ) szValue ); + if( !szHash ) + { + szHash = hb_strdup( szValue ); + hb_hashTableAdd( hb_curl->pHash, ( void * ) szHash, ( void * ) szHash ); + } + return szHash; +} + +/* returns a hash key */ +static HB_HASH_FUNC( hb_curl_HashKey ) /* ULONG func (void *Value, void *Cargo) */ +{ + ULONG ulSum = 0; + char *szName = ( char * )Value; + + while( *szName ) + ulSum += *szName++; + + HB_SYMBOL_UNUSED( HashPtr ); + HB_SYMBOL_UNUSED( Cargo ); + + return ulSum % HB_CURL_HASH_TABLE_SIZE; +} + +/* deletes an identifier */ +static HB_HASH_FUNC( hb_curl_HashDel ) +{ + hb_xfree( Value ); + HB_SYMBOL_UNUSED( HashPtr ); + HB_SYMBOL_UNUSED( Cargo ); + return 1; +} + +/* compares two identifiers */ +static HB_HASH_FUNC( hb_curl_HashCmp ) +{ + HB_SYMBOL_UNUSED( HashPtr ); + return strcmp( (char *)Value, (char *)Cargo ); +} + +#else + +#define hb_curl_StrHash( c, s ) (s) + +#endif /* HB_CURL_HASH_STRINGS */ + /* ---------------------------------------------------------------------------- */ /* Global initialization/deinitialization */ @@ -396,6 +462,13 @@ static void PHB_CURL_free( PHB_CURL hb_curl, BOOL bFree ) hb_itemRelease( hb_curl->pProgressBlock ); hb_curl->pProgressBlock = NULL; } +#ifdef HB_CURL_HASH_STRINGS + if( hb_curl->pHash ) + { + hb_hashTableKill( hb_curl->pHash ); + hb_curl->pHash = NULL; + } +#endif if( bFree ) { @@ -419,6 +492,10 @@ static PHB_CURL PHB_CURL_create( CURL * from ) memset( ( void * ) hb_curl, 0, sizeof( HB_CURL ) ); hb_curl->curl = curl; +#ifdef HB_CURL_HASH_STRINGS + hb_curl->pHash = hb_hashTableCreate( HB_CURL_HASH_TABLE_SIZE, + hb_curl_HashKey, hb_curl_HashDel, hb_curl_HashCmp ); +#endif return hb_curl; } @@ -667,10 +744,10 @@ HB_FUNC( CURL_EASY_SETOPT ) /* 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 ) ); + res = curl_easy_setopt( hb_curl->curl, CURLOPT_URL, hb_curl_StrHash( hb_curl, hb_parc( 3 ) ) ); break; case HB_CURLOPT_PROXY: - res = curl_easy_setopt( hb_curl->curl, CURLOPT_PROXY, hb_parc( 3 ) ); + res = curl_easy_setopt( hb_curl->curl, CURLOPT_PROXY, hb_curl_StrHash( hb_curl, hb_parc( 3 ) ) ); break; case HB_CURLOPT_PROXYPORT: res = curl_easy_setopt( hb_curl->curl, CURLOPT_PROXYPORT, hb_parnl( 3 ) ); @@ -687,7 +764,7 @@ HB_FUNC( CURL_EASY_SETOPT ) break; */ case HB_CURLOPT_INTERFACE: - res = curl_easy_setopt( hb_curl->curl, CURLOPT_INTERFACE, hb_parc( 3 ) ); + res = curl_easy_setopt( hb_curl->curl, CURLOPT_INTERFACE, hb_curl_StrHash( hb_curl, hb_parc( 3 ) ) ); break; case HB_CURLOPT_LOCALPORT: res = curl_easy_setopt( hb_curl->curl, CURLOPT_LOCALPORT, hb_parnl( 3 ) ); @@ -717,13 +794,13 @@ HB_FUNC( CURL_EASY_SETOPT ) res = curl_easy_setopt( hb_curl->curl, CURLOPT_NETRC, hb_parnl( 3 ) ); break; case HB_CURLOPT_NETRC_FILE: - res = curl_easy_setopt( hb_curl->curl, CURLOPT_NETRC_FILE, hb_parc( 3 ) ); + res = curl_easy_setopt( hb_curl->curl, CURLOPT_NETRC_FILE, hb_curl_StrHash( hb_curl, hb_parc( 3 ) ) ); break; case HB_CURLOPT_USERPWD: - res = curl_easy_setopt( hb_curl->curl, CURLOPT_USERPWD, hb_parc( 3 ) ); + res = curl_easy_setopt( hb_curl->curl, CURLOPT_USERPWD, hb_curl_StrHash( hb_curl, hb_parc( 3 ) ) ); break; case HB_CURLOPT_PROXYUSERPWD: - res = curl_easy_setopt( hb_curl->curl, CURLOPT_PROXYUSERPWD, hb_parc( 3 ) ); + res = curl_easy_setopt( hb_curl->curl, CURLOPT_PROXYUSERPWD, hb_curl_StrHash( hb_curl, hb_parc( 3 ) ) ); break; case HB_CURLOPT_HTTPAUTH: res = curl_easy_setopt( hb_curl->curl, CURLOPT_HTTPAUTH, hb_parnl( 3 ) ); @@ -738,7 +815,7 @@ HB_FUNC( CURL_EASY_SETOPT ) res = curl_easy_setopt( hb_curl->curl, CURLOPT_AUTOREFERER, HB_CURL_OPT_BOOL( 3 ) ); break; case HB_CURLOPT_ENCODING: - res = curl_easy_setopt( hb_curl->curl, CURLOPT_ENCODING, hb_parc( 3 ) ); + res = curl_easy_setopt( hb_curl->curl, CURLOPT_ENCODING, hb_curl_StrHash( hb_curl, hb_parc( 3 ) ) ); break; case HB_CURLOPT_FOLLOWLOCATION: res = curl_easy_setopt( hb_curl->curl, CURLOPT_FOLLOWLOCATION, HB_CURL_OPT_BOOL( 3 ) ); @@ -763,7 +840,7 @@ HB_FUNC( CURL_EASY_SETOPT ) #if LIBCURL_VERSION_NUM >= 0x071101 case HB_CURLOPT_POSTFIELDS: case HB_CURLOPT_COPYPOSTFIELDS: - res = curl_easy_setopt( hb_curl->curl, CURLOPT_COPYPOSTFIELDS, hb_parc( 3 ) ); + res = curl_easy_setopt( hb_curl->curl, CURLOPT_COPYPOSTFIELDS, hb_curl_StrHash( hb_curl, hb_parc( 3 ) ) ); break; #endif case HB_CURLOPT_POSTFIELDSIZE: @@ -787,8 +864,8 @@ HB_FUNC( CURL_EASY_SETOPT ) curl_formadd( &hb_curl->pHTTPPOST_First, &hb_curl->pHTTPPOST_Last, - CURLFORM_COPYNAME, hb_arrayGetCPtr( pSubArray, 1 ), - CURLFORM_FILE, hb_arrayGetCPtr( pSubArray, 2 ), + CURLFORM_COPYNAME, hb_curl_StrHash( hb_curl, hb_arrayGetCPtr( pSubArray, 1 ) ), + CURLFORM_FILE, hb_curl_StrHash( hb_curl, hb_arrayGetCPtr( pSubArray, 2 ) ), CURLFORM_END ); } @@ -797,10 +874,10 @@ HB_FUNC( CURL_EASY_SETOPT ) } break; case HB_CURLOPT_REFERER: - res = curl_easy_setopt( hb_curl->curl, CURLOPT_REFERER, hb_parc( 3 ) ); + res = curl_easy_setopt( hb_curl->curl, CURLOPT_REFERER, hb_curl_StrHash( hb_curl, hb_parc( 3 ) ) ); break; case HB_CURLOPT_USERAGENT: - res = curl_easy_setopt( hb_curl->curl, CURLOPT_USERAGENT, hb_parc( 3 ) ); + res = curl_easy_setopt( hb_curl->curl, CURLOPT_USERAGENT, hb_curl_StrHash( hb_curl, hb_parc( 3 ) ) ); break; case HB_CURLOPT_HTTPHEADER: { @@ -815,7 +892,7 @@ HB_FUNC( CURL_EASY_SETOPT ) 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 ) ); + hb_curl->pHTTPHEADER = curl_slist_append( hb_curl->pHTTPHEADER, hb_curl_StrHash( hb_curl, hb_arrayGetCPtr( pArray, ulPos + 1 ) ) ); res = curl_easy_setopt( hb_curl->curl, CURLOPT_HTTPHEADER, hb_curl->pHTTPHEADER ); } @@ -834,26 +911,26 @@ HB_FUNC( CURL_EASY_SETOPT ) 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 ) ); + hb_curl->pHTTP200ALIASES = curl_slist_append( hb_curl->pHTTP200ALIASES, hb_curl_StrHash( hb_curl, hb_arrayGetCPtr( pArray, ulPos + 1 ) ) ); res = curl_easy_setopt( hb_curl->curl, CURLOPT_HTTP200ALIASES, hb_curl->pHTTP200ALIASES ); } } break; case HB_CURLOPT_COOKIE: - res = curl_easy_setopt( hb_curl->curl, CURLOPT_COOKIE, hb_parc( 3 ) ); + res = curl_easy_setopt( hb_curl->curl, CURLOPT_COOKIE, hb_curl_StrHash( hb_curl, hb_parc( 3 ) ) ); break; case HB_CURLOPT_COOKIEFILE: - res = curl_easy_setopt( hb_curl->curl, CURLOPT_COOKIEFILE, hb_parc( 3 ) ); + res = curl_easy_setopt( hb_curl->curl, CURLOPT_COOKIEFILE, hb_curl_StrHash( hb_curl, hb_parc( 3 ) ) ); break; case HB_CURLOPT_COOKIEJAR: - res = curl_easy_setopt( hb_curl->curl, CURLOPT_COOKIEJAR, hb_parc( 3 ) ); + res = curl_easy_setopt( hb_curl->curl, CURLOPT_COOKIEJAR, hb_curl_StrHash( hb_curl, hb_parc( 3 ) ) ); break; case HB_CURLOPT_COOKIESESSION: res = curl_easy_setopt( hb_curl->curl, CURLOPT_COOKIESESSION, HB_CURL_OPT_BOOL( 3 ) ); break; case HB_CURLOPT_COOKIELIST: - res = curl_easy_setopt( hb_curl->curl, CURLOPT_COOKIELIST, hb_parc( 3 ) ); + res = curl_easy_setopt( hb_curl->curl, CURLOPT_COOKIELIST, hb_curl_StrHash( hb_curl, hb_parc( 3 ) ) ); break; case HB_CURLOPT_HTTPGET: res = curl_easy_setopt( hb_curl->curl, CURLOPT_HTTPGET, HB_CURL_OPT_BOOL( 3 ) ); @@ -874,7 +951,7 @@ HB_FUNC( CURL_EASY_SETOPT ) /* FTP options */ case HB_CURLOPT_FTPPORT: - res = curl_easy_setopt( hb_curl->curl, CURLOPT_FTPPORT, hb_parc( 3 ) ); + res = curl_easy_setopt( hb_curl->curl, CURLOPT_FTPPORT, hb_curl_StrHash( hb_curl, hb_parc( 3 ) ) ); break; case HB_CURLOPT_QUOTE: { @@ -889,7 +966,7 @@ HB_FUNC( CURL_EASY_SETOPT ) 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 ) ); + hb_curl->pQUOTE = curl_slist_append( hb_curl->pQUOTE, hb_curl_StrHash( hb_curl, hb_arrayGetCPtr( pArray, ulPos + 1 ) ) ); res = curl_easy_setopt( hb_curl->curl, CURLOPT_QUOTE, hb_curl->pQUOTE ); } @@ -908,7 +985,7 @@ HB_FUNC( CURL_EASY_SETOPT ) 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 ) ); + hb_curl->pPOSTQUOTE = curl_slist_append( hb_curl->pPOSTQUOTE, hb_curl_StrHash( hb_curl, hb_arrayGetCPtr( pArray, ulPos + 1 ) ) ); res = curl_easy_setopt( hb_curl->curl, CURLOPT_POSTQUOTE, hb_curl->pPOSTQUOTE ); } @@ -927,7 +1004,7 @@ HB_FUNC( CURL_EASY_SETOPT ) 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 ) ); + hb_curl->pQUOTE = curl_slist_append( hb_curl->pPREQUOTE, hb_curl_StrHash( hb_curl, hb_arrayGetCPtr( pArray, ulPos + 1 ) ) ); res = curl_easy_setopt( hb_curl->curl, CURLOPT_PREQUOTE, hb_curl->pPREQUOTE ); } @@ -960,7 +1037,7 @@ HB_FUNC( CURL_EASY_SETOPT ) res = curl_easy_setopt( hb_curl->curl, CURLOPT_FTP_RESPONSE_TIMEOUT, hb_parnl( 3 ) ); break; case HB_CURLOPT_FTP_ALTERNATIVE_TO_USER: - res = curl_easy_setopt( hb_curl->curl, CURLOPT_FTP_ALTERNATIVE_TO_USER, hb_parc( 3 ) ); + res = curl_easy_setopt( hb_curl->curl, CURLOPT_FTP_ALTERNATIVE_TO_USER, hb_curl_StrHash( hb_curl, hb_parc( 3 ) ) ); break; case HB_CURLOPT_FTP_SKIP_PASV_IP: res = curl_easy_setopt( hb_curl->curl, CURLOPT_FTP_SKIP_PASV_IP, HB_CURL_OPT_BOOL( 3 ) ); @@ -976,7 +1053,7 @@ HB_FUNC( CURL_EASY_SETOPT ) break; #if LIBCURL_VERSION_NUM >= 0x070C03 case HB_CURLOPT_FTP_ACCOUNT: - res = curl_easy_setopt( hb_curl->curl, CURLOPT_FTP_ACCOUNT, hb_parc( 3 ) ); + res = curl_easy_setopt( hb_curl->curl, CURLOPT_FTP_ACCOUNT, hb_curl_StrHash( hb_curl, hb_parc( 3 ) ) ); break; #endif case HB_CURLOPT_FTP_FILEMETHOD: @@ -997,7 +1074,7 @@ HB_FUNC( CURL_EASY_SETOPT ) res = curl_easy_setopt( hb_curl->curl, CURLOPT_CRLF, HB_CURL_OPT_BOOL( 3 ) ); break; case HB_CURLOPT_RANGE: - res = curl_easy_setopt( hb_curl->curl, CURLOPT_RANGE, hb_parc( 3 ) ); + res = curl_easy_setopt( hb_curl->curl, CURLOPT_RANGE, hb_curl_StrHash( hb_curl, hb_parc( 3 ) ) ); break; case HB_CURLOPT_RESUME_FROM: res = curl_easy_setopt( hb_curl->curl, CURLOPT_RESUME_FROM, hb_parnl( 3 ) ); @@ -1006,7 +1083,7 @@ HB_FUNC( CURL_EASY_SETOPT ) res = curl_easy_setopt( hb_curl->curl, CURLOPT_RESUME_FROM_LARGE, HB_CURL_OPT_LARGENUM( 3 ) ); break; case HB_CURLOPT_CUSTOMREQUEST: - res = curl_easy_setopt( hb_curl->curl, CURLOPT_CUSTOMREQUEST, hb_parc( 3 ) ); + res = curl_easy_setopt( hb_curl->curl, CURLOPT_CUSTOMREQUEST, hb_curl_StrHash( hb_curl, hb_parc( 3 ) ) ); break; case HB_CURLOPT_FILETIME: res = curl_easy_setopt( hb_curl->curl, CURLOPT_FILETIME, hb_parnl( 3 ) ); @@ -1087,28 +1164,28 @@ HB_FUNC( CURL_EASY_SETOPT ) /* SSL and Security */ case HB_CURLOPT_SSLCERT: - res = curl_easy_setopt( hb_curl->curl, CURLOPT_SSLCERT, hb_parc( 3 ) ); + res = curl_easy_setopt( hb_curl->curl, CURLOPT_SSLCERT, hb_curl_StrHash( hb_curl, hb_parc( 3 ) ) ); break; case HB_CURLOPT_SSLCERTTYPE: - res = curl_easy_setopt( hb_curl->curl, CURLOPT_SSLCERTTYPE, hb_parc( 3 ) ); + res = curl_easy_setopt( hb_curl->curl, CURLOPT_SSLCERTTYPE, hb_curl_StrHash( hb_curl, hb_parc( 3 ) ) ); break; case HB_CURLOPT_SSLKEY: - res = curl_easy_setopt( hb_curl->curl, CURLOPT_SSLKEY, hb_parc( 3 ) ); + res = curl_easy_setopt( hb_curl->curl, CURLOPT_SSLKEY, hb_curl_StrHash( hb_curl, hb_parc( 3 ) ) ); break; case HB_CURLOPT_SSLKEYTYPE: - res = curl_easy_setopt( hb_curl->curl, CURLOPT_SSLKEYTYPE, hb_parc( 3 ) ); + res = curl_easy_setopt( hb_curl->curl, CURLOPT_SSLKEYTYPE, hb_curl_StrHash( hb_curl, hb_parc( 3 ) ) ); break; case HB_CURLOPT_KEYPASSWD: #if LIBCURL_VERSION_NUM > 0x071004 - res = curl_easy_setopt( hb_curl->curl, CURLOPT_KEYPASSWD, hb_parc( 3 ) ); + res = curl_easy_setopt( hb_curl->curl, CURLOPT_KEYPASSWD, hb_curl_StrHash( hb_curl, hb_parc( 3 ) ) ); #elif LIBCURL_VERSION_NUM > 0x070902 - res = curl_easy_setopt( hb_curl->curl, CURLOPT_SSLKEYPASSWD, hb_parc( 3 ) ); + res = curl_easy_setopt( hb_curl->curl, CURLOPT_SSLKEYPASSWD, hb_curl_StrHash( hb_curl, hb_parc( 3 ) ) ); #else - res = curl_easy_setopt( hb_curl->curl, CURLOPT_SSLCERTPASSWD, hb_parc( 3 ) ); + res = curl_easy_setopt( hb_curl->curl, CURLOPT_SSLCERTPASSWD, hb_curl_StrHash( hb_curl, hb_parc( 3 ) ) ); #endif break; case HB_CURLOPT_SSLENGINE: - res = curl_easy_setopt( hb_curl->curl, CURLOPT_SSLENGINE, hb_parc( 3 ) ); + res = curl_easy_setopt( hb_curl->curl, CURLOPT_SSLENGINE, hb_curl_StrHash( hb_curl, hb_parc( 3 ) ) ); break; case HB_CURLOPT_SSLENGINE_DEFAULT: res = curl_easy_setopt( hb_curl->curl, CURLOPT_SSLENGINE_DEFAULT, hb_parnl( 3 ) ); @@ -1120,31 +1197,31 @@ HB_FUNC( CURL_EASY_SETOPT ) res = curl_easy_setopt( hb_curl->curl, CURLOPT_SSL_VERIFYPEER, HB_CURL_OPT_BOOL( 3 ) ); break; case HB_CURLOPT_CAINFO: - res = curl_easy_setopt( hb_curl->curl, CURLOPT_CAINFO, hb_parc( 3 ) ); + res = curl_easy_setopt( hb_curl->curl, CURLOPT_CAINFO, hb_curl_StrHash( hb_curl, hb_parc( 3 ) ) ); break; case HB_CURLOPT_CAPATH: - res = curl_easy_setopt( hb_curl->curl, CURLOPT_CAPATH, hb_parc( 3 ) ); + res = curl_easy_setopt( hb_curl->curl, CURLOPT_CAPATH, hb_curl_StrHash( hb_curl, hb_parc( 3 ) ) ); break; case HB_CURLOPT_RANDOM_FILE: - res = curl_easy_setopt( hb_curl->curl, CURLOPT_RANDOM_FILE, hb_parc( 3 ) ); + res = curl_easy_setopt( hb_curl->curl, CURLOPT_RANDOM_FILE, hb_curl_StrHash( hb_curl, hb_parc( 3 ) ) ); break; case HB_CURLOPT_EGDSOCKET: - res = curl_easy_setopt( hb_curl->curl, CURLOPT_EGDSOCKET, hb_parc( 3 ) ); + res = curl_easy_setopt( hb_curl->curl, CURLOPT_EGDSOCKET, hb_curl_StrHash( hb_curl, hb_parc( 3 ) ) ); break; case HB_CURLOPT_SSL_VERIFYHOST: res = curl_easy_setopt( hb_curl->curl, CURLOPT_SSL_VERIFYHOST, HB_CURL_OPT_BOOL( 3 ) ); break; case HB_CURLOPT_SSL_CIPHER_LIST: - res = curl_easy_setopt( hb_curl->curl, CURLOPT_SSL_CIPHER_LIST, hb_parc( 3 ) ); + res = curl_easy_setopt( hb_curl->curl, CURLOPT_SSL_CIPHER_LIST, hb_curl_StrHash( hb_curl, hb_parc( 3 ) ) ); break; case HB_CURLOPT_SSL_SESSIONID_CACHE: res = curl_easy_setopt( hb_curl->curl, CURLOPT_SSL_VERIFYHOST, HB_CURL_OPT_BOOL( 3 ) ); break; case HB_CURLOPT_KRBLEVEL: /* HB_CURLOPT_KRB4LEVEL */ #if LIBCURL_VERSION_NUM > 0x071003 - res = curl_easy_setopt( hb_curl->curl, CURLOPT_KRBLEVEL, hb_parc( 3 ) ); + res = curl_easy_setopt( hb_curl->curl, CURLOPT_KRBLEVEL, hb_curl_StrHash( hb_curl, hb_parc( 3 ) ) ); #else - res = curl_easy_setopt( hb_curl->curl, CURLOPT_KRB4LEVEL, hb_parc( 3 ) ); + res = curl_easy_setopt( hb_curl->curl, CURLOPT_KRB4LEVEL, hb_curl_StrHash( hb_curl, hb_parc( 3 ) ) ); #endif break; @@ -1155,14 +1232,14 @@ HB_FUNC( CURL_EASY_SETOPT ) break; #if LIBCURL_VERSION_NUM >= 0x071101 case HB_CURLOPT_SSH_HOST_PUBLIC_KEY_MD5: - res = curl_easy_setopt( hb_curl->curl, CURLOPT_SSH_HOST_PUBLIC_KEY_MD5, hb_parc( 3 ) ); + res = curl_easy_setopt( hb_curl->curl, CURLOPT_SSH_HOST_PUBLIC_KEY_MD5, hb_curl_StrHash( hb_curl, hb_parc( 3 ) ) ); break; #endif case HB_CURLOPT_SSH_PUBLIC_KEYFILE: - res = curl_easy_setopt( hb_curl->curl, CURLOPT_SSH_PUBLIC_KEYFILE, hb_parc( 3 ) ); + res = curl_easy_setopt( hb_curl->curl, CURLOPT_SSH_PUBLIC_KEYFILE, hb_curl_StrHash( hb_curl, hb_parc( 3 ) ) ); break; case HB_CURLOPT_SSH_PRIVATE_KEYFILE: - res = curl_easy_setopt( hb_curl->curl, CURLOPT_SSH_PRIVATE_KEYFILE, hb_parc( 3 ) ); + res = curl_easy_setopt( hb_curl->curl, CURLOPT_SSH_PRIVATE_KEYFILE, hb_curl_StrHash( hb_curl, hb_parc( 3 ) ) ); break; /* Other options */ @@ -1197,7 +1274,7 @@ HB_FUNC( CURL_EASY_SETOPT ) 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 ) ); + hb_curl->pTELNETOPTIONS = curl_slist_append( hb_curl->pTELNETOPTIONS, hb_curl_StrHash( hb_curl, hb_arrayGetCPtr( pArray, ulPos + 1 ) ) ); res = curl_easy_setopt( hb_curl->curl, CURLOPT_TELNETOPTIONS, hb_curl->pTELNETOPTIONS ); } diff --git a/harbour/source/common/hbwince.c b/harbour/source/common/hbwince.c index f8aacd91d8..5c9d1b9ce4 100644 --- a/harbour/source/common/hbwince.c +++ b/harbour/source/common/hbwince.c @@ -63,6 +63,71 @@ #include "hbapi.h" #include "hbdate.h" +#if defined(HB_OS_WIN_32) + +void hb_mbtowccpy( wchar_t *dstW, const char *srcA, ULONG ulLen ) +{ + MultiByteToWideChar( CP_ACP, 0, srcA, -1, dstW, ulLen / sizeof( wchar_t ) ); +} + +void hb_mbtowcset( wchar_t *dstW, const char *srcA, unsigned long ulLen ) +{ + MultiByteToWideChar( CP_ACP, 0, srcA, ulLen, dstW, ulLen ); +} + +wchar_t *hb_mbtowc( const char *srcA ) +{ + DWORD length; + wchar_t *dstW; + + length = MultiByteToWideChar( CP_ACP, 0, srcA, -1, NULL, 0 ); + dstW = ( wchar_t * ) hb_xgrab( ( length + 1 ) * sizeof( wchar_t ) ); + MultiByteToWideChar( CP_ACP, 0, srcA, -1, dstW, length + 1 ); + + return dstW; +} + +char *hb_wctomb( const wchar_t *srcW ) +{ + DWORD length; + char *dstA; + + length = WideCharToMultiByte( CP_ACP, 0, srcW, -1, NULL, 0, NULL, NULL ); + dstA = ( char * ) hb_xgrab( length + 1 ); + WideCharToMultiByte( CP_ACP, 0, srcW, -1, dstA, length + 1, NULL, NULL ); + + return dstA; +} + +wchar_t *hb_mbntowc( const char *srcA, unsigned long ulLen ) +{ + DWORD length; + wchar_t *dstW; + + length = MultiByteToWideChar( CP_ACP, 0, srcA, ulLen, NULL, 0 ); + dstW = ( wchar_t * ) hb_xgrab( ( length + 1 ) * sizeof( wchar_t ) ); + MultiByteToWideChar( CP_ACP, 0, srcA, ulLen, dstW, length + 1 ); + + return dstW; +} + +char *hb_wcntomb( const wchar_t *srcW, unsigned long ulLen ) +{ + DWORD length; + char *dstA; + + length = WideCharToMultiByte( CP_ACP, 0, srcW, ulLen, NULL, 0, NULL, NULL ); + dstA = ( char * ) hb_xgrab( length + 1 ); + WideCharToMultiByte( CP_ACP, 0, srcW, ulLen, dstA, length + 1, NULL, NULL ); + + return dstA; +} + +void hb_wctombget( char *dstA, const wchar_t *srcW, unsigned long ulLen ) +{ + WideCharToMultiByte( CP_ACP, 0, srcW, ulLen, dstA, ulLen, NULL, NULL ); +} + #if defined(HB_WINCE) int remove( const char *filename ) @@ -132,75 +197,6 @@ char * strerror( int errnum ) return ( char * ) ""; } -#endif /* HB_WINCE */ - -#if defined(HB_OS_WIN_32) - -void hb_mbtowccpy( wchar_t *dstW, const char *srcA, ULONG ulLen ) -{ - MultiByteToWideChar( CP_ACP, 0, srcA, -1, dstW, ulLen / sizeof( wchar_t ) ); -} - -void hb_mbtowcset( wchar_t *dstW, const char *srcA, unsigned long ulLen ) -{ - MultiByteToWideChar( CP_ACP, 0, srcA, ulLen, dstW, ulLen ); -} - -wchar_t *hb_mbtowc( const char *srcA ) -{ - DWORD length; - wchar_t *dstW; - - length = MultiByteToWideChar( CP_ACP, 0, srcA, -1, NULL, 0 ); - dstW = ( wchar_t * ) hb_xgrab( ( length + 1 ) * sizeof( wchar_t ) ); - MultiByteToWideChar( CP_ACP, 0, srcA, -1, dstW, length + 1 ); - - return dstW; -} - -char *hb_wctomb( const wchar_t *srcW ) -{ - DWORD length; - char *dstA; - - length = WideCharToMultiByte( CP_ACP, 0, srcW, -1, NULL, 0, NULL, NULL ); - dstA = ( char * ) hb_xgrab( length + 1 ); - WideCharToMultiByte( CP_ACP, 0, srcW, -1, dstA, length + 1, NULL, NULL ); - - return dstA; -} - -wchar_t *hb_mbntowc( const char *srcA, unsigned long ulLen ) -{ - DWORD length; - wchar_t *dstW; - - length = MultiByteToWideChar( CP_ACP, 0, srcA, ulLen, NULL, 0 ); - dstW = ( wchar_t * ) hb_xgrab( ( length + 1 ) * sizeof( wchar_t ) ); - MultiByteToWideChar( CP_ACP, 0, srcA, ulLen, dstW, length + 1 ); - - return dstW; -} - -char *hb_wcntomb( const wchar_t *srcW, unsigned long ulLen ) -{ - DWORD length; - char *dstA; - - length = WideCharToMultiByte( CP_ACP, 0, srcW, ulLen, NULL, 0, NULL, NULL ); - dstA = ( char * ) hb_xgrab( length + 1 ); - WideCharToMultiByte( CP_ACP, 0, srcW, ulLen, dstA, length + 1, NULL, NULL ); - - return dstA; -} - -void hb_wctombget( char *dstA, const wchar_t *srcW, unsigned long ulLen ) -{ - WideCharToMultiByte( CP_ACP, 0, srcW, ulLen, dstA, ulLen, NULL, NULL ); -} - -#if defined(HB_WINCE) - DWORD WINAPI GetEnvironmentVariableA( LPCSTR name, LPSTR value, DWORD size ) { /* use registry instead of "environment valuable". */ @@ -530,7 +526,7 @@ UINT WINAPI GetDriveTypeA( LPCSTR path ) HB_SYMBOL_UNUSED( path ); return DRIVE_UNKNOWN; -#endif +#endif /* 0 */ } BOOL WINAPI GetVersionExA( OSVERSIONINFOA * v ) @@ -742,7 +738,7 @@ clock_t clock( void ) return ( ( clock_t ) hb_dateEncode( st.wYear, st.wMonth, st.wDay ) - 2451545 ) * 86400000 + ( ( st.wHour * 60 + st.wMinute ) * 60 + st.wSecond ) * 1000 + st.wMilliseconds; } -#endif +#endif /* __MINGW32CE__ */ BOOL WINAPI GetDiskFreeSpaceA( LPCSTR path, PDWORD pdwSectorsPerCluster, PDWORD pdwBytesPerSector,