1 /**
2 * @file Xml.cpp
3 * @author Mislav Novakovic <mislav.novakovic@sartura.hr>
4 * @brief Implementation of header Xml.hpp
5 *
6 * Copyright (c) 2017 Deutsche Telekom AG.
7 *
8 * This source code is licensed under BSD 3-Clause License (the "License").
9 * You may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
11 *
12 * https://opensource.org/licenses/BSD-3-Clause
13 */
14
15 #include <iostream>
16 #include <memory>
17 #include <stdexcept>
18 #include <vector>
19
20 #include "Internal.hpp"
21 #include "Xml.hpp"
22
23 extern "C" {
24 #include "libyang.h"
25 #include "xml.h"
26 }
27
28 namespace libyang {
29
Xml_Ns(const struct lyxml_ns * ns,S_Deleter deleter)30 Xml_Ns::Xml_Ns(const struct lyxml_ns *ns, S_Deleter deleter):
31 ns((struct lyxml_ns *) ns),
32 deleter(deleter)
33 {}
~Xml_Ns()34 Xml_Ns::~Xml_Ns() {}
35 S_Xml_Ns Xml_Ns::next() LY_NEW(ns, next, Xml_Ns);
36
Xml_Attr(struct lyxml_attr * attr,S_Deleter deleter)37 Xml_Attr::Xml_Attr(struct lyxml_attr *attr, S_Deleter deleter):
38 attr(attr),
39 deleter(deleter)
40 {}
~Xml_Attr()41 Xml_Attr::~Xml_Attr() {}
42 S_Xml_Attr Xml_Attr::next() LY_NEW(attr, next, Xml_Attr);
43 S_Xml_Ns Xml_Attr::ns() LY_NEW(attr, ns, Xml_Ns);
44
Xml_Elem(S_Context context,struct lyxml_elem * elem,S_Deleter deleter)45 Xml_Elem::Xml_Elem(S_Context context, struct lyxml_elem *elem, S_Deleter deleter):
46 context(context),
47 elem(elem),
48 deleter(deleter)
49 {}
~Xml_Elem()50 Xml_Elem::~Xml_Elem() {}
parent()51 S_Xml_Elem Xml_Elem::parent() {return elem->parent ? std::make_shared<Xml_Elem>(context, elem->parent, deleter) : nullptr;}
52 S_Xml_Attr Xml_Elem::attr() LY_NEW(elem, attr, Xml_Attr);
child()53 S_Xml_Elem Xml_Elem::child() {return elem->child ? std::make_shared<Xml_Elem>(context, elem->child, deleter) : nullptr;}
next()54 S_Xml_Elem Xml_Elem::next() {return elem->next ? std::make_shared<Xml_Elem>(context, elem->next, deleter) : nullptr;}
prev()55 S_Xml_Elem Xml_Elem::prev() {return elem->prev ? std::make_shared<Xml_Elem>(context, elem->prev, deleter) : nullptr;}
56 S_Xml_Ns Xml_Elem::ns() LY_NEW(elem, ns, Xml_Ns);
get_attr(const char * name,const char * ns)57 const char *Xml_Elem::get_attr(const char *name, const char *ns) {
58 return lyxml_get_attr(elem, name, ns);
59 }
get_ns(const char * prefix)60 S_Xml_Ns Xml_Elem::get_ns(const char *prefix) {
61 const struct lyxml_ns *ns = lyxml_get_ns(elem, prefix);
62 return elem->ns ? std::make_shared<Xml_Ns>((struct lyxml_ns *)ns, deleter) : nullptr;
63 }
print_mem(int options)64 std::string Xml_Elem::print_mem(int options) {
65 char *data = nullptr;
66
67 lyxml_print_mem(&data, (const struct lyxml_elem *) elem, options);
68 if (!data) {
69 return nullptr;
70 }
71
72 std::string s_data = data;
73 free(data);
74 return s_data;
75 }
76
tree_for()77 std::vector<S_Xml_Elem> Xml_Elem::tree_for() {
78 std::vector<S_Xml_Elem> s_vector;
79
80 struct lyxml_elem *elem = nullptr;
81 LY_TREE_FOR(elem, elem) {
82 s_vector.push_back(std::make_shared<Xml_Elem>(context, elem, deleter));
83 }
84
85 return s_vector;
86 }
tree_dfs()87 std::vector<S_Xml_Elem> Xml_Elem::tree_dfs() {
88 std::vector<S_Xml_Elem> s_vector;
89
90 struct lyxml_elem *elem = nullptr, *next = nullptr;
91 LY_TREE_DFS_BEGIN(elem, next, elem) {
92 s_vector.push_back(std::make_shared<Xml_Elem>(context, elem, deleter));
93 LY_TREE_DFS_END(elem, next, elem)
94 }
95
96 return s_vector;
97 }
98
99 }
100