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 namespace parser {
00027 namespace yum {
00028
00029 YUMProductParser::~YUMProductParser()
00030 { }
00031
00032 YUMProductParser::YUMProductParser(istream &is, const string& baseUrl)
00033 : XMLNodeIterator<YUMProductData_Ptr>(is, baseUrl,PRODUCTSCHEMA)
00034 {
00035 fetchNext();
00036 }
00037
00038 YUMProductParser::YUMProductParser()
00039 { }
00040
00041 YUMProductParser::YUMProductParser(YUMProductData_Ptr& entry)
00042 : XMLNodeIterator<YUMProductData_Ptr>(entry)
00043 { }
00044
00045
00046
00047 bool
00048 YUMProductParser::isInterested(const xmlNodePtr nodePtr)
00049 {
00050 return _helper.isElement(nodePtr) && _helper.name(nodePtr) == "product";
00051 }
00052
00053
00054 YUMProductData_Ptr
00055 YUMProductParser::process(const xmlTextReaderPtr reader)
00056 {
00057 xml_assert(reader);
00058 YUMProductData_Ptr productPtr = new YUMProductData;
00059 xmlNodePtr dataNode = xmlTextReaderExpand(reader);
00060 xml_assert(dataNode);
00061 productPtr->type = _helper.attribute(dataNode,"type");
00062
00063
00064 YUMPrimaryParser prim;
00065
00066 for (xmlNodePtr child = dataNode->children;
00067 child && child != dataNode;
00068 child = child->next) {
00069 if (_helper.isElement(child)) {
00070 string name = _helper.name(child);
00071 if (name == "name") {
00072 productPtr->name = _helper.content(child);
00073 }
00074 else if (name == "vendor") {
00075 productPtr->vendor = _helper.content(child);
00076 }
00077 else if (name == "release-notes-url") {
00078 productPtr->releasenotesurl = _helper.content(child);
00079 }
00080 else if (name == "displayname") {
00081 productPtr->summary.setText(_helper.content(child), Locale(_helper.attribute(child,"lang")));
00082 }
00083 else if (name == "shortname") {
00084 productPtr->short_name.setText(_helper.content(child), Locale(_helper.attribute(child,"lang")));
00085 }
00086 else if (name == "description") {
00087 productPtr->description.setText(_helper.content(child), Locale(_helper.attribute(child,"lang")));
00088 }
00089 else if (name == "version") {
00090 productPtr->epoch = _helper.attribute(child,"epoch");
00091 productPtr->ver = _helper.attribute(child,"ver");
00092 productPtr->rel = _helper.attribute(child,"rel");
00093 }
00094 else if (name == "provides") {
00095 prim.parseDependencyEntries(& productPtr->provides, child);
00096 }
00097 else if (name == "conflicts") {
00098 prim.parseDependencyEntries(& productPtr->conflicts, child);
00099 }
00100 else if (name == "obsoletes") {
00101 prim.parseDependencyEntries(& productPtr->obsoletes, child);
00102 }
00103 else if (name == "prerequires") {
00104 prim.parseDependencyEntries(& productPtr->prerequires, child);
00105 }
00106 else if (name == "requires") {
00107 prim.parseDependencyEntries(& productPtr->requires, child);
00108 }
00109 else if (name == "recommends") {
00110 prim.parseDependencyEntries(& productPtr->recommends, child);
00111 }
00112 else if (name == "suggests") {
00113 prim.parseDependencyEntries(& productPtr->suggests, child);
00114 }
00115 else if (name == "supplements") {
00116 prim.parseDependencyEntries(& productPtr->supplements, child);
00117 }
00118 else if (name == "enhances") {
00119 prim.parseDependencyEntries(& productPtr->enhances, child);
00120 }
00121 else if (name == "freshens") {
00122 prim.parseDependencyEntries(& productPtr->freshens, child);
00123 }
00124 else {
00125 WAR << "YUM <data> contains the unknown element <" << name << "> "
00126 << _helper.positionInfo(child) << ", skipping" << endl;
00127 }
00128 }
00129 }
00130 return productPtr;
00131 }
00132
00133
00134
00135 }
00136 }
00137 }