Blame tcpqueue.cpp

dd2ea4
dd2ea4
dd2ea4
#include <cstring></cstring>
dd2ea4
dd2ea4
#include "socket.h"
dd2ea4
#include "connection.h"
dd2ea4
#include "tcpqueue.h"
dd2ea4
dd2ea4
dd2ea4
460064
//#define DebugMsg HideDebugMSG
460064
#define DebugMsg ShowDebugMSG
460064
460064
460064
dd2ea4
TcpQueue::TcpQueue(Connection &connection):
dd2ea4
	connection(connection), buffer(), begin(), end() { }
dd2ea4
dd2ea4
dd2ea4
TcpQueue::~TcpQueue()
dd2ea4
	{ }
dd2ea4
dd2ea4
dd2ea4
bool TcpQueue::push(const void *data, int size) {
dd2ea4
	if (!data || size <= 0 || freeSize() < size)
dd2ea4
		return false;
dd2ea4
	
873e9f
	int part1 = ALLOCATED_SIZE - end;
dd2ea4
	if (size > part1) {
dd2ea4
		memcpy(buffer + end, data, part1);
dd2ea4
		memcpy(buffer, (const unsigned char*)data + part1, size - part1);
dd2ea4
	} else {
dd2ea4
		memcpy(buffer + end, data, size);
dd2ea4
	}
873e9f
	end = (end + size)%ALLOCATED_SIZE;
dd2ea4
	
dd2ea4
	return true;
dd2ea4
}
dd2ea4
dd2ea4
dd2ea4
bool TcpQueue::pop(void *data, int size) {
dd2ea4
	if (!data || size <= 0 || busySize() < size)
dd2ea4
		return false;
dd2ea4
	
873e9f
	int part1 = ALLOCATED_SIZE - begin;
dd2ea4
	if (size > part1) {
dd2ea4
		memcpy(data, buffer + begin, part1);
dd2ea4
		memcpy((unsigned char*)data + part1, buffer, size - part1);
dd2ea4
	} else {
dd2ea4
		memcpy(data, buffer + begin, size);
dd2ea4
	}
873e9f
	begin = (begin + size)%ALLOCATED_SIZE;
dd2ea4
	
dd2ea4
	return true;
dd2ea4
}
dd2ea4
dd2ea4
dd2ea4
int TcpQueue::readFromTcp() {
dd2ea4
	if (connection.tcpSockId < 0)
dd2ea4
		return 0;
dd2ea4
	int size = freeSize();
dd2ea4
	if (size <= 0)
dd2ea4
		return 0;
dd2ea4
	
dd2ea4
	int doneSize = 0;
460064
	int parts[2] = { size, 0 };
460064
	int p0 = ALLOCATED_SIZE - end;
460064
	if (size > p0)
460064
		{ parts[0] = p0; parts[1] = size - p0; }
dd2ea4
	
dd2ea4
	for(int i = 0; i < 2; ++i) {
dd2ea4
		while(parts[i]) {
dd2ea4
			int res = Socket::tcpRecvAsync(connection.tcpSockId, buffer + end, parts[i]);
460064
			if (res <= 0) {
460064
				DebugMsg("%u, %d", connection.id.id, doneSize);
dd2ea4
				return doneSize;
460064
			}
dd2ea4
			doneSize += res;
dd2ea4
			end += res;
dd2ea4
			parts[i] -= res;
dd2ea4
		}
873e9f
		if (end >= ALLOCATED_SIZE) end = 0;
dd2ea4
	}
460064
	
460064
	DebugMsg("%u, %d", connection.id.id, doneSize);
dd2ea4
	return doneSize;
dd2ea4
}
dd2ea4
dd2ea4
dd2ea4
int TcpQueue::writeToTcp() {
dd2ea4
	if (connection.tcpSockId < 0)
dd2ea4
		return 0;
dd2ea4
	int size = busySize();
dd2ea4
	if (size <= 0)
dd2ea4
		return 0;
dd2ea4
	
dd2ea4
	int doneSize = 0;
460064
	int parts[2] = { size, 0 };
460064
	int p0 = ALLOCATED_SIZE - begin;
460064
	if (size > p0)
460064
		{ parts[0] = p0; parts[1] = size - p0; }
dd2ea4
	
dd2ea4
	for(int i = 0; i < 2; ++i) {
dd2ea4
		while(parts[i]) {
dd2ea4
			int res = Socket::tcpSendAsync(connection.tcpSockId, buffer + begin, parts[i]);
460064
			if (res <= 0) {
460064
				DebugMsg("%u, %d", connection.id.id, doneSize);
dd2ea4
				return doneSize;
460064
			}
dd2ea4
			doneSize += res;
dd2ea4
			begin += res;
dd2ea4
			parts[i] -= res;
dd2ea4
		}
873e9f
		if (begin >= ALLOCATED_SIZE) begin = 0;
dd2ea4
	}
460064
	
460064
	DebugMsg("%u, %d", connection.id.id, doneSize);
dd2ea4
	return doneSize;
dd2ea4
}
460064