static int s_sockexClose( PHB_SOCKEX pSock, HB_BOOL fClose ) { PHB_SOCKEX_BF pBF = HB_BFSOCK_GET( pSock ); int iResult = 0; if( pBF ) { if( pBF->sock ) s_sockexFlush( pSock, HB_MAX( 15000, pSock->iAutoFlush ), HB_TRUE ); if( pBF->sock ) { if( pSock->fShutDown ) pBF->sock->fShutDown = HB_TRUE; if( pSock->iAutoFlush != 0 && pBF->sock->iAutoFlush == 0 ) pBF->sock->iAutoFlush = pSock->iAutoFlush; iResult = hb_sockexClose( pBF->sock, fClose ); } memset( pBF, 0, sizeof( *pBF ) ); hb_xfree( pBF ); } /* call hb_sockexRawClear() with fClose = HB_FALSE because hb_sockexClose() already closed real socket */ hb_sockexRawClear( pSock, HB_FALSE ); hb_xfree( pSock ); return iResult; }
PHB_SOCKEX hb_sockexNew( HB_SOCKET sd, const char * pszFilter, PHB_ITEM pParams ) { const HB_SOCKET_FILTER * pBuffer[ 16 ]; const HB_SOCKET_FILTER ** pFilters; int iCount = HB_SIZEOFARRAY( pBuffer ); PHB_SOCKEX pSock = NULL; pFilters = s_socket_getfilters( pszFilter, pBuffer, &iCount ); if( pFilters ) { int i; for( i = 0; i < iCount; ++i ) { PHB_SOCKEX pSockNew = pSock == NULL ? pFilters[ i ]->New( sd, pParams ) : pFilters[ i ]->Next( pSock, pParams ); if( pSockNew == NULL ) { hb_sockexClose( pSock, HB_FALSE ); pSock = NULL; break; } pSock = pSockNew; } if( pFilters != pBuffer ) hb_xfree( pFilters ); } return pSock; }
void hb_socketItemClear( PHB_ITEM pItem ) { PHB_SOCKEX * pSockPtr = ( PHB_SOCKEX * ) hb_itemGetPtrGC( pItem, &s_gcSocketFuncs ); if( pSockPtr && *pSockPtr ) { hb_sockexClose( *pSockPtr, HB_FALSE ); *pSockPtr = NULL; } }
static HB_GARBAGE_FUNC( hb_socket_destructor ) { PHB_SOCKEX * pSockPtr = ( PHB_SOCKEX * ) Cargo; if( *pSockPtr ) { hb_sockexClose( *pSockPtr, HB_TRUE ); *pSockPtr = NULL; } }
/* this wrapper does not support multilevel filtering so it destroys previous wrappers if any and create new one. */ static PHB_SOCKEX s_sockexNext( PHB_SOCKEX pSock, PHB_ITEM pParams ) { PHB_SOCKEX pSockNew = NULL; if( pSock && pSock->sd != HB_NO_SOCKET ) { pSockNew = s_sockexNew( pSock->sd, pParams ); if( pSockNew ) hb_sockexClose( pSock, HB_FALSE ); } return pSockNew; }
static PHB_SOCKEX s_sockexNew( HB_SOCKET sd, PHB_ITEM pParams ) { PHB_SOCKEX pSock, pSockNew = NULL; pSock = hb_sockexNew( sd, NULL, pParams ); if( pSock ) { pSockNew = s_sockexNext( pSock, pParams ); if( pSockNew == NULL ) hb_sockexClose( pSock, HB_FALSE ); } return pSockNew; }
static int s_sockexClose( PHB_SOCKEX pSock, HB_BOOL fClose ) { PHB_SOCKEX_Z pZ = HB_ZSOCK_GET( pSock ); int iResult = 0; if( pZ ) { if( pZ->sock ) s_sockexFlush( pSock, HB_MAX( 15000, pSock->iAutoFlush ), HB_TRUE ); if( pZ->fDecompressIn ) inflateEnd( &pZ->z_read ); if( pZ->rdbuf ) hb_xfree( pZ->rdbuf ); if( pZ->fCompressOut ) deflateEnd( &pZ->z_write ); if( pZ->wrbuf ) hb_xfree( pZ->wrbuf ); if( pZ->sock ) { if( pSock->fShutDown ) pZ->sock->fShutDown = HB_TRUE; if( pSock->iAutoFlush != 0 && pZ->sock->iAutoFlush == 0 ) pZ->sock->iAutoFlush = pSock->iAutoFlush; iResult = hb_sockexClose( pZ->sock, fClose ); } hb_xfree( pZ ); } /* call hb_sockexRawClear() with fClose = HB_FALSE because hb_sockexClose() already closed real socket */ hb_sockexRawClear( pSock, HB_FALSE ); hb_xfree( pSock ); return iResult; }
static void s_fileClose( PHB_FILE pFile ) { hb_sockexClose( pFile->sock, HB_TRUE ); hb_fsSetError( hb_socketGetError() ); hb_xfree( pFile ); }