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> 25 #include <string_view> 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());
98 T
getValue (
const std::string &
name,
const T& deflt )
const;
101 bool getValue (
const std::string &
name, T& target )
const;
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; }
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;
288 const auto & content =
node.getContent();
289 if ( !content.empty() ) {
290 testcaseNode.
value() = content;
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 );
bool parseTrialNode(const XmlNode &node, zypp::misc::testcase::TestcaseTrial::Node &testcaseNode)
TestcaseSetupImpl & data()
std::string_view name() const
std::ostream & node(std::ostream &out_r, const std::string &name_r, Node::Attr attr_r)
bool parseTrial(const XmlNode &trial, zypp::misc::testcase::TestcaseTrial &target, std::string *)
AutoXmlFree(Tp *ptr_r=nullptr)
std::optional< XmlNode > next() const
xmlElementType type() const
Access to the sat-pools string space.
bool parseSetup(const XmlNode &setup, zypp::misc::testcase::TestcaseSetup &t, std::string *err)
const std::map< std::string, std::string > & properties() const
const std::string & value() const
_onlyRequires _dup_allowdowngrade dupAllowArchChange
Convenient building of std::string via std::ostringstream Basically a std::ostringstream autoconverti...
std::string getProp(const std::string &name, const std::string &deflt="") const
const std::vector< Node > & nodes() const
AutoDispose()
Default Ctor using default constructed value and no dispose function.
'Language[_Country]' codes.
_onlyRequires dupAllowDowngrade
#define ZYPP_CAUGHT(EXCPT)
Drops a logline telling the Exception was caught (in order to handle it).
const std::vector< std::shared_ptr< Node > > & children() const
Base class for Exception.
reference value() const
Reference to the Tp object.
const std::string & name() const
std::optional< XmlNode > children() const
bool equals(const std::string_view &n) const
std::map< std::string, std::string > getAllProps() const
Reference counted access to a Tp object calling a custom Dispose function when the last AutoDispose h...
T getValue(const std::string &name, const T &deflt) const
bool isElement(void) const
Easy-to use interface to the ZYPP dependency resolver.
std::string getContent(void) const
XmlNode(const xmlNodePtr node)