12#ifndef ZYPP_MISC_HELIXHELPERS_H
13#define ZYPP_MISC_HELIXHELPERS_H
15#include <zypp/AutoDispose.h>
16#include <zypp/base/LogControl.h>
20#include <libxml/parser.h>
21#include <libxml/xmlmemory.h>
31 template <
typename Tp>
49 std::string_view
name()
const {
return (std::string_view((
const char *)
_node->name)); }
50 xmlElementType
type()
const {
return (
_node->type); }
53 std::optional<XmlNode>
next()
const {
return (
_node->next == NULL ? std::optional<XmlNode>() :
XmlNode (
_node->next)); }
54 std::optional<XmlNode>
children()
const {
return (
_node->xmlChildrenNode == NULL ? std::optional<XmlNode>() :
XmlNode (
_node->xmlChildrenNode)); }
58 bool equals (
const std::string_view & n)
const {
return (strncasecmp (
name().data(), n.data(), n.length() ) == 0); }
62 std::map<std::string, std::string> res;
64 if ( !
attr->children )
67 res.insert( std::make_pair( std::string((
char *)
attr->name), std::string( (
char *)value.
value() ) ) );
76 *buf = xmlNodeGetContent (
_node);
78 ret = std::string ((
const char *)buf.
value());
83 std::string
getProp (
const std::string &
name,
const std::string & deflt =
"")
const {
87 *ret = xmlGetProp (
_node, (
const xmlChar *)
name.c_str());
90 gs = std::string ((
const char *)ret.
value());
109 *xml_s = xmlGetProp(
_node, (
const xmlChar *)
name.c_str());
111 target = std::string ((
const char *)xml_s.
value());
115 child =
_node->xmlChildrenNode;
118 if (strcasecmp((
const char *)(child->name),
name.c_str()) == 0) {
119 xml_s = xmlNodeGetContent(child);
121 target = std::string ((
const char *)xml_s.
value());
140 auto &target = t.
data();
141 auto architecture = setup.
getProp(
"arch" );
142 if ( !architecture.empty() )
145 target.architecture = (
zypp::Arch(architecture) );
149 if ( err ) *err =
zypp::str::Str() <<
"Bad architecture '" << architecture <<
"' in <setup...>";
157 if ( !node->isElement() ) {
162#define if_SolverFlag( N ) if ( node->equals( #N ) ) { target.N = true; }
163 if_SolverFlag( ignorealreadyrecommended )
else if ( node->equals(
"ignorealready" ) ) { target.ignorealreadyrecommended =
true; }
164 else if_SolverFlag( onlyRequires )
else if ( node->equals(
"ignorerecommended" ) ) { target.onlyRequires =
true; }
179 else if ( node->equals(
"focus") ) {
180 target.resolverFocus = zypp::resolverFocusFromString( node->getProp(
"value") );
182 else if ( node->equals(
"system") ) {
187 node->getProp(
"file")
190 else if ( node->equals(
"hardwareInfo") ) {
191 target.hardwareInfoFile = target.globalPath / node->getProp(
"path");
193 else if ( node->equals(
"modalias") ) {
194 target.modaliasList.push_back( node->getProp(
"name") );
196 else if ( node->equals(
"multiversion") ) {
197 target.multiversionSpec.insert( node->getProp(
"name") );
199 else if (node->equals (
"channel")) {
200 std::string name = node->getProp(
"name");
201 std::string file = node->getProp(
"file");
202 std::string type = node->getProp(
"type");
205 std::string priority = node->getProp(
"priority");
206 if ( !priority.empty() ) {
207 prio = zypp::str::strtonum<unsigned>( priority );
217 else if ( node->equals(
"source") )
219 std::string url = node->getProp(
"url");
220 std::string alias = node->getProp(
"name");
228 else if ( node->equals(
"force-install") )
231 node->getProp(
"channel"),
232 node->getProp(
"package"),
233 node->getProp(
"kind")
236 else if ( node->equals(
"mediaid") )
238 target.show_mediaid =
true;
240 else if ( node->equals(
"arch") ) {
241 MIL <<
"<arch...> deprecated, use <setup arch=\"...\"> instead" << std::endl;
242 std::string architecture = node->getProp(
"name");
243 if ( architecture.empty() ) {
244 ERR <<
"Property 'name=' in <arch.../> missing or empty" << std::endl;
247 MIL <<
"Setting architecture to '" << architecture <<
"'" << std::endl;
248 target.architecture =
zypp::Arch( architecture );
251 else if ( node->equals(
"locale") )
254 std::string fate = node->getProp(
"fate");
256 ERR <<
"Bad or missing name in <locale...>" << std::endl;
258 else if ( fate ==
"added" ) {
259 target.localesTracker.added().insert( loc );
261 else if ( fate ==
"removed" ) {
262 target.localesTracker.removed().insert( loc );
265 target.localesTracker.current().insert( loc );
268 else if ( node->equals(
"autoinst") ) {
271 else if ( node->equals(
"systemCheck") ) {
272 target.systemCheck = target.globalPath / node->getProp(
"path");
274 else if ( node->equals(
"setlicencebit") ) {
275 target.set_licence =
true;
278 ERR <<
"Unrecognized tag '" << node->name() <<
"' in setup" << std::endl;
287 testcaseNode.
name() = node.name();
288 const auto & content = node.getContent();
289 if ( !content.empty() ) {
290 testcaseNode.
value() = content;
292 testcaseNode.
properties() = node.getAllProps();
294 for (
auto childNode = node.children(); childNode; childNode = childNode->next() ) {
295 auto testNode = std::make_shared<zypp::misc::testcase::TestcaseTrial::Node>();
298 testcaseNode.
children().push_back( testNode );
307 if (!node->isElement()) {
314 target.
nodes().push_back( testcaseNode );
xmlElementType type() const
std::string getContent(void) const
bool getValue(const std::string &name, T &target) const
std::map< std::string, std::string > getAllProps() const
std::optional< XmlNode > next() const
XmlNode(const xmlNodePtr node)
std::string getProp(const std::string &name, const std::string &deflt="") const
bool equals(const std::string_view &n) const
std::string_view name() const
bool isElement(void) const
T getValue(const std::string &name, const T &deflt) const
std::optional< XmlNode > children() const
Reference counted access to a Tp object calling a custom Dispose function when the last AutoDispose h...
reference value() const
Reference to the Tp object.
AutoDispose()
Default Ctor using default constructed value and no dispose function.
Base class for Exception.
Access to the sat-pools string space.
IdType id() const
Expert backdoor.
'Language[_Country]' codes.
TestcaseSetupImpl & data()
bool parseTrial(const XmlNode &trial, zypp::misc::testcase::TestcaseTrial &target, std::string *)
bool parseTrialNode(const XmlNode &node, zypp::misc::testcase::TestcaseTrial::Node &testcaseNode)
bool parseSetup(const XmlNode &setup, zypp::misc::testcase::TestcaseSetup &t, std::string *err)
Easy-to use interface to the ZYPP dependency resolver.
AutoXmlFree(Tp *ptr_r=nullptr)
const std::vector< std::shared_ptr< Node > > & children() const
const std::string & name() const
const std::map< std::string, std::string > & properties() const
const std::string & value() const
const std::vector< Node > & nodes() const
Convenient building of std::string via std::ostringstream Basically a std::ostringstream autoconverti...
#define ZYPP_CAUGHT(EXCPT)
Drops a logline telling the Exception was caught (in order to handle it).