00001
00002
00003
00004
00005
00006
00007
00008
00013 #include <istream>
00014 #include <string>
00015 #include "zypp/parser/xml_parser_assert.h"
00016 #include <libxml/xmlreader.h>
00017 #include <libxml/tree.h>
00018 #include "zypp/parser/yum/YUMProductParser.h"
00019 #include "zypp/parser/yum/YUMPrimaryParser.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 yum
00030 {
00031
00032 YUMProductParser::~YUMProductParser()
00033 { }
00034
00035 YUMProductParser::YUMProductParser(std::istream &is, const std::string& baseUrl, parser::ParserProgress::Ptr progress )
00036 : XMLNodeIterator<YUMProductData_Ptr>(is, baseUrl,PRODUCTSCHEMA, progress)
00037 {
00038 fetchNext();
00039 }
00040
00041 YUMProductParser::YUMProductParser()
00042 { }
00043
00044 YUMProductParser::YUMProductParser(YUMProductData_Ptr& entry)
00045 : XMLNodeIterator<YUMProductData_Ptr>(entry)
00046 { }
00047
00048
00049
00050 bool
00051 YUMProductParser::isInterested(const xmlNodePtr nodePtr)
00052 {
00053 return _helper.isElement(nodePtr) && _helper.name(nodePtr) == "product";
00054 }
00055
00056
00057 YUMProductData_Ptr
00058 YUMProductParser::process(const xmlTextReaderPtr reader)
00059 {
00060 xml_assert(reader);
00061 YUMProductData_Ptr productPtr = new YUMProductData;
00062 xmlNodePtr dataNode = xmlTextReaderExpand(reader);
00063 xml_assert(dataNode);
00064 productPtr->type = _helper.attribute(dataNode,"type");
00065
00066
00067 YUMPrimaryParser prim;
00068
00069 for (xmlNodePtr child = dataNode->children;
00070 child && child != dataNode;
00071 child = child->next)
00072 {
00073 if (_helper.isElement(child))
00074 {
00075 string name = _helper.name(child);
00076 if (name == "name")
00077 {
00078 productPtr->name = _helper.content(child);
00079 }
00080 else if (name == "vendor")
00081 {
00082 productPtr->vendor = _helper.content(child);
00083 }
00084 else if (name == "release-notes-url")
00085 {
00086 productPtr->releasenotesurl = _helper.content(child);
00087 }
00088 else if (name == "displayname")
00089 {
00090 productPtr->summary.setText(_helper.content(child), Locale(_helper.attribute(child,"lang")));
00091 }
00092 else if (name == "shortname")
00093 {
00094 productPtr->short_name.setText(_helper.content(child), Locale(_helper.attribute(child,"lang")));
00095 }
00096 else if (name == "description")
00097 {
00098 productPtr->description.setText(_helper.content(child), Locale(_helper.attribute(child,"lang")));
00099 }
00100 else if (name == "version")
00101 {
00102 productPtr->epoch = _helper.attribute(child,"epoch");
00103 productPtr->ver = _helper.attribute(child,"ver");
00104 productPtr->rel = _helper.attribute(child,"rel");
00105 }
00106 else if (name == "provides")
00107 {
00108 prim.parseDependencyEntries(& productPtr->provides, child);
00109 }
00110 else if (name == "conflicts")
00111 {
00112 prim.parseDependencyEntries(& productPtr->conflicts, child);
00113 }
00114 else if (name == "obsoletes")
00115 {
00116 prim.parseDependencyEntries(& productPtr->obsoletes, child);
00117 }
00118 else if (name == "prerequires")
00119 {
00120 prim.parseDependencyEntries(& productPtr->prerequires, child);
00121 }
00122 else if (name == "requires")
00123 {
00124 prim.parseDependencyEntries(& productPtr->requires, child);
00125 }
00126 else if (name == "recommends")
00127 {
00128 prim.parseDependencyEntries(& productPtr->recommends, child);
00129 }
00130 else if (name == "suggests")
00131 {
00132 prim.parseDependencyEntries(& productPtr->suggests, child);
00133 }
00134 else if (name == "supplements")
00135 {
00136 prim.parseDependencyEntries(& productPtr->supplements, child);
00137 }
00138 else if (name == "enhances")
00139 {
00140 prim.parseDependencyEntries(& productPtr->enhances, child);
00141 }
00142 else if (name == "freshens")
00143 {
00144 prim.parseDependencyEntries(& productPtr->freshens, child);
00145 }
00146 else
00147 {
00148 WAR << "YUM <data> contains the unknown element <" << name << "> "
00149 << _helper.positionInfo(child) << ", skipping" << endl;
00150 }
00151 }
00152 }
00153 return productPtr;
00154 }
00155
00156
00157
00158 }
00159 }
00160 }