mirror of https://github.com/SeanOMik/libki.git
protocol: Definitions for DML messages
This commit is contained in:
parent
ac14fc5d74
commit
bfe56f194a
|
@ -0,0 +1,38 @@
|
|||
#pragma once
|
||||
#include "../../util/Serializable.h"
|
||||
#include "../../dml/Record.h"
|
||||
#include <iostream>
|
||||
|
||||
namespace ki
|
||||
{
|
||||
namespace protocol
|
||||
{
|
||||
namespace dml
|
||||
{
|
||||
class Message : public util::Serializable
|
||||
{
|
||||
public:
|
||||
Message(uint8_t service_id = 0, uint8_t type = 0);
|
||||
virtual ~Message() = default;
|
||||
|
||||
uint8_t get_service_id() const;
|
||||
void set_service_id(uint8_t service_id);
|
||||
|
||||
uint8_t get_type() const;
|
||||
void set_type(uint8_t type);
|
||||
|
||||
ki::dml::Record &get_record();
|
||||
const ki::dml::Record &get_record() const;
|
||||
void set_record(const ki::dml::Record &record);
|
||||
|
||||
void write_to(std::ostream &ostream) const final;
|
||||
void read_from(std::istream &istream) final;
|
||||
size_t get_size() const final;
|
||||
private:
|
||||
uint8_t m_service_id;
|
||||
uint8_t m_type;
|
||||
ki::dml::Record *m_record;
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,38 @@
|
|||
#pragma once
|
||||
#include "Message.h"
|
||||
#include <string>
|
||||
|
||||
namespace ki
|
||||
{
|
||||
namespace protocol
|
||||
{
|
||||
namespace dml
|
||||
{
|
||||
class MessageBuilder
|
||||
{
|
||||
public:
|
||||
MessageBuilder(uint8_t service_id = 0, uint8_t type = 0);
|
||||
|
||||
MessageBuilder &set_service_id(uint8_t service_id);
|
||||
MessageBuilder &set_message_type(uint8_t type);
|
||||
MessageBuilder &use_template_record(const ki::dml::Record &record);
|
||||
|
||||
template <typename ValueT>
|
||||
MessageBuilder &set_field_value(std::string name, ValueT value)
|
||||
{
|
||||
auto *field = m_message->get_record().get_field<ValueT>(name);
|
||||
if (!field)
|
||||
{
|
||||
// TODO: Exceptions
|
||||
}
|
||||
field->set_value(value);
|
||||
return *this;
|
||||
}
|
||||
|
||||
Message *get_message() const;
|
||||
private:
|
||||
Message *m_message;
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
#pragma once
|
||||
#include "MessageModule.h"
|
||||
#include "MessageBuilder.h"
|
||||
#include "../../dml/Record.h"
|
||||
#include <string>
|
||||
|
||||
namespace ki
|
||||
{
|
||||
namespace protocol
|
||||
{
|
||||
namespace dml
|
||||
{
|
||||
class MessageManager
|
||||
{
|
||||
public:
|
||||
MessageManager();
|
||||
~MessageManager();
|
||||
|
||||
static MessageManager &get_singleton();
|
||||
|
||||
const MessageModule &load_module(std::string filepath);
|
||||
const MessageModule &get_module(uint8_t service_id) const;
|
||||
const MessageModule &get_module(std::string protocol_type) const;
|
||||
|
||||
MessageBuilder &build_message(uint8_t service_id, uint8_t message_type) const;
|
||||
MessageBuilder &build_message(uint8_t service_id, std::string message_name) const;
|
||||
MessageBuilder &build_message(std::string service_type, uint8_t message_type) const;
|
||||
MessageBuilder &build_message(std::string service_type, std::string message_name) const;
|
||||
|
||||
const Message *from_binary(std::istream &istream);
|
||||
private:
|
||||
static MessageManager *g_instance;
|
||||
|
||||
MessageModuleList m_modules;
|
||||
MessageModuleServiceIdMap m_service_id_map;
|
||||
MessageModuleProtocolTypeMap m_protocol_type_map;
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,51 @@
|
|||
#pragma once
|
||||
#include "MessageTemplate.h"
|
||||
#include <cstdint>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
|
||||
namespace ki
|
||||
{
|
||||
namespace protocol
|
||||
{
|
||||
namespace dml
|
||||
{
|
||||
class MessageModule
|
||||
{
|
||||
public:
|
||||
MessageModule(uint8_t service_id, std::string protocol_type);
|
||||
~MessageModule();
|
||||
|
||||
uint8_t get_service_id() const;
|
||||
void set_service_id(uint8_t service_id);
|
||||
|
||||
std::string get_protocol_type() const;
|
||||
void set_protocol_type(std::string protocol_type);
|
||||
|
||||
std::string get_protocol_desription() const;
|
||||
void set_protocol_description(std::string protocol_description);
|
||||
|
||||
const MessageTemplate &add_message_template(std::string name, uint8_t type,
|
||||
ki::dml::Record *record);
|
||||
const MessageTemplate &get_message_template(uint8_t type);
|
||||
const MessageTemplate &get_message_template(std::string name);
|
||||
|
||||
MessageBuilder &build_message(uint8_t message_type) const;
|
||||
MessageBuilder &build_message(std::string message_name) const;
|
||||
private:
|
||||
uint8_t m_service_id;
|
||||
std::string m_protocol_type;
|
||||
std::string m_protocol_description;
|
||||
|
||||
std::vector<MessageTemplate *> m_templates;
|
||||
std::map<std::string, MessageTemplate *> m_message_name_map;
|
||||
std::map<uint8_t, MessageTemplate *> m_message_type_map;
|
||||
};
|
||||
|
||||
typedef std::vector<MessageModule *> MessageModuleList;
|
||||
typedef std::map<uint8_t, MessageModule *> MessageModuleServiceIdMap;
|
||||
typedef std::map<std::string, MessageModule *> MessageModuleProtocolTypeMap;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
#pragma once
|
||||
#include "../../dml/Record.h"
|
||||
#include "MessageBuilder.h"
|
||||
#include <string>
|
||||
|
||||
namespace ki
|
||||
{
|
||||
namespace protocol
|
||||
{
|
||||
namespace dml
|
||||
{
|
||||
class MessageTemplate
|
||||
{
|
||||
public:
|
||||
MessageTemplate(std::string name, uint8_t type, ki::dml::Record *record);
|
||||
~MessageTemplate();
|
||||
|
||||
std::string get_name() const;
|
||||
void set_name(std::string name);
|
||||
|
||||
uint8_t get_type() const;
|
||||
void set_type(uint8_t type);
|
||||
|
||||
const ki::dml::Record &get_record() const;
|
||||
void set_record(ki::dml::Record *record);
|
||||
|
||||
MessageBuilder &build_message();
|
||||
private:
|
||||
std::string m_name;
|
||||
uint8_t m_type;
|
||||
ki::dml::Record *m_record;
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue