tswow/misc/client-extensions/CustomPackets/CustomPacketChunk.cpp

135 lines
2.9 KiB
C++
Raw Permalink Normal View History

2021-10-20 20:31:14 +02:00
#include "CustomPacketChunk.h"
2021-10-17 08:58:46 +02:00
#include <string>
CustomPacketChunk::CustomPacketChunk(CustomPacketChunk const& other)
: m_size(other.m_size)
, m_chunk(other.m_chunk)
2021-10-17 08:58:46 +02:00
{}
CustomPacketChunk::CustomPacketChunk(chunkSize_t size, char* chunk)
: m_size(size)
, m_chunk(chunk)
2021-10-17 08:58:46 +02:00
{}
CustomPacketChunk::CustomPacketChunk(chunkSize_t size)
: m_size(size)
, m_chunk(new char[size + CustomHeaderSize])
2021-10-17 08:58:46 +02:00
{}
CustomPacketChunk::CustomPacketChunk() : CustomPacketChunk(0, nullptr)
2021-10-17 08:58:46 +02:00
{}
void CustomPacketChunk::Destroy()
2021-10-17 08:58:46 +02:00
{
delete[] m_chunk;
2021-10-17 08:58:46 +02:00
}
char* CustomPacketChunk::Data()
2021-10-17 08:58:46 +02:00
{
return m_chunk;
2021-10-17 08:58:46 +02:00
}
CustomPacketHeader* CustomPacketChunk::Header()
2021-10-17 08:58:46 +02:00
{
return (CustomPacketHeader*)m_chunk;
2021-10-17 08:58:46 +02:00
}
void CustomPacketChunk::Increase(chunkSize_t size)
2021-10-17 08:58:46 +02:00
{
if (m_chunk == nullptr)
{
m_chunk = new char[size + CustomHeaderSize];
}
else
{
char* old = m_chunk;
m_chunk = new char[m_size + size + CustomHeaderSize];
memcpy(m_chunk, old, m_size + CustomHeaderSize);
m_size = m_size + size;
delete old;
}
2021-10-17 08:58:46 +02:00
}
chunkSize_t CustomPacketChunk::FullSize()
2021-10-17 08:58:46 +02:00
{
return Size() + CustomHeaderSize;
2021-10-17 08:58:46 +02:00
}
chunkSize_t CustomPacketChunk::Size()
2021-10-17 08:58:46 +02:00
{
return m_size;
2021-10-17 08:58:46 +02:00
}
// how many bytes we have left to write
chunkSize_t CustomPacketChunk::RemBytes(chunkSize_t idx)
2021-10-17 08:58:46 +02:00
{
return m_size - idx;
2021-10-17 08:58:46 +02:00
}
char* CustomPacketChunk::Offset(chunkSize_t offset)
2021-10-17 08:58:46 +02:00
{
return m_chunk + CustomHeaderSize + offset;
2021-10-17 08:58:46 +02:00
}
void CustomPacketChunk::WriteBytes(chunkSize_t idx, chunkSize_t size, char const* value)
2021-10-17 08:58:46 +02:00
{
memcpy(Offset(idx), value, size);
2021-10-17 08:58:46 +02:00
}
void CustomPacketChunk::ReadBytes(chunkSize_t idx, chunkSize_t size, char* out)
2021-10-17 08:58:46 +02:00
{
memcpy(out, Offset(idx), size);
2021-10-17 08:58:46 +02:00
}
void CustomPacketChunk::Print(
std::function<void(std::ostream&, uint8_t)> fn
, std::ostream& stream
, size_t indent
2021-10-17 08:58:46 +02:00
) {
std::string spaces = std::string(indent, ' ');
for (size_t i = 0; i < indent; ++i)
{
stream << ' ';
}
stream << "chunk [ header (";
for (size_t i = 0; i < CustomHeaderSize; ++i)
{
fn(stream, m_chunk[i]);
if (i < CustomHeaderSize - 1) stream << ",";
}
stream << "), ";
for (chunkSize_t i = 0; i < m_size; ++i)
{
fn(stream, Offset(i)[0]);
// cast: loop already ensures it won't be negative
if (i < chunkSize_t(m_size - 1)) stream << ",";
}
stream << "]\n";
2021-10-17 08:58:46 +02:00
}
void CustomPacketChunk::PrintBytes(
std::ostream& stream
, size_t indent
2021-10-17 08:58:46 +02:00
) {
return Print([](auto& stream, uint8_t byte) {
stream << "0x" << std::hex << uint32_t(byte);
}, stream, indent);
2021-10-17 08:58:46 +02:00
}
void CustomPacketChunk::PrintAscii(
std::ostream& stream
, size_t indent
2021-10-17 08:58:46 +02:00
) {
return Print([](auto& stream, uint8_t byte) {
stream << char(byte);
}, stream, indent);
2021-10-17 08:58:46 +02:00
}
void CustomPacketChunk::Copy()
{
char* old = m_chunk;
m_chunk = new char[FullSize()];
memcpy(m_chunk, old, FullSize());
}