2021-10-20 20:31:14 +02:00
|
|
|
#include "CustomPacketChunk.h"
|
2021-10-17 08:58:46 +02:00
|
|
|
|
|
|
|
|
#include <string>
|
|
|
|
|
|
2021-10-20 20:35:46 +02:00
|
|
|
CustomPacketChunk::CustomPacketChunk(CustomPacketChunk const& other)
|
2021-10-23 12:09:38 +02:00
|
|
|
: m_size(other.m_size)
|
|
|
|
|
, m_chunk(other.m_chunk)
|
2021-10-17 08:58:46 +02:00
|
|
|
{}
|
|
|
|
|
|
2021-10-22 06:31:08 +02:00
|
|
|
CustomPacketChunk::CustomPacketChunk(chunkSize_t size, char* chunk)
|
2021-10-23 12:09:38 +02:00
|
|
|
: m_size(size)
|
|
|
|
|
, m_chunk(chunk)
|
2021-10-17 08:58:46 +02:00
|
|
|
{}
|
|
|
|
|
|
2021-10-22 06:31:08 +02:00
|
|
|
CustomPacketChunk::CustomPacketChunk(chunkSize_t size)
|
2021-10-23 12:09:38 +02:00
|
|
|
: m_size(size)
|
|
|
|
|
, m_chunk(new char[size + CustomHeaderSize])
|
2021-10-17 08:58:46 +02:00
|
|
|
{}
|
|
|
|
|
|
2021-10-20 20:35:46 +02:00
|
|
|
CustomPacketChunk::CustomPacketChunk() : CustomPacketChunk(0, nullptr)
|
2021-10-17 08:58:46 +02:00
|
|
|
{}
|
|
|
|
|
|
2021-10-20 20:35:46 +02:00
|
|
|
void CustomPacketChunk::Destroy()
|
2021-10-17 08:58:46 +02:00
|
|
|
{
|
2021-10-23 12:09:38 +02:00
|
|
|
delete[] m_chunk;
|
2021-10-17 08:58:46 +02:00
|
|
|
}
|
|
|
|
|
|
2021-10-20 20:35:46 +02:00
|
|
|
char* CustomPacketChunk::Data()
|
2021-10-17 08:58:46 +02:00
|
|
|
{
|
2021-10-23 12:09:38 +02:00
|
|
|
return m_chunk;
|
2021-10-17 08:58:46 +02:00
|
|
|
}
|
|
|
|
|
|
2021-10-20 20:35:46 +02:00
|
|
|
CustomPacketHeader* CustomPacketChunk::Header()
|
2021-10-17 08:58:46 +02:00
|
|
|
{
|
2021-10-23 12:09:38 +02:00
|
|
|
return (CustomPacketHeader*)m_chunk;
|
2021-10-17 08:58:46 +02:00
|
|
|
}
|
|
|
|
|
|
2021-10-22 06:31:08 +02:00
|
|
|
void CustomPacketChunk::Increase(chunkSize_t size)
|
2021-10-17 08:58:46 +02:00
|
|
|
{
|
2021-10-23 12:09:38 +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
|
|
|
}
|
|
|
|
|
|
2021-10-22 06:31:08 +02:00
|
|
|
chunkSize_t CustomPacketChunk::FullSize()
|
2021-10-17 08:58:46 +02:00
|
|
|
{
|
2021-10-23 12:09:38 +02:00
|
|
|
return Size() + CustomHeaderSize;
|
2021-10-17 08:58:46 +02:00
|
|
|
}
|
|
|
|
|
|
2021-10-22 06:31:08 +02:00
|
|
|
chunkSize_t CustomPacketChunk::Size()
|
2021-10-17 08:58:46 +02:00
|
|
|
{
|
2021-10-23 12:09:38 +02:00
|
|
|
return m_size;
|
2021-10-17 08:58:46 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// how many bytes we have left to write
|
2021-10-22 06:31:08 +02:00
|
|
|
chunkSize_t CustomPacketChunk::RemBytes(chunkSize_t idx)
|
2021-10-17 08:58:46 +02:00
|
|
|
{
|
2021-10-23 12:09:38 +02:00
|
|
|
return m_size - idx;
|
2021-10-17 08:58:46 +02:00
|
|
|
}
|
|
|
|
|
|
2021-10-22 06:31:08 +02:00
|
|
|
char* CustomPacketChunk::Offset(chunkSize_t offset)
|
2021-10-17 08:58:46 +02:00
|
|
|
{
|
2021-10-23 12:09:38 +02:00
|
|
|
return m_chunk + CustomHeaderSize + offset;
|
2021-10-17 08:58:46 +02:00
|
|
|
}
|
|
|
|
|
|
2021-10-22 06:31:08 +02:00
|
|
|
void CustomPacketChunk::WriteBytes(chunkSize_t idx, chunkSize_t size, char const* value)
|
2021-10-17 08:58:46 +02:00
|
|
|
{
|
2021-10-23 12:09:38 +02:00
|
|
|
memcpy(Offset(idx), value, size);
|
2021-10-17 08:58:46 +02:00
|
|
|
}
|
|
|
|
|
|
2021-10-22 06:31:08 +02:00
|
|
|
void CustomPacketChunk::ReadBytes(chunkSize_t idx, chunkSize_t size, char* out)
|
2021-10-17 08:58:46 +02:00
|
|
|
{
|
2021-10-23 12:09:38 +02:00
|
|
|
memcpy(out, Offset(idx), size);
|
2021-10-17 08:58:46 +02:00
|
|
|
}
|
|
|
|
|
|
2021-10-20 20:35:46 +02:00
|
|
|
void CustomPacketChunk::Print(
|
2021-10-23 12:09:38 +02:00
|
|
|
std::function<void(std::ostream&, uint8_t)> fn
|
|
|
|
|
, std::ostream& stream
|
|
|
|
|
, size_t indent
|
2021-10-17 08:58:46 +02:00
|
|
|
) {
|
2021-10-23 12:09:38 +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
|
|
|
}
|
|
|
|
|
|
2021-10-20 20:35:46 +02:00
|
|
|
void CustomPacketChunk::PrintBytes(
|
2021-10-23 12:09:38 +02:00
|
|
|
std::ostream& stream
|
|
|
|
|
, size_t indent
|
2021-10-17 08:58:46 +02:00
|
|
|
) {
|
2021-10-23 12:09:38 +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
|
|
|
}
|
|
|
|
|
|
2021-10-20 20:35:46 +02:00
|
|
|
void CustomPacketChunk::PrintAscii(
|
2021-10-23 12:09:38 +02:00
|
|
|
std::ostream& stream
|
|
|
|
|
, size_t indent
|
2021-10-17 08:58:46 +02:00
|
|
|
) {
|
2021-10-23 12:09:38 +02:00
|
|
|
return Print([](auto& stream, uint8_t byte) {
|
|
|
|
|
stream << char(byte);
|
|
|
|
|
}, stream, indent);
|
2021-10-17 08:58:46 +02:00
|
|
|
}
|
|
|
|
|
|
2021-10-22 06:31:08 +02:00
|
|
|
void CustomPacketChunk::Copy()
|
|
|
|
|
{
|
2021-10-23 12:09:38 +02:00
|
|
|
char* old = m_chunk;
|
|
|
|
|
m_chunk = new char[FullSize()];
|
|
|
|
|
memcpy(m_chunk, old, FullSize());
|
2021-10-22 06:31:08 +02:00
|
|
|
}
|