Smallcase folders part 1
This commit is contained in:
@@ -0,0 +1,101 @@
|
||||
#include "Metrics/Host.h"
|
||||
|
||||
#include <stdexcept>
|
||||
#include <cstring>
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#include "Network/Common/Buffer.h"
|
||||
|
||||
namespace metrics
|
||||
{
|
||||
|
||||
// ---- Вспомогательные функции для float <-> uint32_t ----
|
||||
static uint32_t floatToNetwork(float f)
|
||||
{
|
||||
uint32_t tmp;
|
||||
static_assert(sizeof(tmp) == sizeof(f), "Size mismatch");
|
||||
std::memcpy(&tmp, &f, sizeof(f));
|
||||
return htonl(tmp);
|
||||
}
|
||||
|
||||
static float networkToFloat(uint32_t n)
|
||||
{
|
||||
uint32_t tmp = ntohl(n);
|
||||
float f;
|
||||
std::memcpy(&f, &tmp, sizeof(f));
|
||||
return f;
|
||||
}
|
||||
|
||||
// ---- Сериализация ----
|
||||
std::vector<uint8_t> Host::serialize() const
|
||||
{
|
||||
network::Buffer buf;
|
||||
|
||||
buf.writeUint8(1); // version
|
||||
buf.writeString(hostname);
|
||||
|
||||
// CPU
|
||||
buf.writeFloat(cpu.totalLoad);
|
||||
buf.writeUint8(static_cast<uint8_t>(cpu.coreLoads.size()));
|
||||
for (float f : cpu.coreLoads)
|
||||
buf.writeFloat(f);
|
||||
|
||||
// Memory
|
||||
buf.writeFloat(memory.mem_used);
|
||||
buf.writeFloat(memory.mem_total);
|
||||
buf.writeFloat(memory.swap_used);
|
||||
buf.writeFloat(memory.swap_total);
|
||||
|
||||
// Disks
|
||||
buf.writeUint8(static_cast<uint8_t>(disks.size()));
|
||||
for (const auto &d : disks)
|
||||
{
|
||||
buf.writeString(d.name);
|
||||
buf.writeFloat(d.used);
|
||||
buf.writeFloat(d.total);
|
||||
}
|
||||
|
||||
return buf.data();
|
||||
}
|
||||
|
||||
// ---- Десериализация ----
|
||||
Host Host::deserialize(const std::vector<uint8_t> &data)
|
||||
{
|
||||
Host h;
|
||||
network::Buffer buf(const_cast<std::vector<uint8_t> &>(data));
|
||||
|
||||
uint8_t version = buf.readUint8();
|
||||
if (version != 1)
|
||||
throw std::runtime_error("Unsupported protocol version");
|
||||
|
||||
h.hostname = buf.readString();
|
||||
|
||||
// CPU
|
||||
h.cpu.totalLoad = buf.readFloat();
|
||||
uint8_t numCpu = buf.readUint8();
|
||||
h.cpu.coreLoads.clear();
|
||||
h.cpu.coreLoads.reserve(numCpu);
|
||||
for (uint8_t i = 0; i < numCpu; ++i)
|
||||
h.cpu.coreLoads.push_back(buf.readFloat());
|
||||
|
||||
// Memory
|
||||
h.memory.mem_used = buf.readFloat();
|
||||
h.memory.mem_total = buf.readFloat();
|
||||
h.memory.swap_used = buf.readFloat();
|
||||
h.memory.swap_total = buf.readFloat();
|
||||
|
||||
// Disks
|
||||
uint8_t numDisks = buf.readUint8();
|
||||
h.disks.clear();
|
||||
h.disks.reserve(numDisks);
|
||||
for (uint8_t i = 0; i < numDisks; ++i)
|
||||
{
|
||||
std::string name = buf.readString();
|
||||
float used = buf.readFloat();
|
||||
float total = buf.readFloat();
|
||||
h.disks.push_back({name, used, total});
|
||||
}
|
||||
|
||||
return h;
|
||||
}
|
||||
} // namespace metrics
|
||||
Reference in New Issue
Block a user