|
|
f07ad6 |
|
|
|
f07ad6 |
#include "protocol.h"
|
|
|
f07ad6 |
#include "connection.h"
|
|
|
f07ad6 |
|
|
|
f07ad6 |
|
|
|
f07ad6 |
Connection::Connection():
|
|
|
f07ad6 |
socket(), lastId() { }
|
|
|
f07ad6 |
|
|
|
f07ad6 |
Connection::~Connection()
|
|
|
f07ad6 |
{ close(); }
|
|
|
f07ad6 |
|
|
|
f07ad6 |
|
|
|
f07ad6 |
Protocol& Connection::getProtocol() const
|
|
|
f07ad6 |
{ assert(socket); return socket->protocol; }
|
|
|
f07ad6 |
const Address& Connection::getRemoteAddress() const
|
|
|
f07ad6 |
{ assert(socket); return socket->address; }
|
|
|
f07ad6 |
Server* Connection::getServer() const
|
|
|
f07ad6 |
{ assert(socket); return socket->server; }
|
|
|
f07ad6 |
|
|
|
f07ad6 |
|
|
|
f07ad6 |
void Connection::open(Socket *socket) {
|
|
|
f07ad6 |
Lock lock(mutex);
|
|
|
f07ad6 |
close();
|
|
|
f07ad6 |
if (!socket) return;
|
|
|
f07ad6 |
this->socket = socket;
|
|
|
f07ad6 |
onOpen();
|
|
|
f07ad6 |
}
|
|
|
f07ad6 |
|
|
|
f07ad6 |
|
|
|
f07ad6 |
ErrorCode Connection::open(Protocol &protocol, const Address &remoteAddress)
|
|
|
f07ad6 |
{ return protocol.connect(*this, remoteAddress); }
|
|
|
f07ad6 |
|
|
|
f07ad6 |
|
|
|
f07ad6 |
void Connection::close(ErrorCode errorCode) {
|
|
|
f07ad6 |
Socket *socketCopy;
|
|
|
f07ad6 |
{
|
|
|
f07ad6 |
Lock lock(mutex);
|
|
|
f07ad6 |
if (!socket)
|
|
|
f07ad6 |
return;
|
|
|
f07ad6 |
if (!errorCode && (!readQueue.empty() || !writeQueue.empty()))
|
|
|
f07ad6 |
errorCode = ERR_CONNECTION_UNFINISHED_TASKS;
|
|
|
f07ad6 |
|
|
|
f07ad6 |
onClose(errorCode);
|
|
|
f07ad6 |
|
|
|
f07ad6 |
readQueue.clear();
|
|
|
f07ad6 |
writeQueue.clear();
|
|
|
f07ad6 |
socketCopy = socket;
|
|
|
f07ad6 |
socket = nullptr;
|
|
|
f07ad6 |
}
|
|
|
f07ad6 |
socketCopy->close();
|
|
|
f07ad6 |
}
|
|
|
f07ad6 |
|
|
|
f07ad6 |
|
|
|
f07ad6 |
Connection::ReqId Connection::writeReq(const void *data, size_t size, void *userData) {
|
|
|
f07ad6 |
if (!data || !size) return 0;
|
|
|
f07ad6 |
Lock lock(mutex);
|
|
|
f07ad6 |
if (!socket) return 0;
|
|
|
f07ad6 |
writeQueue.emplace_back(++lastId, userData, data, size);
|
|
|
f07ad6 |
return lastId;
|
|
|
f07ad6 |
}
|
|
|
f07ad6 |
|
|
|
f07ad6 |
|
|
|
f07ad6 |
Connection::ReqId Connection::readReq(void *data, size_t size, void *userData) {
|
|
|
f07ad6 |
if (!data || !size) return 0;
|
|
|
f07ad6 |
Lock lock(mutex);
|
|
|
f07ad6 |
if (!socket) return 0;
|
|
|
f07ad6 |
readQueue.emplace_back(++lastId, userData, data, size);
|
|
|
f07ad6 |
return lastId;
|
|
|
f07ad6 |
}
|
|
|
f07ad6 |
|
|
|
f07ad6 |
|
|
|
f07ad6 |
void Connection::onOpen() { }
|
|
|
f07ad6 |
void Connection::onClose(ErrorCode) { }
|
|
|
f07ad6 |
void Connection::onReadReady(const ReadReq&) { }
|
|
|
f07ad6 |
void Connection::onWriteReady(const WriteReq&) { }
|
|
|
f07ad6 |
|