2016-05-28 18:54:45 +02:00
|
|
|
/*****************************************************************************
|
2024-01-01 12:52:28 +01:00
|
|
|
* Copyright (c) 2014-2024 OpenRCT2 developers
|
2016-05-28 18:54:45 +02:00
|
|
|
*
|
2018-06-15 14:07:34 +02:00
|
|
|
* For a complete list of all authors, please refer to contributors.md
|
|
|
|
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
|
2016-05-28 18:54:45 +02:00
|
|
|
*
|
2018-06-15 14:07:34 +02:00
|
|
|
* OpenRCT2 is licensed under the GNU General Public License version 3.
|
2016-05-28 18:54:45 +02:00
|
|
|
*****************************************************************************/
|
|
|
|
|
2016-05-28 23:27:08 +02:00
|
|
|
#ifndef DISABLE_NETWORK
|
|
|
|
|
2018-07-21 16:17:06 +02:00
|
|
|
# include "NetworkPacket.h"
|
2016-05-28 18:54:45 +02:00
|
|
|
|
2018-07-21 16:17:06 +02:00
|
|
|
# include "NetworkTypes.h"
|
2018-06-22 23:02:47 +02:00
|
|
|
|
2018-07-21 16:17:06 +02:00
|
|
|
# include <memory>
|
2017-12-03 23:45:43 +01:00
|
|
|
|
2022-02-09 21:57:25 +01:00
|
|
|
NetworkPacket::NetworkPacket(NetworkCommand id) noexcept
|
2020-08-02 23:34:02 +02:00
|
|
|
: Header{ 0, id }
|
2020-08-02 22:31:00 +02:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2022-02-09 21:57:25 +01:00
|
|
|
uint8_t* NetworkPacket::GetData() noexcept
|
2016-05-28 18:54:45 +02:00
|
|
|
{
|
2020-08-02 22:07:47 +02:00
|
|
|
return Data.data();
|
2016-05-28 18:54:45 +02:00
|
|
|
}
|
|
|
|
|
2022-02-09 21:57:25 +01:00
|
|
|
const uint8_t* NetworkPacket::GetData() const noexcept
|
2016-05-28 18:54:45 +02:00
|
|
|
{
|
2020-08-02 22:07:47 +02:00
|
|
|
return Data.data();
|
2016-05-28 18:54:45 +02:00
|
|
|
}
|
|
|
|
|
2022-02-09 21:57:25 +01:00
|
|
|
NetworkCommand NetworkPacket::GetCommand() const noexcept
|
2016-05-28 18:54:45 +02:00
|
|
|
{
|
2020-08-02 23:34:02 +02:00
|
|
|
return Header.Id;
|
2016-05-28 18:54:45 +02:00
|
|
|
}
|
|
|
|
|
2022-02-09 21:57:25 +01:00
|
|
|
void NetworkPacket::Clear() noexcept
|
2016-05-28 18:54:45 +02:00
|
|
|
{
|
2017-01-12 18:45:48 +01:00
|
|
|
BytesTransferred = 0;
|
|
|
|
BytesRead = 0;
|
2020-08-02 22:07:47 +02:00
|
|
|
Data.clear();
|
2016-05-28 18:54:45 +02:00
|
|
|
}
|
|
|
|
|
2022-02-09 21:57:25 +01:00
|
|
|
bool NetworkPacket::CommandRequiresAuth() const noexcept
|
2016-05-28 18:54:45 +02:00
|
|
|
{
|
2018-06-22 23:02:47 +02:00
|
|
|
switch (GetCommand())
|
|
|
|
{
|
2020-07-28 18:24:40 +02:00
|
|
|
case NetworkCommand::Ping:
|
|
|
|
case NetworkCommand::Auth:
|
|
|
|
case NetworkCommand::Token:
|
|
|
|
case NetworkCommand::GameInfo:
|
|
|
|
case NetworkCommand::ObjectsList:
|
2023-03-06 13:50:05 +01:00
|
|
|
case NetworkCommand::ScriptsHeader:
|
|
|
|
case NetworkCommand::ScriptsData:
|
2020-07-28 18:24:40 +02:00
|
|
|
case NetworkCommand::MapRequest:
|
|
|
|
case NetworkCommand::Heartbeat:
|
2018-06-22 23:02:47 +02:00
|
|
|
return false;
|
|
|
|
default:
|
|
|
|
return true;
|
2016-05-28 18:54:45 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-08-02 22:07:47 +02:00
|
|
|
void NetworkPacket::Write(const void* bytes, size_t size)
|
2016-05-28 18:54:45 +02:00
|
|
|
{
|
2020-08-02 22:07:47 +02:00
|
|
|
const uint8_t* src = reinterpret_cast<const uint8_t*>(bytes);
|
|
|
|
Data.insert(Data.end(), src, src + size);
|
2016-05-28 18:54:45 +02:00
|
|
|
}
|
|
|
|
|
2021-09-17 22:46:58 +02:00
|
|
|
void NetworkPacket::WriteString(std::string_view s)
|
2016-05-28 18:54:45 +02:00
|
|
|
{
|
2021-09-17 22:46:58 +02:00
|
|
|
Write(s.data(), s.size());
|
|
|
|
Data.push_back(0);
|
2016-05-28 18:54:45 +02:00
|
|
|
}
|
|
|
|
|
2018-06-22 23:02:47 +02:00
|
|
|
const uint8_t* NetworkPacket::Read(size_t size)
|
2016-05-28 18:54:45 +02:00
|
|
|
{
|
2021-08-06 17:16:24 +02:00
|
|
|
if (BytesRead + size > Data.size())
|
2016-05-28 18:54:45 +02:00
|
|
|
{
|
|
|
|
return nullptr;
|
|
|
|
}
|
2021-09-15 22:22:15 +02:00
|
|
|
|
|
|
|
const uint8_t* data = Data.data() + BytesRead;
|
|
|
|
BytesRead += size;
|
|
|
|
return data;
|
2016-05-28 18:54:45 +02:00
|
|
|
}
|
|
|
|
|
2021-09-17 22:46:58 +02:00
|
|
|
std::string_view NetworkPacket::ReadString()
|
2016-05-28 18:54:45 +02:00
|
|
|
{
|
2021-08-06 17:16:24 +02:00
|
|
|
if (BytesRead >= Data.size())
|
2021-09-17 22:46:58 +02:00
|
|
|
return {};
|
2021-08-06 17:16:24 +02:00
|
|
|
|
|
|
|
const char* str = reinterpret_cast<const char*>(Data.data() + BytesRead);
|
|
|
|
|
|
|
|
size_t stringLen = 0;
|
|
|
|
while (BytesRead < Data.size() && str[stringLen] != '\0')
|
2016-05-28 18:54:45 +02:00
|
|
|
{
|
2017-01-12 18:45:48 +01:00
|
|
|
BytesRead++;
|
2021-08-06 17:16:24 +02:00
|
|
|
stringLen++;
|
2016-05-28 18:54:45 +02:00
|
|
|
}
|
2021-08-06 17:16:24 +02:00
|
|
|
|
|
|
|
if (str[stringLen] != '\0')
|
2021-09-17 22:46:58 +02:00
|
|
|
return {};
|
2021-08-06 17:16:24 +02:00
|
|
|
|
|
|
|
// Skip null terminator.
|
2017-01-12 18:45:48 +01:00
|
|
|
BytesRead++;
|
2021-08-06 17:16:24 +02:00
|
|
|
|
2021-09-17 22:46:58 +02:00
|
|
|
return std::string_view(str, stringLen);
|
2016-05-28 18:54:45 +02:00
|
|
|
}
|
2016-05-28 23:27:08 +02:00
|
|
|
|
|
|
|
#endif
|