95 lines
2.8 KiB
C++
95 lines
2.8 KiB
C++
#include "TCPSession.h"
|
|
#include "TCPServer.h"
|
|
#include "Exception.h"
|
|
#include "Log.h"
|
|
|
|
namespace core {
|
|
|
|
TCPSession::TCPSession(EPoll &ePoll, TCPServer &server, std::string text) : TCPSocket(ePoll, text), server(server) {}
|
|
|
|
TCPSession::~TCPSession() {
|
|
server.removeFromSessionList(this);
|
|
server.subscriptions.removeSessionSubscriptions(*this);
|
|
}
|
|
|
|
void TCPSession::output(std::stringstream &data) {
|
|
data << "|" << ipAddress.getClientAddressAndPort();
|
|
}
|
|
|
|
void TCPSession::protocol(coreutils::ZString &data) {
|
|
if(server.commands.processRequest(data, *this) == 0)
|
|
coreutils::Log(coreutils::LOG_DEBUG_1) << "Received data could not be parsed: " << getDescriptor() << " [" << data.str() << "]";
|
|
}
|
|
|
|
void TCPSession::onRegistered() {
|
|
onConnected();
|
|
// coreutils::ZString blank("");
|
|
// protocol(blank);
|
|
send();
|
|
if(term)
|
|
shutdown("termination requested");
|
|
}
|
|
|
|
void TCPSession::onConnected() {}
|
|
|
|
void TCPSession::onDataReceived(coreutils::ZString &data) {
|
|
if(data.getLength() > 0) {
|
|
lineBuffer = (char *)realloc(lineBuffer, lineBufferSize + data.getLength());
|
|
memcpy(lineBuffer + lineBufferSize, data.getData(), data.getLength());
|
|
lineBufferSize += data.getLength();
|
|
while(lineBufferSize > 0) {
|
|
if(blockSize == 0) {
|
|
lineLength = strcspn(lineBuffer, "\r\n");
|
|
if(lineLength == lineBufferSize)
|
|
break;
|
|
coreutils::ZString zLine(lineBuffer, lineLength);
|
|
onLineReceived(zLine);
|
|
if(lineBuffer[lineLength] == '\r')
|
|
++lineLength;
|
|
if(lineBuffer[lineLength] == '\n')
|
|
++lineLength;
|
|
lineBufferSize -= lineLength;
|
|
if(lineBufferSize > 0)
|
|
memmove(lineBuffer, lineBuffer + lineLength, lineBufferSize);
|
|
lineBuffer = (char *)realloc(lineBuffer, lineBufferSize);
|
|
} else if(lineBufferSize >= blockLength) {
|
|
coreutils::ZString zBlock(lineBuffer, blockLength);
|
|
onBlockReceived(zBlock);
|
|
lineBufferSize -= blockLength;
|
|
if(lineBufferSize > 0)
|
|
memmove(lineBuffer, lineBuffer + blockLength, lineBufferSize);
|
|
lineBuffer = (char *)realloc(lineBuffer, lineBufferSize);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void TCPSession::setBlockSize(int blockSize) {
|
|
this->blockSize = blockSize;
|
|
}
|
|
|
|
void TCPSession::onLineReceived(coreutils::ZString &line) {
|
|
protocol(line);
|
|
send();
|
|
if(term)
|
|
shutdown("termination requested");
|
|
}
|
|
|
|
void TCPSession::onBlockReceived(coreutils::ZString &block) {
|
|
coreutils::Log(coreutils::LOG_DEBUG_3) << "[" << block.getLength() << "]";
|
|
if(term)
|
|
shutdown("termination requested");
|
|
}
|
|
|
|
void TCPSession::send() {
|
|
if(out.tellp() > 0)
|
|
write(out.str(), this);
|
|
out.str("");
|
|
}
|
|
|
|
void TCPSession::terminate() {
|
|
term = true;
|
|
}
|
|
|
|
}
|