00001
00002
00003
00004
00005
00006
00007
00008
00013 #include <zypp/parser/xmlstore/XMLResObjectParser.h>
00014 #include <istream>
00015 #include <string>
00016 #include "zypp/parser/xml_parser_assert.h"
00017 #include <libxml/xmlstring.h>
00018 #include <libxml/xmlreader.h>
00019 #include <libxml/tree.h>
00020 #include <zypp/parser/LibXMLHelper.h>
00021 #include <zypp/base/Logger.h>
00022 #include <zypp/parser/yum/schemanames.h>
00023
00024 using namespace std;
00025 namespace zypp
00026 {
00027 namespace parser
00028 {
00029 namespace xmlstore
00030 {
00031
00032
00033 XMLResObjectParser::XMLResObjectParser()
00034 { }
00035
00036 XMLResObjectParser::~XMLResObjectParser()
00037 {
00038 }
00039
00040
00041 void
00042 XMLResObjectParser::parseResObjectCommonData( XMLResObjectData_Ptr dataPtr, xmlNodePtr node)
00043 {
00044 xml_assert(node);
00045
00046 for (xmlNodePtr child = node->children; child != 0; child = child ->next)
00047 {
00048 if (_helper.isElement(child))
00049 {
00050 string name = _helper.name(child);
00051
00052 if (name == "name") {
00053 dataPtr->name = _helper.content(child);
00054 }
00055 else if (name == "arch") {
00056 dataPtr->arch = _helper.content(child);
00057 }
00058 else if (name == "version") {
00059 dataPtr->epoch = _helper.attribute(child,"epoch");
00060 dataPtr->ver = _helper.attribute(child,"ver");
00061 dataPtr->rel = _helper.attribute(child,"rel");
00062 }
00063 }
00064 }
00065 }
00066
00067 void
00068 XMLResObjectParser::parseDependencies( XMLResObjectData_Ptr dataPtr, xmlNodePtr node)
00069 {
00070 xml_assert(node);
00071
00072 for (xmlNodePtr child = node->children; child != 0; child = child ->next)
00073 {
00074 if (_helper.isElement(child))
00075 {
00076 string name = _helper.name(child);
00077 if (name == "provides") {
00078 parseDependencyEntries(& dataPtr->provides, child);
00079 }
00080 else if (name == "conflicts") {
00081 parseDependencyEntries(& dataPtr->conflicts, child);
00082 }
00083 else if (name == "obsoletes") {
00084 parseDependencyEntries(& dataPtr->obsoletes, child);
00085 }
00086 else if (name == "prerequires") {
00087 parseDependencyEntries(& dataPtr->prerequires, child);
00088 }
00089 else if (name == "requires") {
00090 parseDependencyEntries(& dataPtr->requires, child);
00091 }
00092 else if (name == "recommends") {
00093 parseDependencyEntries(& dataPtr->recommends, child);
00094 }
00095 else if (name == "suggests") {
00096 parseDependencyEntries(& dataPtr->suggests, child);
00097 }
00098 else if (name == "supplements") {
00099 parseDependencyEntries(& dataPtr->supplements, child);
00100 }
00101 else if (name == "enhances") {
00102 parseDependencyEntries(& dataPtr->enhances, child);
00103 }
00104 else if (name == "freshens") {
00105 parseDependencyEntries(& dataPtr->freshens, child);
00106 }
00107 }
00108 }
00109
00110 }
00111
00112 void
00113 XMLResObjectParser::parseDependencyEntries(list<XMLDependency> *depList,
00114 xmlNodePtr depNode)
00115 {
00116 xml_assert(depNode);
00117
00118 for (xmlNodePtr child = depNode->children; child != 0; child = child ->next)
00119 {
00120 if (_helper.isElement(child))
00121 {
00122 string name = _helper.name(child);
00123
00124 if ( name == "capability" )
00125 {
00126 depList->push_back
00127 (XMLDependency(_helper.attribute(child,"kind"),
00128 _helper.content(child)));
00129 }
00130 else
00131 {
00132 WAR << "XML dependency contains the unknown element <" << name << "> "
00133 << _helper.positionInfo(child) << ", skipping" << endl;
00134 }
00135 }
00136 }
00137 }
00138
00139 }
00140 }
00141 }