You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

309 lines
11 KiB

// License: Apache 2.0. See LICENSE file in root directory.
// Copyright(c) 2019 Intel Corporation. All Rights Reserved.
#include "fw-logs-xml-helper.h"
#include <string.h>
#include <fstream>
#include <iostream>
#include <memory>
using namespace std;
namespace fw_logger
{
fw_logs_xml_helper::fw_logs_xml_helper(string xml_full_file_path)
: _init_done(false),
_xml_full_file_path(xml_full_file_path)
{}
fw_logs_xml_helper::~fw_logs_xml_helper(void)
{
// TODO: Add cleanup code
}
bool fw_logs_xml_helper::get_root_node(xml_node<> **node)
{
if (_init_done)
{
*node = _xml_doc.first_node();
return true;
}
return false;
}
bool fw_logs_xml_helper::try_load_external_xml()
{
try
{
if (_xml_full_file_path.empty())
return false;
rapidxml::file<> xml_file(_xml_full_file_path.c_str());
_document_buffer.resize(xml_file.size() + 2);
memcpy(_document_buffer.data(), xml_file.data(), xml_file.size());
_document_buffer[xml_file.size()] = '\0';
_document_buffer[xml_file.size() + 1] = '\0';
_xml_doc.parse<0>(_document_buffer.data());
return true;
}
catch (...)
{
_document_buffer.clear();
throw;
}
return false;
}
bool fw_logs_xml_helper::init()
{
_init_done = try_load_external_xml();
return _init_done;
}
bool fw_logs_xml_helper::build_log_meta_data(fw_logs_formating_options* log_meta_data)
{
xml_node<> *xml_root_node_list;
if (!init())
return false;
if (!get_root_node(&xml_root_node_list))
{
return false;
}
string root_name(xml_root_node_list->name(), xml_root_node_list->name() + xml_root_node_list->name_size());
// check if Format is the first root name.
if (root_name.compare("Format") != 0)
return false;
xml_node<>* events_node = xml_root_node_list->first_node();
if (!build_meta_data_structure(events_node, log_meta_data))
return false;
return true;
}
bool fw_logs_xml_helper::build_meta_data_structure(xml_node<> *xml_node_list_of_events, fw_logs_formating_options* logs_formating_options)
{
node_type res = none;
int id{};
int num_of_params{};
string line;
// loop through all elements in the Format.
for (xml_node<>* node = xml_node_list_of_events; node; node = node->next_sibling())
{
line.clear();
res = get_next_node(node, &id, &num_of_params, &line);
if (res == event)
{
fw_log_event log_event(num_of_params, line);
logs_formating_options->_fw_logs_event_list.insert(pair<int, fw_log_event>(id, log_event));
}
else if (res == file)
{
logs_formating_options->_fw_logs_file_names_list.insert(kvp(id, line));
}
else if (res == thread)
{
logs_formating_options->_fw_logs_thread_names_list.insert(kvp(id, line));
}
else if (res == enums)
{
for (xml_node<>* enum_node = node->first_node(); enum_node; enum_node = enum_node->next_sibling())
{
for (xml_attribute<>* attribute = enum_node->first_attribute(); attribute; attribute = attribute->next_attribute())
{
string attr(attribute->name(), attribute->name() + attribute->name_size());
if (attr.compare("Name") == 0)
{
string name_attr_str(attribute->value(), attribute->value() + attribute->value_size());
vector<kvp> xml_kvp;
for (xml_node<>* enum_value_node = enum_node->first_node(); enum_value_node; enum_value_node = enum_value_node->next_sibling())
{
int key = 0;
string value_str;
for (xml_attribute<>* attribute = enum_value_node->first_attribute(); attribute; attribute = attribute->next_attribute())
{
string attr(attribute->name(), attribute->name() + attribute->name_size());
if (attr.compare("Value") == 0)
{
value_str = std::string(attribute->value(), attribute->value() + attribute->value_size());
}
if (attr.compare("Key") == 0)
{
try
{
auto key_str = std::string(attribute->value());
key = std::stoi(key_str, nullptr);
}
catch (...) {}
}
}
xml_kvp.push_back(std::make_pair(key, value_str));
}
logs_formating_options->_fw_logs_enum_names_list.insert(pair<string, vector<kvp>>(name_attr_str, xml_kvp));
}
}
}
}
else
return false;
}
return true;
}
fw_logs_xml_helper::node_type fw_logs_xml_helper::get_next_node(xml_node<> *node, int* id, int* num_of_params, string* line)
{
string tag(node->name(), node->name() + node->name_size());
if (tag.compare("Event") == 0)
{
if (get_event_node(node, id, num_of_params, line))
return event;
}
else if (tag.compare("File") == 0)
{
if (get_file_node(node, id, line))
return file;
}
else if (tag.compare("Thread") == 0)
{
if (get_thread_node(node, id, line))
return thread;
}
else if (tag.compare("Enums") == 0)
{
return enums;
}
return none;
}
bool fw_logs_xml_helper::get_enum_name_node(xml_node<>* node_file, int* thread_id, string* enum_name)
{
for (xml_attribute<>* attribute = node_file->first_attribute(); attribute; attribute = attribute->next_attribute())
{
string attr(attribute->name(), attribute->name() + attribute->name_size());
if (attr.compare("Name") == 0)
{
string name_attr_str(attribute->value(), attribute->value() + attribute->value_size());
*enum_name = name_attr_str;
continue;
}
else
return false;
}
return true;
}
bool fw_logs_xml_helper::get_enum_value_node(xml_node<>* node_file, int* thread_id, string* enum_name)
{
for (xml_attribute<>* attribute = node_file->first_attribute(); attribute; attribute = attribute->next_attribute())
{
string attr(attribute->name(), attribute->name() + attribute->name_size());
if (attr.compare("Value") == 0)
{
string name_attr_str(attribute->value(), attribute->value() + attribute->value_size());
*enum_name = name_attr_str;
continue;
}
else
return false;
}
return true;
}
bool fw_logs_xml_helper::get_thread_node(xml_node<>* node_file, int* thread_id, string* thread_name)
{
for (xml_attribute<>* attribute = node_file->first_attribute(); attribute; attribute = attribute->next_attribute())
{
string attr(attribute->name(), attribute->name() + attribute->name_size());
if (attr.compare("id") == 0)
{
string id_attr_str(attribute->value(), attribute->value() + attribute->value_size());
*thread_id = stoi(id_attr_str);
continue;
}
else if (attr.compare("Name") == 0)
{
string name_attr_str(attribute->value(), attribute->value() + attribute->value_size());
*thread_name = name_attr_str;
continue;
}
else
return false;
}
return true;
}
bool fw_logs_xml_helper::get_file_node(xml_node<>* node_file, int* file_id, string* file_name)
{
for (xml_attribute<>* attribute = node_file->first_attribute(); attribute; attribute = attribute->next_attribute())
{
string attr(attribute->name(), attribute->name() + attribute->name_size());
if (attr.compare("id") == 0)
{
string id_attr_str(attribute->value(), attribute->value() + attribute->value_size());
*file_id = stoi(id_attr_str);
continue;
}
else if (attr.compare("Name") == 0)
{
string name_attr_str(attribute->value(), attribute->value() + attribute->value_size());
*file_name = name_attr_str;
continue;
}
else
return false;
}
return true;
}
bool fw_logs_xml_helper::get_event_node(xml_node<>* node_event, int* event_id, int* num_of_params, string* line)
{
for (xml_attribute<>* attribute = node_event->first_attribute(); attribute; attribute = attribute->next_attribute())
{
string attr(attribute->name(), attribute->name() + attribute->name_size());
if (attr.compare("id") == 0)
{
string id_attr_str(attribute->value(), attribute->value() + attribute->value_size());
*event_id = stoi(id_attr_str);
continue;
}
else if (attr.compare("numberOfArguments") == 0)
{
string num_of_args_attr_str(attribute->value(), attribute->value() + attribute->value_size());
*num_of_params = stoi(num_of_args_attr_str);
continue;
}
else if (attr.compare("format") == 0)
{
string format_attr_str(attribute->value(), attribute->value() + attribute->value_size());
*line = format_attr_str;
continue;
}
else
return false;
}
return true;
}
}