size_t wswcurl_read( wswcurl_req *req, void *buffer, size_t size ) { size_t written = 0; chained_buffer_t *cb; if( ( req->rxreceived - req->rxreturned ) < ( size + WMINBUFFERING ) && req->paused ) { wswcurl_unpause( req ); } // hmm, signal an error? if( req->status < 0 ) { return 0; } // go through the buffers in chain, dropping them if not needed // start from the beginning (chronological order) cb = req->bhead; while( cb && written < size ) { size_t numb = cb->rxsize - cb->rxoffset; if( numb + written > size ) { numb = size - written; } if( !numb ) { break; } if( req->ignore_bytes >= numb ) { req->ignore_bytes -= numb; cb->rxoffset += numb; goto advance; } else { cb->rxoffset += req->ignore_bytes; req->ignore_bytes = 0; } memcpy( ( (char*)buffer ) + written, cb->data + cb->rxoffset, numb ); written += numb; cb->rxoffset += numb; advance: if( cb->rxoffset >= cb->rxsize ) { // flush the buffer away req->bhead = cb->next; if( req->btail == cb ) { req->btail = NULL; } WFREE( cb ); // advance to the next buffer in chain cb = req->bhead; } // else break; } if( written < size ) { ( (char*)buffer )[written] = '\0'; } req->rxreturned += written; return written; }
size_t wswcurl_read(wswcurl_req *req, void *buffer, size_t size) { size_t written = 0; chained_buffer_t *cb; if( (req->rxreceived-req->rxreturned) < (size+WMINBUFFERING) && req->paused ) wswcurl_unpause(req); #if 0 // Make sure we have data in buffer while ( req->status >= 0 && req->status != WSTATUS_FINISHED && req->status != WSTATUS_QUEUED && (req->rxreceived-req->rxreturned) < size ) { CURLDBG((" CURL BLOCKING READ LOOP\n")); wswcurl_perform_single (req); } #endif // hmm, signal an error? if( req->status < 0 ) return 0; // go through the buffers in chain, dropping them if not needed // start from the beginning (chronological order) cb = req->bhead; while( cb && written < size ) { size_t numb = cb->rxsize - cb->rxoffset; if( numb + written > size ) numb = size - written; if( !numb ) break; if( req->ignore_bytes >= numb ) { req->ignore_bytes -= numb; cb->rxoffset += numb; continue; } else { cb->rxoffset += req->ignore_bytes; req->ignore_bytes = 0; } memcpy( ((char*)buffer)+written, cb->data+cb->rxoffset, numb ); written += numb; cb->rxoffset += numb; if( cb->rxoffset >= cb->rxsize ) { // flush the buffer away req->bhead = cb->next; if( req->btail == cb ) req->btail = NULL; WFREE( cb ); // advance to the next buffer in chain cb = req->bhead; } // else break; } if( written < size ) ((char*)buffer)[written] = '\0'; req->rxreturned += written; #if 0 if( req->paused) Com_Printf(S_COLOR_RED "%d - ", req->rxreturned - req->rxreceived); else Com_Printf(S_COLOR_CYAN "%d - ", req->rxreturned - req->rxreceived); #endif return written; }