5 #include <sandesh/sandesh_message_builder.h>
14 static bool ParseInteger(
const pugi::xml_node &node,
int *valuep) {
16 *valuep = strtoul(node.child_value(), &endp, 10);
17 return endp[0] ==
'\0';
22 *valuep = strtoull(node.child_value(), &endp, 10);
23 return endp[0] ==
'\0';
31 SandeshHeader& header) {
32 for (xml_node node = root.first_child(); node;
33 node = node.next_sibling()) {
34 const char *name(node.name());
35 assert(strcmp(node.last_attribute().name(),
"identifier") == 0);
36 int identifier(node.last_attribute().as_int());
39 header.set_Namespace(node.child_value());
44 header.set_Timestamp(Timestamp);
47 header.set_Module(node.child_value());
50 header.set_Source(node.child_value());
53 header.set_Context(node.child_value());
58 header.set_SequenceNum(SequenceNum);
63 header.set_VersionSig(VersionSig);
68 header.set_Type(static_cast<SandeshType::type>(Type));
73 header.set_Hints(Hints);
78 header.set_Level(static_cast<SandeshLevel::type>(Level));
81 header.set_Category(node.child_value());
84 header.set_NodeType(node.child_value());
87 header.set_InstanceId(node.child_value());
90 header.set_IPAddress(node.child_value());
98 SANDESH_LOG(ERROR, __func__ <<
": Unknown identifier: " << identifier);
106 xml_parse_result result = xdoc_.load_buffer(xml_msg, size,
107 parse_default & ~parse_escapes);
109 SANDESH_LOG(ERROR, __func__ <<
": Unable to load Sandesh XML. (status=" <<
110 result.status <<
", offset=" << result.offset <<
"): " <<
114 xml_node header_node = xdoc_.first_child();
115 if (!ParseHeader(header_node, header_)) {
116 SANDESH_LOG(ERROR, __func__ <<
": Sandesh header parse FAILED: " <<
120 message_node_ = header_node.next_sibling();
121 message_type_ = message_node_.name();
122 if (message_type_.empty()) {
123 SANDESH_LOG(ERROR, __func__ <<
": Message type NOT PRESENT: " <<
132 ostringstream sstream;
133 message_node_.print(sstream,
"", format_raw | format_no_declaration |
135 return sstream.str();
143 xml_parse_result result = xdoc_.load_buffer(xml_msg, size,
144 parse_default & ~parse_escapes);
146 SANDESH_LOG(ERROR, __func__ <<
": Unable to load Sandesh Syslog. (status=" <<
147 result.status <<
", offset=" << result.offset <<
"): " <<
151 message_node_ = xdoc_.first_child();
152 message_type_ = message_node_.name();
170 const uint8_t *xml_msg,
size_t size)
const {
172 if (!msg->
Parse(xml_msg, size)) {
190 const uint8_t *xml_msg,
size_t size)
const {
192 msg->
Parse(xml_msg, size);
static SandeshSyslogMessageBuilder * GetInstance()
virtual bool Parse(const uint8_t *data, size_t size)
static SandeshXMLMessageBuilder instance_
virtual ~SandeshSyslogMessage()
virtual SandeshMessage * Create(const uint8_t *data, size_t size) const
#define SANDESH_LOG(_Level, _Msg)
virtual ~SandeshXMLMessage()
static bool ParseInteger(const pugi::xml_node &node, int *valuep)
virtual bool Parse(const uint8_t *data, size_t size)
static SandeshSyslogMessageBuilder instance_
static SandeshXMLMessageBuilder * GetInstance()
virtual const std::string ExtractMessage() const
bool ParseHeader(const pugi::xml_node &root, SandeshHeader &header)
virtual ~SandeshMessage()
SandeshSyslogMessageBuilder()
SandeshXMLMessageBuilder()
static bool ParseUnsignedLong(const pugi::xml_node &node, uint64_t *valuep)
virtual SandeshMessage * Create(const uint8_t *data, size_t size) const
static SandeshMessageBuilder * GetInstance(Type type)