/* write data using stream structure */ long hb_znetWrite( PHB_ZNETSTREAM pStream, HB_SOCKET sd, const void * buffer, long len, HB_MAXINT timeout, long * plast ) { long snd = 0; pStream->wr.next_in = ( Bytef * ) buffer; pStream->wr.avail_in = ( uInt ) len; pStream->err = Z_OK; while( pStream->wr.avail_in ) { if( pStream->wr.avail_out == 0 ) { snd = hb_znetStreamWrite( pStream, sd, timeout ); if( plast ) *plast = snd; if( snd <= 0 ) break; snd = 0; } pStream->err = deflate( &pStream->wr, Z_NO_FLUSH ); if( pStream->err != Z_OK ) break; } len -= pStream->wr.avail_in; return len == 0 ? snd : len; }
/* flush data in stream structure - return number of bytes left in the * buffer which were not sent */ long hb_znetFlush( PHB_ZNETSTREAM pStream, HB_SOCKET sd, HB_MAXINT timeout, HB_BOOL fSync ) { uInt uiSize = HB_ZNET_BUFSIZE - ( pStream->crypt ? 2 : 0 ); if( fSync && pStream->wr.avail_out == uiSize && pStream->wr.total_in == 0 && pStream->wr.total_out == 0 ) return 0; if( pStream->wr.avail_out > 0 ) pStream->err = deflate( &pStream->wr, fSync ? Z_FULL_FLUSH : Z_PARTIAL_FLUSH ); else pStream->err = Z_OK; while( pStream->wr.avail_out < uiSize ) { if( hb_znetStreamWrite( pStream, sd, timeout ) <= 0 ) break; if( pStream->err == Z_OK || pStream->err == Z_BUF_ERROR ) pStream->err = deflate( &pStream->wr, fSync ? Z_FULL_FLUSH : Z_PARTIAL_FLUSH ); } if( pStream->err == Z_BUF_ERROR ) pStream->err = Z_OK; if( pStream->err != Z_OK ) hb_socketSetError( HB_ZNET_SOCK_ERROR_BASE - pStream->err ); return uiSize - pStream->wr.avail_out; }
/* flush data in stream structure - return number of bytes left in the * buffer which were not sent */ long hb_znetFlush( PHB_ZNETSTREAM pStream, HB_SOCKET sd, HB_MAXINT timeout ) { uInt uiSize = HB_ZNET_BUFSIZE - ( pStream->crypt ? 2 : 0 ); if( pStream->wr.avail_out > 0 ) pStream->err = deflate( &pStream->wr, Z_PARTIAL_FLUSH ); else pStream->err = Z_OK; while( pStream->wr.avail_out < uiSize ) { if( hb_znetStreamWrite( pStream, sd, timeout ) <= 0 ) break; if( pStream->err == Z_OK ) pStream->err = deflate( &pStream->wr, Z_PARTIAL_FLUSH ); } return uiSize - pStream->wr.avail_out; }
/* write data using stream structure */ long hb_znetWrite( PHB_ZNETSTREAM pStream, HB_SOCKET sd, const void * buffer, long len, HB_MAXINT timeout, long * plast ) { long snd = 0; pStream->wr.next_in = ( Bytef * ) HB_UNCONST( buffer ); pStream->wr.avail_in = ( uInt ) len; pStream->err = Z_OK; while( pStream->wr.avail_in ) { if( pStream->wr.avail_out == 0 ) { snd = hb_znetStreamWrite( pStream, sd, timeout ); if( plast ) *plast = snd; if( snd <= 0 ) break; snd = 0; } pStream->err = deflate( &pStream->wr, Z_NO_FLUSH ); if( pStream->err != Z_OK ) { if( pStream->err == Z_BUF_ERROR ) pStream->err = Z_OK; else { hb_socketSetError( HB_ZNET_SOCK_ERROR_BASE - pStream->err ); snd = -1; } break; } } len -= pStream->wr.avail_in; return len == 0 ? snd : len; }