Example #1
0
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;
}
Example #2
0
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;
}