blob: 3047834689445871a27f81d5a3c7c7de0eaa6189 [file] [log] [blame]
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2015. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#ifndef NT_MESSAGE_H_
#define NT_MESSAGE_H_
#include <functional>
#include <memory>
#include <string>
#include "nt_Value.h"
namespace nt {
class WireDecoder;
class WireEncoder;
class Message {
struct private_init {};
public:
enum MsgType {
kUnknown = -1,
kKeepAlive = 0x00,
kClientHello = 0x01,
kProtoUnsup = 0x02,
kServerHelloDone = 0x03,
kServerHello = 0x04,
kClientHelloDone = 0x05,
kEntryAssign = 0x10,
kEntryUpdate = 0x11,
kFlagsUpdate = 0x12,
kEntryDelete = 0x13,
kClearEntries = 0x14,
kExecuteRpc = 0x20,
kRpcResponse = 0x21
};
typedef std::function<NT_Type(unsigned int id)> GetEntryTypeFunc;
Message() : m_type(kUnknown), m_id(0), m_flags(0), m_seq_num_uid(0) {}
Message(MsgType type, const private_init&)
: m_type(type), m_id(0), m_flags(0), m_seq_num_uid(0) {}
MsgType type() const { return m_type; }
bool Is(MsgType type) const { return type == m_type; }
// Message data accessors. Callers are responsible for knowing what data is
// actually provided for a particular message.
llvm::StringRef str() const { return m_str; }
std::shared_ptr<Value> value() const { return m_value; }
unsigned int id() const { return m_id; }
unsigned int flags() const { return m_flags; }
unsigned int seq_num_uid() const { return m_seq_num_uid; }
// Read and write from wire representation
void Write(WireEncoder& encoder) const;
static std::shared_ptr<Message> Read(WireDecoder& decoder,
GetEntryTypeFunc get_entry_type);
// Create messages without data
static std::shared_ptr<Message> KeepAlive() {
return std::make_shared<Message>(kKeepAlive, private_init());
}
static std::shared_ptr<Message> ProtoUnsup() {
return std::make_shared<Message>(kProtoUnsup, private_init());
}
static std::shared_ptr<Message> ServerHelloDone() {
return std::make_shared<Message>(kServerHelloDone, private_init());
}
static std::shared_ptr<Message> ClientHelloDone() {
return std::make_shared<Message>(kClientHelloDone, private_init());
}
static std::shared_ptr<Message> ClearEntries() {
return std::make_shared<Message>(kClearEntries, private_init());
}
// Create messages with data
static std::shared_ptr<Message> ClientHello(llvm::StringRef self_id);
static std::shared_ptr<Message> ServerHello(unsigned int flags,
llvm::StringRef self_id);
static std::shared_ptr<Message> EntryAssign(llvm::StringRef name,
unsigned int id,
unsigned int seq_num,
std::shared_ptr<Value> value,
unsigned int flags);
static std::shared_ptr<Message> EntryUpdate(unsigned int id,
unsigned int seq_num,
std::shared_ptr<Value> value);
static std::shared_ptr<Message> FlagsUpdate(unsigned int id,
unsigned int flags);
static std::shared_ptr<Message> EntryDelete(unsigned int id);
static std::shared_ptr<Message> ExecuteRpc(unsigned int id, unsigned int uid,
llvm::StringRef params);
static std::shared_ptr<Message> RpcResponse(unsigned int id, unsigned int uid,
llvm::StringRef results);
Message(const Message&) = delete;
Message& operator=(const Message&) = delete;
private:
MsgType m_type;
// Message data. Use varies by message type.
std::string m_str;
std::shared_ptr<Value> m_value;
unsigned int m_id; // also used for proto_rev
unsigned int m_flags;
unsigned int m_seq_num_uid;
};
} // namespace nt
#endif // NT_MESSAGE_H_