diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 6e6ccf4356..f19f3c51cb 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -16,6 +16,16 @@ The license applies to all entries newer than 2009-04-28. */ +2010-08-27 00:01 UTC+0300 Mindaugas Kavaliauskas (dbtopas/at/dbtopas.lt) + * harbour/contrib/sddodbc/tests/test2.prg + ! reverted accidentally changed file in last commit + * harbour/src/rtl/hbsockhb.c + + added public functions to use socket GC pointers from other modules: + HB_SOCKET hb_socketParam( int iParam ); + HB_SOCKET hb_socketItemGet( PHB_ITEM pItem ) + PHB_ITEM hb_socketItemPut( PHB_ITEM pItem, HB_SOCKET sd ); + void hb_socketItemClear( PHB_ITEM pItem ); + 2010-08-26 20:34 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) * package/mpkg_win_nightly.bat * Adjustment to requirements (RDC access preferred). diff --git a/harbour/contrib/sddodbc/tests/test2.prg b/harbour/contrib/sddodbc/tests/test2.prg index 89c4c350cf..fb3d8e501a 100644 --- a/harbour/contrib/sddodbc/tests/test2.prg +++ b/harbour/contrib/sddodbc/tests/test2.prg @@ -12,8 +12,7 @@ LOCAL nConnection, nI, aI RDDSETDEFAULT( "SQLMIX" ) SET( _SET_DATEFORMAT, "yyyy-mm-dd" ) - nConnection := RDDINFO( RDDI_CONNECT, { "ODBC", "Server=192.168.1.99;Driver={MySQL ODBC 5.1 Driver};User=test;database=test;" } ) -// nConnection := RDDINFO( RDDI_CONNECT, { "ODBC", "dsn=kibiras;" } ) + nConnection := RDDINFO( RDDI_CONNECT, { "ODBC", "Server=localhost;Driver={MySQL ODBC 5.1 Driver};dsn=;User=test;database=test;" } ) IF nConnection == 0 ? "Unable connect to server", RDDINFO( RDDI_ERRORNO ), RDDINFO( RDDI_ERROR ) RETURN diff --git a/harbour/src/rtl/hbsockhb.c b/harbour/src/rtl/hbsockhb.c index 492778cd17..51622ffa1b 100644 --- a/harbour/src/rtl/hbsockhb.c +++ b/harbour/src/rtl/hbsockhb.c @@ -90,23 +90,20 @@ #include "hbapiitm.h" #include "hbapierr.h" #include "hbvm.h" +#include "hbstack.h" #include "hbsocket.h" -typedef struct -{ - HB_SOCKET socket; -} HB_PRG_SOCKET, * PHB_PRG_SOCKET; - - static HB_BOOL s_fInit = HB_FALSE; +/* Collectable pointer support */ + static HB_GARBAGE_FUNC( hb_socket_destructor ) { - PHB_PRG_SOCKET pSocket = ( PHB_PRG_SOCKET ) Cargo; - if( pSocket->socket != HB_NO_SOCKET ) + HB_SOCKET * pSocket = ( HB_SOCKET * ) Cargo; + if( * pSocket != HB_NO_SOCKET ) { - hb_socketClose( pSocket->socket ); - pSocket->socket = HB_NO_SOCKET; + hb_socketClose( * pSocket ); + * pSocket = HB_NO_SOCKET; } } @@ -116,17 +113,38 @@ static const HB_GC_FUNCS s_gcSocketFuncs = hb_gcDummyMark }; -static PHB_PRG_SOCKET socketParam( int iParam ) +HB_SOCKET hb_socketParam( int iParam ) { - PHB_PRG_SOCKET pSocket = ( PHB_PRG_SOCKET ) hb_parptrGC( &s_gcSocketFuncs, iParam ); + HB_SOCKET * pSocket = ( HB_SOCKET * ) hb_parptrGC( &s_gcSocketFuncs, iParam ); - if( pSocket && pSocket->socket != HB_NO_SOCKET ) - return pSocket; + if( pSocket && * pSocket != HB_NO_SOCKET ) + return * pSocket; hb_errRT_BASE_SubstR( EG_ARG, 3012, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); - return NULL; + return HB_NO_SOCKET; } +HB_SOCKET hb_socketItemGet( PHB_ITEM pItem ) +{ + HB_SOCKET * pSocket = ( HB_SOCKET * ) hb_itemGetPtrGC( pItem, &s_gcSocketFuncs ); + return pSocket ? * pSocket : HB_NO_SOCKET; +} + +PHB_ITEM hb_socketItemPut( PHB_ITEM pItem, HB_SOCKET sd ) +{ + HB_SOCKET * pSocket = ( HB_SOCKET * ) hb_gcAllocate( sizeof( HB_SOCKET ), &s_gcSocketFuncs ); + * pSocket = sd; + return hb_itemPutPtrGC( pItem, pSocket ); +} + +void hb_socketItemClear( PHB_ITEM pItem ) +{ + HB_SOCKET * pSocket = ( HB_SOCKET * ) hb_itemGetPtrGC( pItem, &s_gcSocketFuncs ); + if( pSocket ) + * pSocket = HB_NO_SOCKET; +} + + static HB_BOOL socketaddrParam( int iParam, void ** pAddr, unsigned int * puiLen ) { PHB_ITEM pItem = hb_param( iParam, HB_IT_ARRAY ); @@ -181,13 +199,13 @@ HB_FUNC( HB_SOCKETERRORSTRING ) HB_FUNC( HB_SOCKETGETSOCKNAME ) { - PHB_PRG_SOCKET pSocket = socketParam( 1 ); - if( pSocket ) + HB_SOCKET socket = hb_socketParam( 1 ); + if( socket != HB_NO_SOCKET ) { void * addr; unsigned int len; - if( hb_socketGetSockName( pSocket->socket, &addr, &len ) == 0 ) + if( hb_socketGetSockName( socket, &addr, &len ) == 0 ) { PHB_ITEM pItem = hb_socketAddrToItem( addr, len ); @@ -206,13 +224,13 @@ HB_FUNC( HB_SOCKETGETSOCKNAME ) HB_FUNC( HB_SOCKETGETPEERNAME ) { - PHB_PRG_SOCKET pSocket = socketParam( 1 ); - if( pSocket ) + HB_SOCKET socket = hb_socketParam( 1 ); + if( socket != HB_NO_SOCKET ) { void * addr; unsigned int len; - if( hb_socketGetPeerName( pSocket->socket, &addr, &len ) == 0 ) + if( hb_socketGetPeerName( socket, &addr, &len ) == 0 ) { PHB_ITEM pItem = hb_socketAddrToItem( addr, len ); @@ -238,76 +256,65 @@ HB_FUNC( HB_SOCKETOPEN ) socket_init(); if( ( socket = hb_socketOpen( iDomain, iType, iProtocol ) ) != HB_NO_SOCKET ) - { - PHB_PRG_SOCKET pSocket = ( PHB_PRG_SOCKET ) hb_gcAllocate( sizeof( HB_PRG_SOCKET ), - &s_gcSocketFuncs ); - pSocket->socket = socket; - hb_retptrGC( pSocket ); - } + hb_socketItemPut( hb_stackReturnItem(), socket ); else hb_retptr( NULL ); } HB_FUNC( HB_SOCKETCLOSE ) { - PHB_PRG_SOCKET pSocket = socketParam( 1 ); - if( pSocket ) + HB_SOCKET socket = hb_socketParam( 1 ); + if( socket != HB_NO_SOCKET ) { - int iRet = hb_socketClose( pSocket->socket ); - pSocket->socket = HB_NO_SOCKET; - hb_retl( iRet == 0 ); + hb_socketItemClear( hb_param( 1, HB_IT_POINTER ) ); + hb_retl( hb_socketClose( socket ) == 0 ); } } HB_FUNC( HB_SOCKETSHUTDOWN ) { - PHB_PRG_SOCKET pSocket = socketParam( 1 ); - if( pSocket ) + HB_SOCKET socket = hb_socketParam( 1 ); + if( socket != HB_NO_SOCKET ) { - hb_retl( hb_socketShutdown( pSocket->socket, hb_parnidef( 2, HB_SOCKET_SHUT_RDWR ) ) == 0 ); + hb_retl( hb_socketShutdown( socket, hb_parnidef( 2, HB_SOCKET_SHUT_RDWR ) ) == 0 ); } } HB_FUNC( HB_SOCKETBIND ) { - PHB_PRG_SOCKET pSocket = socketParam( 1 ); + HB_SOCKET socket = hb_socketParam( 1 ); void * addr; unsigned int len; - if( pSocket && socketaddrParam( 2, &addr, &len ) ) + if( socket != HB_NO_SOCKET && socketaddrParam( 2, &addr, &len ) ) { - hb_retl( hb_socketBind( pSocket->socket, addr, len ) == 0 ); + hb_retl( hb_socketBind( socket, addr, len ) == 0 ); hb_xfree( addr ); } } HB_FUNC( HB_SOCKETLISTEN ) { - PHB_PRG_SOCKET pSocket = socketParam( 1 ); - if( pSocket ) + HB_SOCKET socket = hb_socketParam( 1 ); + if( socket != HB_NO_SOCKET ) { - hb_retl( hb_socketListen( pSocket->socket, hb_parnidef( 2, 10 ) ) == 0 ); + hb_retl( hb_socketListen( socket, hb_parnidef( 2, 10 ) ) == 0 ); } } HB_FUNC( HB_SOCKETACCEPT ) { - PHB_PRG_SOCKET pSocket = socketParam( 1 ); - if( pSocket ) + HB_SOCKET socket = hb_socketParam( 1 ); + if( socket != HB_NO_SOCKET ) { - HB_SOCKET socket; + HB_SOCKET socketaccept; void * addr = NULL; unsigned int len; - socket = hb_socketAccept( pSocket->socket, &addr, &len, hb_parnintdef( 3, -1 ) ); + socketaccept = hb_socketAccept( socket, &addr, &len, hb_parnintdef( 3, -1 ) ); - if( socket != HB_NO_SOCKET ) - { - PHB_PRG_SOCKET pSocket = ( PHB_PRG_SOCKET ) hb_gcAllocate( sizeof( HB_PRG_SOCKET ), - &s_gcSocketFuncs ); - pSocket->socket = socket; - hb_retptrGC( pSocket ); - } + if( socketaccept != HB_NO_SOCKET ) + hb_socketItemPut( hb_stackReturnItem(), socketaccept ); else hb_retptr( NULL ); @@ -315,7 +322,7 @@ HB_FUNC( HB_SOCKETACCEPT ) if( HB_ISBYREF( 2 ) ) { PHB_ITEM pItem; - if( socket != HB_NO_SOCKET && ( pItem = hb_socketAddrToItem( addr, len ) ) != NULL ) + if( socketaccept != HB_NO_SOCKET && ( pItem = hb_socketAddrToItem( addr, len ) ) != NULL ) { hb_itemParamStoreForward( 2, pItem ); hb_itemRelease( pItem ); @@ -331,21 +338,21 @@ HB_FUNC( HB_SOCKETACCEPT ) HB_FUNC( HB_SOCKETCONNECT ) { - PHB_PRG_SOCKET pSocket = socketParam( 1 ); + HB_SOCKET socket = hb_socketParam( 1 ); void * addr; unsigned int len; - if( pSocket && socketaddrParam( 2, &addr, &len ) ) + if( socket != HB_NO_SOCKET && socketaddrParam( 2, &addr, &len ) ) { - hb_retl( hb_socketConnect( pSocket->socket, addr, len, hb_parnintdef( 3, -1 ) ) == 0 ); + hb_retl( hb_socketConnect( socket, addr, len, hb_parnintdef( 3, -1 ) ) == 0 ); hb_xfree( addr ); } } HB_FUNC( HB_SOCKETSEND ) { - PHB_PRG_SOCKET pSocket = socketParam( 1 ); - if( pSocket ) + HB_SOCKET socket = hb_socketParam( 1 ); + if( socket != HB_NO_SOCKET ) { long lLen = ( long ) hb_parclen( 2 ); @@ -356,18 +363,18 @@ HB_FUNC( HB_SOCKETSEND ) if( lParam >= 0 && lParam < lLen ) lLen = lParam; } - hb_retnl( hb_socketSend( pSocket->socket, hb_parc( 2 ), lLen, hb_parni( 4 ), + hb_retnl( hb_socketSend( socket, hb_parc( 2 ), lLen, hb_parni( 4 ), hb_parnintdef( 5, -1 ) ) ); } } HB_FUNC( HB_SOCKETSENDTO ) { - PHB_PRG_SOCKET pSocket = socketParam( 1 ); + HB_SOCKET socket = hb_socketParam( 1 ); void * addr; unsigned int len; - if( pSocket && socketaddrParam( 5, &addr, &len ) ) + if( socket != HB_NO_SOCKET && socketaddrParam( 5, &addr, &len ) ) { long lLen = ( long ) hb_parclen( 2 ); @@ -378,7 +385,7 @@ HB_FUNC( HB_SOCKETSENDTO ) if( lParam >= 0 && lParam < lLen ) lLen = lParam; } - hb_retnl( hb_socketSendTo( pSocket->socket, hb_parc( 2 ), lLen, hb_parni( 4 ), + hb_retnl( hb_socketSendTo( socket, hb_parc( 2 ), lLen, hb_parni( 4 ), addr, len, hb_parnintdef( 6, -1 ) ) ); hb_xfree( addr ); } @@ -386,8 +393,8 @@ HB_FUNC( HB_SOCKETSENDTO ) HB_FUNC( HB_SOCKETRECV ) { - PHB_PRG_SOCKET pSocket = socketParam( 1 ); - if( pSocket ) + HB_SOCKET socket = hb_socketParam( 1 ); + if( socket != HB_NO_SOCKET ) { PHB_ITEM pItem = hb_param( 2, HB_IT_STRING ); char * pBuffer; @@ -401,7 +408,7 @@ HB_FUNC( HB_SOCKETRECV ) if( lRead >= 0 && lRead < ( long ) nLen ) nLen = lRead; } - hb_retnl( hb_socketRecv( pSocket->socket, pBuffer, ( long ) nLen, + hb_retnl( hb_socketRecv( socket, pBuffer, ( long ) nLen, hb_parni( 4 ), hb_parnintdef( 5, -1 ) ) ); return; } @@ -411,8 +418,8 @@ HB_FUNC( HB_SOCKETRECV ) HB_FUNC( HB_SOCKETRECVFROM ) { - PHB_PRG_SOCKET pSocket = socketParam( 1 ); - if( pSocket ) + HB_SOCKET socket = hb_socketParam( 1 ); + if( socket != HB_NO_SOCKET ) { PHB_ITEM pItem = hb_param( 2, HB_IT_STRING ); char * pBuffer; @@ -430,7 +437,7 @@ HB_FUNC( HB_SOCKETRECVFROM ) if( lRead >= 0 && lRead < ( long ) nLen ) nLen = lRead; } - hb_retnl( lRet = hb_socketRecvFrom( pSocket->socket, pBuffer, ( long ) nLen, + hb_retnl( lRet = hb_socketRecvFrom( socket, pBuffer, ( long ) nLen, hb_parni( 4 ), &addr, &len, hb_parnintdef( 6, -1 ) ) ); if( HB_ISBYREF( 5 ) ) @@ -456,131 +463,131 @@ HB_FUNC( HB_SOCKETRECVFROM ) HB_FUNC( HB_SOCKETSETBLOCKINGIO ) { - PHB_PRG_SOCKET pSocket = socketParam( 1 ); - if( pSocket ) + HB_SOCKET socket = hb_socketParam( 1 ); + if( socket != HB_NO_SOCKET ) { - hb_retl( hb_socketSetBlockingIO( pSocket->socket, hb_parl( 2 ) ) == 0 ); + hb_retl( hb_socketSetBlockingIO( socket, hb_parl( 2 ) ) == 0 ); } } HB_FUNC( HB_SOCKETSETNODELAY ) { - PHB_PRG_SOCKET pSocket = socketParam( 1 ); - if( pSocket ) + HB_SOCKET socket = hb_socketParam( 1 ); + if( socket != HB_NO_SOCKET ) { - hb_retl( hb_socketSetNoDelay( pSocket->socket, hb_parl( 2 ) ) == 0 ); + hb_retl( hb_socketSetNoDelay( socket, hb_parl( 2 ) ) == 0 ); } } HB_FUNC( HB_SOCKETSETREUSEADDR ) { - PHB_PRG_SOCKET pSocket = socketParam( 1 ); - if( pSocket ) + HB_SOCKET socket = hb_socketParam( 1 ); + if( socket != HB_NO_SOCKET ) { - hb_retl( hb_socketSetReuseAddr( pSocket->socket, hb_parl( 2 ) ) == 0 ); + hb_retl( hb_socketSetReuseAddr( socket, hb_parl( 2 ) ) == 0 ); } } HB_FUNC( HB_SOCKETSETKEEPALIVE ) { - PHB_PRG_SOCKET pSocket = socketParam( 1 ); - if( pSocket ) + HB_SOCKET socket = hb_socketParam( 1 ); + if( socket != HB_NO_SOCKET ) { - hb_retl( hb_socketSetKeepAlive( pSocket->socket, hb_parl( 2 ) ) == 0 ); + hb_retl( hb_socketSetKeepAlive( socket, hb_parl( 2 ) ) == 0 ); } } HB_FUNC( HB_SOCKETSETBROADCAST ) { - PHB_PRG_SOCKET pSocket = socketParam( 1 ); - if( pSocket ) + HB_SOCKET socket = hb_socketParam( 1 ); + if( socket != HB_NO_SOCKET ) { - hb_retl( hb_socketSetBroadcast( pSocket->socket, hb_parl( 2 ) ) == 0 ); + hb_retl( hb_socketSetBroadcast( socket, hb_parl( 2 ) ) == 0 ); } } HB_FUNC( HB_SOCKETSETSNDBUFSIZE ) { - PHB_PRG_SOCKET pSocket = socketParam( 1 ); - if( pSocket ) + HB_SOCKET socket = hb_socketParam( 1 ); + if( socket != HB_NO_SOCKET ) { - hb_retl( hb_socketSetSndBufSize( pSocket->socket, hb_parni( 2 ) ) == 0 ); + hb_retl( hb_socketSetSndBufSize( socket, hb_parni( 2 ) ) == 0 ); } } HB_FUNC( HB_SOCKETSETRCVBUFSIZE ) { - PHB_PRG_SOCKET pSocket = socketParam( 1 ); - if( pSocket ) + HB_SOCKET socket = hb_socketParam( 1 ); + if( socket != HB_NO_SOCKET ) { - hb_retl( hb_socketSetRcvBufSize( pSocket->socket, hb_parni( 2 ) ) == 0 ); + hb_retl( hb_socketSetRcvBufSize( socket, hb_parni( 2 ) ) == 0 ); } } HB_FUNC( HB_SOCKETGETSNDBUFSIZE ) { - PHB_PRG_SOCKET pSocket = socketParam( 1 ); - if( pSocket ) + HB_SOCKET socket = hb_socketParam( 1 ); + if( socket != HB_NO_SOCKET ) { int size; - hb_retl( hb_socketGetSndBufSize( pSocket->socket, &size ) == 0 ); + hb_retl( hb_socketGetSndBufSize( socket, &size ) == 0 ); hb_storni( size, 2 ); } } HB_FUNC( HB_SOCKETGETRCVBUFSIZE ) { - PHB_PRG_SOCKET pSocket = socketParam( 1 ); - if( pSocket ) + HB_SOCKET socket = hb_socketParam( 1 ); + if( socket != HB_NO_SOCKET ) { int size; - hb_retl( hb_socketGetRcvBufSize( pSocket->socket, &size ) == 0 ); + hb_retl( hb_socketGetRcvBufSize( socket, &size ) == 0 ); hb_storni( size, 2 ); } } HB_FUNC( HB_SOCKETSETMULTICAST ) { - PHB_PRG_SOCKET pSocket = socketParam( 1 ); - if( pSocket ) + HB_SOCKET socket = hb_socketParam( 1 ); + if( socket != HB_NO_SOCKET ) { - hb_retl( hb_socketSetMulticast( pSocket->socket, hb_parnidef( 2, HB_SOCKET_AF_INET ), hb_parc( 3 ) ) == 0 ); + hb_retl( hb_socketSetMulticast( socket, hb_parnidef( 2, HB_SOCKET_AF_INET ), hb_parc( 3 ) ) == 0 ); } } HB_FUNC( HB_SOCKETSELECTREAD ) { - PHB_PRG_SOCKET pSocket = socketParam( 1 ); - if( pSocket ) + HB_SOCKET socket = hb_socketParam( 1 ); + if( socket != HB_NO_SOCKET ) { - hb_retni( hb_socketSelectRead( pSocket->socket, hb_parnintdef( 2, -1 ) ) ); + hb_retni( hb_socketSelectRead( socket, hb_parnintdef( 2, -1 ) ) ); } } HB_FUNC( HB_SOCKETSELECTWRITE ) { - PHB_PRG_SOCKET pSocket = socketParam( 1 ); - if( pSocket ) + HB_SOCKET socket = hb_socketParam( 1 ); + if( socket != HB_NO_SOCKET ) { - hb_retni( hb_socketSelectWrite( pSocket->socket, hb_parnintdef( 2, -1 ) ) ); + hb_retni( hb_socketSelectWrite( socket, hb_parnintdef( 2, -1 ) ) ); } } HB_FUNC( HB_SOCKETSELECTWRITEEX ) { - PHB_PRG_SOCKET pSocket = socketParam( 1 ); - if( pSocket ) + HB_SOCKET socket = hb_socketParam( 1 ); + if( socket != HB_NO_SOCKET ) { - hb_retni( hb_socketSelectWriteEx( pSocket->socket, hb_parnintdef( 2, -1 ) ) ); + hb_retni( hb_socketSelectWriteEx( socket, hb_parnintdef( 2, -1 ) ) ); } } static HB_SOCKET socketSelectCallback( PHB_ITEM pItem ) { - PHB_PRG_SOCKET pSocket = ( PHB_PRG_SOCKET ) hb_itemGetPtrGC( pItem, &s_gcSocketFuncs ); + HB_SOCKET socket = hb_socketItemGet( pItem ); - if( pSocket && pSocket->socket != HB_NO_SOCKET ) - return pSocket->socket; + if( socket != HB_NO_SOCKET ) + return socket; hb_errRT_BASE_SubstR( EG_ARG, 3012, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); return HB_NO_SOCKET;