Changeset View
Changeset View
Standalone View
Standalone View
source/network/NetHost.cpp
/* Copyright (C) 2010 Wildfire Games. | /* Copyright (C) 2017 Wildfire Games. | ||||
* This file is part of 0 A.D. | * This file is part of 0 A.D. | ||||
* | * | ||||
* 0 A.D. is free software: you can redistribute it and/or modify | * 0 A.D. is free software: you can redistribute it and/or modify | ||||
* it under the terms of the GNU General Public License as published by | * it under the terms of the GNU General Public License as published by | ||||
* the Free Software Foundation, either version 2 of the License, or | * the Free Software Foundation, either version 2 of the License, or | ||||
* (at your option) any later version. | * (at your option) any later version. | ||||
* | * | ||||
* 0 A.D. is distributed in the hope that it will be useful, | * 0 A.D. is distributed in the hope that it will be useful, | ||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
* GNU General Public License for more details. | * GNU General Public License for more details. | ||||
* | * | ||||
* You should have received a copy of the GNU General Public License | * You should have received a copy of the GNU General Public License | ||||
* along with 0 A.D. If not, see <http://www.gnu.org/licenses/>. | * along with 0 A.D. If not, see <http://www.gnu.org/licenses/>. | ||||
*/ | */ | ||||
#include "precompiled.h" | #include "precompiled.h" | ||||
#include "NetHost.h" | #include "NetHost.h" | ||||
#include "NetMessageBuffer.h" | |||||
#include "lib/external_libraries/enet.h" | #include "lib/external_libraries/enet.h" | ||||
#include "network/NetMessage.h" | |||||
#include "ps/CLogger.h" | #include "ps/CLogger.h" | ||||
bool CNetHost::SendMessage(const CNetMessage* message, ENetPeer* peer, const char* peerName) | bool CNetHost::SendMessage(const CNetMessageBuffer& message, ENetPeer* peer, const char* peerName) | ||||
{ | { | ||||
ENetPacket* packet = CreatePacket(message); | ENetPacket* packet = CreatePacket(message); | ||||
if (!packet) | if (!packet) | ||||
return false; | return false; | ||||
LOGMESSAGE("Net: Sending message %s of size %lu to %s", message->ToString().c_str(), (unsigned long)packet->dataLength, peerName); | LOGMESSAGE("Net: Sending message of size %lu to %s", (unsigned long)packet->dataLength, peerName); | ||||
// Let ENet send the message to peer | // Let ENet send the message to peer | ||||
if (enet_peer_send(peer, DEFAULT_CHANNEL, packet) < 0) | if (enet_peer_send(peer, DEFAULT_CHANNEL, packet) < 0) | ||||
{ | { | ||||
LOGERROR("Net: Failed to send packet to peer"); | LOGERROR("Net: Failed to send packet to peer"); | ||||
return false; | return false; | ||||
} | } | ||||
// Don't call enet_host_flush now - let it queue up all the packets | // Don't call enet_host_flush now - let it queue up all the packets | ||||
// and send them during the next frame | // and send them during the next frame | ||||
// | // | ||||
// TODO: we should flush explicitly at some appropriate point before the next frame | // TODO: we should flush explicitly at some appropriate point before the next frame | ||||
return true; | return true; | ||||
} | } | ||||
ENetPacket* CNetHost::CreatePacket(const CNetMessage* message) | ENetPacket* CNetHost::CreatePacket(const CNetMessageBuffer& message) | ||||
{ | { | ||||
size_t size = message->GetSerializedLength(); | |||||
ENSURE(size); // else we'll fail when accessing the 0th element | |||||
// Adjust buffer for message | |||||
std::vector<u8> buffer; | |||||
buffer.resize(size); | |||||
// Save message to internal buffer | |||||
message->Serialize(&buffer[0]); | |||||
// Create a reliable packet | // Create a reliable packet | ||||
leper: `!buffer.empty()` | |||||
ENetPacket* packet = enet_packet_create(&buffer[0], size, ENET_PACKET_FLAG_RELIABLE); | ENetPacket* packet = enet_packet_create(message.GetData(), message.GetSize(), ENET_PACKET_FLAG_RELIABLE); | ||||
Done Inline ActionsAlso that ENSURE above might not even be needed anymore, since we aren't really accessing buffer[0] anymore. It could still be needed depending on what enet does here leper: Also that `ENSURE` above might not even be needed anymore, since we aren't really accessing… | |||||
Not Done Inline ActionsThe check is moved to the GetData function on the NetMessageBuffer, but it probably still isn't really needed. echotangoecho: The check is moved to the `GetData` function on the `NetMessageBuffer`, but it probably still… | |||||
if (!packet) | if (!packet) | ||||
LOGERROR("Net: Failed to construct packet"); | LOGERROR("Net: Failed to construct packet"); | ||||
return packet; | return packet; | ||||
} | } | ||||
void CNetHost::Initialize() | void CNetHost::Initialize() | ||||
{ | { | ||||
int ret = enet_initialize(); | int ret = enet_initialize(); | ||||
ENSURE(ret == 0); | ENSURE(ret == 0); | ||||
} | } | ||||
void CNetHost::Deinitialize() | void CNetHost::Deinitialize() | ||||
{ | { | ||||
enet_deinitialize(); | enet_deinitialize(); | ||||
} | } |
Wildfire Games · Phabricator
!buffer.empty()