static int s_sockexCanRead( PHB_SOCKEX pSock, HB_BOOL fBuffer, HB_MAXINT timeout ) { if( pSock->inbuffer ) return 1; else if( pSock->sd == HB_NO_SOCKET ) { hb_socketSetError( HB_SOCKET_ERR_INVALIDHANDLE ); return -1; } else if( SSL_pending( HB_SSLSOCK_GET( pSock )->ssl ) ) { long len; if( pSock->buffer == NULL ) { if( pSock->readahead <= 0 ) pSock->readahead = HB_SSLSOCK_READAHEAD; pSock->buffer = ( HB_BYTE * ) hb_xgrab( pSock->readahead ); } len = hb_ssl_socketRead( HB_SSLSOCK_GET( pSock ), pSock->sd, pSock->buffer, pSock->readahead, 0 ); if( len > 0 ) { pSock->inbuffer = len; len = 1; } return ( int ) len; } return fBuffer ? 0 : hb_socketSelectRead( pSock->sd, timeout ); }
static int s_sockexClose( PHB_SOCKEX pSock, HB_BOOL fClose ) { int iResult; if( pSock->cargo ) { SSL_shutdown( HB_SSLSOCK_GET( pSock )->ssl ); hb_itemRelease( HB_SSLSOCK_GET( pSock )->pSSL ); hb_xfree( pSock->cargo ); } iResult = hb_sockexRawClear( pSock, fClose ); hb_xfree( pSock ); return iResult; }
static long s_sockexWrite( PHB_SOCKEX pSock, const void * data, long len, HB_MAXINT timeout ) { if( pSock->sd == HB_NO_SOCKET ) { hb_socketSetError( HB_SOCKET_ERR_INVALIDHANDLE ); return -1; } return hb_ssl_socketWrite( HB_SSLSOCK_GET( pSock ), pSock->sd, data, len, timeout, NULL ); }
static int s_sockexClose( PHB_SOCKEX pSock, HB_BOOL fClose ) { int iResult; if( pSock->cargo ) hb_ssl_socketClose( HB_SSLSOCK_GET( pSock ) ); iResult = hb_sockexRawClear( pSock, fClose ); hb_xfree( pSock ); return iResult; }
static long s_sockexRead( PHB_SOCKEX pSock, void * data, long len, HB_MAXINT timeout ) { long lRead = HB_MIN( pSock->inbuffer, len ); if( lRead > 0 ) { memcpy( data, pSock->buffer + pSock->posbuffer, lRead ); pSock->inbuffer -= lRead; if( pSock->inbuffer ) pSock->posbuffer += lRead; else pSock->posbuffer = 0; return lRead; } else if( pSock->sd == HB_NO_SOCKET ) { hb_socketSetError( HB_SOCKET_ERR_INVALIDHANDLE ); return -1; } return hb_ssl_socketRead( HB_SSLSOCK_GET( pSock ), pSock->sd, data, len, timeout ); }