Program Listing for File messages.cpp

Return to documentation for file (blam\components\networking\messages.cpp)

#include "messages.h"

#include "components\core\engine_definitions\engine_definitions.h"

BYTE Blam::Reader::ReadByte(UINT8** buffer)
{
    BYTE value = -1;

    value = **buffer;
    *buffer = *buffer + 1;

    return value;
}

UINT16 Blam::Reader::ReadShort(UINT8** buffer)
{
    UINT16 value = -1;

    memcpy(&value, *buffer, sizeof(value));
    *buffer = *buffer + sizeof(value);

    value = ntohs(value);

    return value;
}

UINT32 Blam::Reader::ReadInt(UINT8** buffer)
{
    UINT32 value = -1;

    memcpy(&value, *buffer, sizeof(value));
    *buffer = *buffer + sizeof(value);

    value = ntohs(value);

    return value;
}

UINT64 Blam::Reader::ReadLong(UINT8** buffer)
{
    UINT64 value = -1;

    memcpy(&value, *buffer, sizeof(value));
    *buffer = *buffer + sizeof(value);

    value = ntohs(value);

    return value;
}

const char* Blam::Reader::ReadString(UINT8** buffer)
{
    const char* value = "";

    memcpy(&value, *buffer, strlen(value));
    *buffer = *buffer + strlen(value);

    return value;
}

static void Blam::Writer::WriteByte(UINT8** buffer, UINT8 value)
{
    **buffer = value;
    *buffer = *buffer + 1;
}

static void Blam::Writer::WriteShort(UINT8** buffer, UINT16 value)
{
    value = ntohs(value);

    memcpy(*buffer, &value, sizeof(value));
    *buffer = *buffer + sizeof(value);
}

static void Blam::Writer::WriteInt(UINT8** buffer, UINT32 value)
{
    value = ntohl(value);

    memcpy(*buffer, &value, sizeof(value));
    *buffer = *buffer + sizeof(value);
}

static void Blam::Writer::WriteLong(UINT8** buffer, UINT64 value)
{
    value = ntohl(value);

    memcpy(*buffer, &value, sizeof(value));
    *buffer = *buffer + sizeof(value);
}

static void Blam::Writer::WriteString(UINT8** buffer, const char* value)
{
    // IF statement is a precaution if the client doesn't know what to write (nullptr) so we send a "null" string
    // It's there to prevent memcpy from having a bitch fit in other words...
    if (value == nullptr || value == NULL)
    {
        void const* value = reinterpret_cast<void const*>(-1);

        memcpy(*buffer, &value, sizeof(&value));

        *buffer = *buffer + sizeof(&value);
    }
    else
    {
        UINT32 length = strlen(value);

        WriteInt(buffer, length);

        memcpy(*buffer, value, strlen(value));

        *buffer = *buffer + strlen(value);
    }
}

UINT32 Blam::Network::ClientHelloMessage(UINT8* buffer)
{
    UINT8* bufferIter = buffer;

    Writer::WriteShort(&bufferIter, ClientHello);
    Writer::WriteString(&bufferIter, EngineDefs::GetVersion());
    Writer::WriteShort(&bufferIter, 0);
    Writer::WriteInt(&bufferIter, 1);
    Writer::WriteLong(&bufferIter, 2);

    return (UINT32)(bufferIter - buffer); // length
}

UINT32 Blam::Network::KeepAliveMessage(UINT8* buffer)
{
    UINT8* bufferIter = buffer;

    Writer::WriteShort(&bufferIter, KeepAlive);
    Writer::WriteString(&bufferIter, __TIME__);

    return (UINT32)(bufferIter - buffer);
}