#pragma once #include "ByteArrayProvider.h" #include "DateTimeObject.h" #include "StringExtensions.h" #include namespace Incart::DeviceComplexCommands { struct IInfoMapItem { virtual ~IInfoMapItem(){} std::vector toBytes() { std::vector bytes; std::vector dataBytes = getDataBytes(); bytes.push_back(static_cast(dataBytes.size() + 1)); bytes.push_back(getTag()); bytes.insert(bytes.end(), dataBytes.begin(), dataBytes.end()); return bytes; } protected: virtual uint8_t getTag() const=0; virtual std::vector getDataBytes() const=0; }; template struct InfoMapItem : public IInfoMapItem { T data; InfoMapItem(const T& data_) : data(data_) { } }; struct InfoMapIntItem final : public InfoMapItem { public: InfoMapIntItem(int32_t data_) : InfoMapItem(data_) { } protected: uint8_t getTag() const override { return static_cast('d'); } std::vector getDataBytes() const override { std::vector bytes; Common::ByteArrayProvider::addDWord(static_cast(data), bytes); return bytes; } }; struct InfoMapDateTimeItem final : public InfoMapItem { public: InfoMapDateTimeItem(const Common::DateTimeObject& data_) : InfoMapItem(data_) { } protected: uint8_t getTag() const override { return static_cast('Q'); } std::vector getDataBytes() const override { std::string dateTimeText(packDateTimeToString(data)); std::vector bytes(dateTimeText.begin(), dateTimeText.end()); bytes.push_back('\0'); return bytes; } private: std::string packDateTimeToString(const Common::DateTimeObject& dateTime) const { std::string dateTimeText; dateTimeText += Common::StringExtensions::getZeroLeadNumberText(dateTime.date.getDay(), 2); dateTimeText += "-"; dateTimeText += Common::StringExtensions::getZeroLeadNumberText(dateTime.date.getMonth(), 2); dateTimeText += "-"; dateTimeText += Common::StringExtensions::getZeroLeadNumberText(dateTime.date.getYear(), 4); dateTimeText += " "; dateTimeText += Common::StringExtensions::getZeroLeadNumberText(dateTime.time.getHours(), 2); dateTimeText += ":"; dateTimeText += Common::StringExtensions::getZeroLeadNumberText(dateTime.time.getMinutes(), 2); dateTimeText += ":"; dateTimeText += Common::StringExtensions::getZeroLeadNumberText(dateTime.time.getSeconds(), 2); return dateTimeText; } }; struct InfoMapStringItem final : public InfoMapItem { public: InfoMapStringItem(const std::string& data_) : InfoMapItem(data_) { } protected: uint8_t getTag() const override { return static_cast('s'); } std::vector getDataBytes() const override { std::vector bytes(data.begin(), data.end()); bytes.push_back('\0'); return bytes; } }; struct InfoMapWideStringItem final : public InfoMapItem { public: InfoMapWideStringItem(const std::wstring& data_) : InfoMapItem(data_) { } protected: uint8_t getTag() const override { return static_cast('w'); } std::vector getDataBytes() const override { std::wstring text(data + L'\0'); uint8_t const* p = reinterpret_cast(&text[0]); std::size_t byteCount = text.size() * sizeof(text.front()); std::vector bytes(p, p + byteCount); return bytes; } }; } // namespace Incart::DeviceComplexCommands