1#include "ConnectionHub.h"
3#if !defined( EMSCRIPTEN )
5#include "../Logging/Logger.h"
10using namespace std::chrono_literals;
16bool Cogs::Network::ConnectionHub::processOutgoing() {
19 if (!outgoingMessage) {
22 if (outgoingMessage) {
23 Header header = { outgoingMessage->getID(), outgoingMessage->size() };
24 char* ptr =
reinterpret_cast<char*
>(&header);
27 for (uint64_t remaining =
sizeof(header); remaining; ) {
32 remaining -= bytessent;
37 outgoingMessage =
nullptr;
38 LOG_ERROR(logger,
"Failed to send message header to remote host. Forcing disconnect.");
42 std::this_thread::sleep_for(1ms);
46 outgoingMessage =
nullptr;
55 if (bytesSent < outgoingMessage->size()) {
57 const char* ptr =
reinterpret_cast<const char*
>(outgoingMessage->data()) + bytesSent;
61 bytesSent += justSent;
68 outgoingMessage =
nullptr;
73 if (bytesSent >= outgoingMessage->size()) {
74 outgoingMessage =
nullptr;
79 outgoingMessage =
nullptr;
88 if (!incomingMessage) {
90 char* dest =
reinterpret_cast<char*
>(&header);
92 for (uint64_t remaining =
sizeof(header); remaining; ) {
93 uint64_t bytesReceived;
96 remaining -= bytesReceived;
97 dest += bytesReceived;
104 incomingMessage->resize(header.size,
false);
107 uint64_t remaining = incomingMessage->unreadSize();
108 char* dest =
reinterpret_cast<char*
>(incomingMessage->data()) + incomingMessage->pos();
111 uint64_t bytesReceived;
115 incomingMessage->seek(bytesReceived, Cogs::Memory::MemoryBuffer::Anchor::Current);
116 remaining -= bytesReceived;
117 dest += bytesReceived;
128 incomingMessage->seek(0, Cogs::Memory::MemoryBuffer::Anchor::Start);
129 handleReceivedMessage(incomingMessage);
130 incomingMessage =
nullptr;
135void Cogs::Network::ConnectionHub::handleReceivedMessage(
const Message::Ptr& message) {
136 sendMessage(message);
144 incomingMessage =
nullptr;
145 outgoingMessage =
nullptr;
Log implementation class.
bool receive(void *buffer, uint64_t byteCount, uint64_t &bytesReceived)
Attempts to read the specified number of bytes from the network socket this connection represents.
bool send(const void *data, uint64_t byteCount, uint64_t &bytesSent)
Attempts to send as much of the specified data as possible.
virtual bool disconnect() override
Called in response to a problem with the network, or a request by the application to disconnect.
virtual bool processIncoming() override
Manages accepting incoming connections when this connection is a listener.
virtual bool disconnect() override
Disconnects this connection.
Message::Ptr getNextMessage()
Retrieves the next pending message.
static Ptr allocate(uint32_t id)
Retrieves an existing message from the pool, or creates a new one if the pool is empty.
constexpr Log getLogger(const char(&name)[LEN]) noexcept