00001
00002
00003
00004
00005
00006
00007
00008
00013 #include <zypp/parser/yum/YUMPatternParser.h>
00014 #include <zypp/parser/yum/YUMPrimaryParser.h>
00015 #include <zypp/parser/LibXMLHelper.h>
00016 #include <istream>
00017 #include <string>
00018 #include "zypp/parser/xml_parser_assert.h"
00019 #include <libxml/xmlreader.h>
00020 #include <libxml/tree.h>
00021 #include <zypp/base/Logger.h>
00022 #include <zypp/parser/yum/schemanames.h>
00023
00024 using namespace std;
00025 namespace zypp {
00026 namespace parser {
00027 namespace yum {
00028
00029 YUMPatternParser::YUMPatternParser()
00030 { }
00031
00032 YUMPatternParser::YUMPatternParser(YUMPatternData_Ptr& entry)
00033 : XMLNodeIterator<YUMPatternData_Ptr>(entry)
00034 { }
00035
00036
00037 YUMPatternParser::~YUMPatternParser()
00038 { }
00039
00040
00041
00042 bool
00043 YUMPatternParser::isInterested(const xmlNodePtr nodePtr)
00044 {
00045 return _helper.isElement(nodePtr) && _helper.name(nodePtr) == "pattern";
00046 }
00047
00048
00049 YUMPatternData_Ptr
00050 YUMPatternParser::process(const xmlTextReaderPtr reader)
00051 {
00052 xml_assert(reader);
00053 YUMPatternData_Ptr dataPtr = new YUMPatternData;
00054 xmlNodePtr dataNode = xmlTextReaderExpand(reader);
00055 xml_assert(dataNode);
00056
00057
00058 YUMPrimaryParser prim;
00059
00060 for (xmlNodePtr child = dataNode->children;
00061 child && child != dataNode;
00062 child = child->next) {
00063 if (_helper.isElement(child)) {
00064 string name = _helper.name(child);
00065 if (name == "name") {
00066 dataPtr->name = _helper.content(child);
00067 }
00068 else if (name == "summary") {
00069 dataPtr->summary.setText(_helper.content(child), Locale(_helper.attribute(child,"lang")));
00070 }
00071 else if (name == "default") {
00072 dataPtr->default_ = _helper.content(child);
00073 }
00074 else if (name == "uservisible") {
00075 dataPtr->userVisible = _helper.content(child);
00076 }
00077 else if (name == "description") {
00078 dataPtr->description.setText(_helper.content(child), Locale(_helper.attribute(child,"lang")));
00079 }
00080 else if (name == "category") {
00081 #warning FIXME pattern category is translatable
00082 dataPtr->category.setText(_helper.content(child));
00083 }
00084 else if (name == "icon") {
00085 dataPtr->icon = _helper.content(child);
00086 }
00087 else if (name == "script") {
00088 dataPtr->script = _helper.content(child);
00089 }
00090 else if (name == "provides") {
00091 prim.parseDependencyEntries(& dataPtr->provides, child);
00092 }
00093 else if (name == "conflicts") {
00094 prim.parseDependencyEntries(& dataPtr->conflicts, child);
00095 }
00096 else if (name == "obsoletes") {
00097 prim.parseDependencyEntries(& dataPtr->obsoletes, child);
00098 }
00099 else if (name == "prerequires") {
00100 prim.parseDependencyEntries(& dataPtr->prerequires, child);
00101 }
00102 else if (name == "requires") {
00103 prim.parseDependencyEntries(& dataPtr->requires, child);
00104 }
00105 else if (name == "recommends") {
00106 prim.parseDependencyEntries(& dataPtr->recommends, child);
00107 }
00108 else if (name == "suggests") {
00109 prim.parseDependencyEntries(& dataPtr->suggests, child);
00110 }
00111 else if (name == "supplements") {
00112 prim.parseDependencyEntries(& dataPtr->supplements, child);
00113 }
00114 else if (name == "enhances") {
00115 prim.parseDependencyEntries(& dataPtr->enhances, child);
00116 }
00117 else if (name == "freshens") {
00118 prim.parseDependencyEntries(& dataPtr->freshens, child);
00119 }
00120 else {
00121 WAR << "YUM <pattern> contains the unknown element <" << name << "> "
00122 << _helper.positionInfo(child) << ", skipping" << endl;
00123 }
00124 }
00125 }
00126 return dataPtr;
00127 }
00128
00129
00130 YUMPatternParser::YUMPatternParser(istream &is, const string &baseUrl)
00131 : XMLNodeIterator<YUMPatternData_Ptr>(is, baseUrl,PATTERNSCHEMA)
00132 {
00133 fetchNext();
00134 }
00135
00136 }
00137 }
00138 }