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