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 {
00027 namespace parser
00028 {
00029 namespace yum
00030 {
00031
00032 YUMPatternParser::YUMPatternParser()
00033 { }
00034
00035 YUMPatternParser::YUMPatternParser(YUMPatternData_Ptr& entry)
00036 : XMLNodeIterator<YUMPatternData_Ptr>(entry)
00037 { }
00038
00039
00040 YUMPatternParser::~YUMPatternParser()
00041 { }
00042
00043
00044
00045 bool
00046 YUMPatternParser::isInterested(const xmlNodePtr nodePtr)
00047 {
00048 return _helper.isElement(nodePtr) && _helper.name(nodePtr) == "pattern";
00049 }
00050
00051
00052 YUMPatternData_Ptr
00053 YUMPatternParser::process(const xmlTextReaderPtr reader)
00054 {
00055 xml_assert(reader);
00056 YUMPatternData_Ptr dataPtr = new YUMPatternData;
00057 xmlNodePtr dataNode = xmlTextReaderExpand(reader);
00058 xml_assert(dataNode);
00059
00060
00061 YUMPrimaryParser prim;
00062
00063 for (xmlNodePtr child = dataNode->children;
00064 child && child != dataNode;
00065 child = child->next)
00066 {
00067 if (_helper.isElement(child))
00068 {
00069 string name = _helper.name(child);
00070 if (name == "name")
00071 {
00072 dataPtr->name = _helper.content(child);
00073 }
00074 else if (name == "summary")
00075 {
00076 dataPtr->summary.setText(_helper.content(child), Locale(_helper.attribute(child,"lang")));
00077 }
00078 else if (name == "default")
00079 {
00080 dataPtr->default_ = _helper.content(child);
00081 }
00082 else if (name == "uservisible")
00083 {
00084 dataPtr->userVisible = _helper.content(child);
00085 }
00086 else if (name == "description")
00087 {
00088 dataPtr->description.setText(_helper.content(child), Locale(_helper.attribute(child,"lang")));
00089 }
00090 else if (name == "category")
00091 {
00092 #warning FIXME pattern category is translatable
00093 dataPtr->category.setText(_helper.content(child));
00094 }
00095 else if (name == "icon")
00096 {
00097 dataPtr->icon = _helper.content(child);
00098 }
00099 else if (name == "script")
00100 {
00101 dataPtr->script = _helper.content(child);
00102 }
00103 else if (name == "provides")
00104 {
00105 prim.parseDependencyEntries(& dataPtr->provides, child);
00106 }
00107 else if (name == "conflicts")
00108 {
00109 prim.parseDependencyEntries(& dataPtr->conflicts, child);
00110 }
00111 else if (name == "obsoletes")
00112 {
00113 prim.parseDependencyEntries(& dataPtr->obsoletes, child);
00114 }
00115 else if (name == "prerequires")
00116 {
00117 prim.parseDependencyEntries(& dataPtr->prerequires, child);
00118 }
00119 else if (name == "requires")
00120 {
00121 prim.parseDependencyEntries(& dataPtr->requires, child);
00122 }
00123 else if (name == "recommends")
00124 {
00125 prim.parseDependencyEntries(& dataPtr->recommends, child);
00126 }
00127 else if (name == "suggests")
00128 {
00129 prim.parseDependencyEntries(& dataPtr->suggests, child);
00130 }
00131 else if (name == "supplements")
00132 {
00133 prim.parseDependencyEntries(& dataPtr->supplements, child);
00134 }
00135 else if (name == "enhances")
00136 {
00137 prim.parseDependencyEntries(& dataPtr->enhances, child);
00138 }
00139 else if (name == "freshens")
00140 {
00141 prim.parseDependencyEntries(& dataPtr->freshens, child);
00142 }
00143 else
00144 {
00145 WAR << "YUM <pattern> contains the unknown element <" << name << "> "
00146 << _helper.positionInfo(child) << ", skipping" << endl;
00147 }
00148 }
00149 }
00150 return dataPtr;
00151 }
00152
00153
00154 YUMPatternParser::YUMPatternParser(std::istream &is, const std::string &baseUrl, parser::ParserProgress::Ptr progress )
00155 : XMLNodeIterator<YUMPatternData_Ptr>(is, baseUrl,PATTERNSCHEMA, progress)
00156 {
00157 fetchNext();
00158 }
00159
00160 }
00161 }
00162 }