Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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;
   }
}
Пример #4
0
static HB_GARBAGE_FUNC( hb_socket_destructor )
{
   PHB_SOCKEX * pSockPtr = ( PHB_SOCKEX * ) Cargo;

   if( *pSockPtr )
   {
      hb_sockexClose( *pSockPtr, HB_TRUE );
      *pSockPtr = NULL;
   }
}
Пример #5
0
/* 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;
}
Пример #6
0
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;
}
Пример #7
0
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;
}
Пример #8
0
static void s_fileClose( PHB_FILE pFile )
{
   hb_sockexClose( pFile->sock, HB_TRUE );
   hb_fsSetError( hb_socketGetError() );
   hb_xfree( pFile );
}