/* static */ void Server :: receiveHandler(NetworkClient* aClient, uint8_t* aBuf, size_t aLen) { if (aClient != nullptr && aBuf != nullptr) { if (aLen < sizeof(Msg::Header)) return; uint8_t* received = new uint8_t[aLen]; memcpy(received, aBuf, aLen); // TODO? clean this line and add some checks Client* client = (Client*)aClient->getOwner(); client->getCipher().decrypt(received, aLen); size_t size = 0; for (size_t i = 0; i < aLen; i += size) { #if BYTE_ORDER == BIG_ENDIAN size = bswap16(((Msg::Header*)(received + i))->Length); #else size = ((Msg::Header*)(received + i))->Length; #endif ASSERT(size <= 1024); // invalid msg size... if (size < aLen) { uint8_t* packet = new uint8_t[size]; memcpy(packet, received + i, size); #if BYTE_ORDER == BIG_ENDIAN Msg::Header* header = (Msg::Header*)packet; header->Length = bswap16(header->Length); header->Type = bswap16(header->Type); #endif Msg* msg = nullptr; Msg::create(&msg, &packet, size); msg->process(client); SAFE_DELETE(msg); SAFE_DELETE_ARRAY(packet); } else { #if BYTE_ORDER == BIG_ENDIAN Msg::Header* header = (Msg::Header*)received; header->Length = bswap16(header->Length); header->Type = bswap16(header->Type); #endif Msg* msg = nullptr; Msg::create(&msg, &received, size); msg->process(client); SAFE_DELETE(msg); } } SAFE_DELETE_ARRAY(received); } }