|
 |
dd2ea4 |
|
|
 |
dd2ea4 |
|
|
 |
dd2ea4 |
#include <cstring></cstring>
|
|
 |
dd2ea4 |
|
|
 |
dd2ea4 |
#include "socket.h"
|
|
 |
dd2ea4 |
#include "connection.h"
|
|
 |
dd2ea4 |
#include "tcpqueue.h"
|
|
 |
dd2ea4 |
|
|
 |
dd2ea4 |
|
|
 |
dd2ea4 |
|
|
 |
460064 |
//
|
|
 |
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 |
|