YUMProductParser.cc

Go to the documentation of this file.
00001 /*---------------------------------------------------------------------\
00002 |                          ____ _   __ __ ___                          |
00003 |                         |__  / \ / / . \ . \                         |
00004 |                           / / \ V /|  _/  _/                         |
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 // select for which elements process() will be called
00050 bool
00051 YUMProductParser::isInterested(const xmlNodePtr nodePtr)
00052 {
00053   return _helper.isElement(nodePtr) && _helper.name(nodePtr) == "product";
00054 }
00055 
00056 // do the actual processing
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   // FIXME move the respective method to a common class, inherit it
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 } /* end process */
00155 
00156 
00157 
00158 } // namespace yum
00159 } // namespace parser
00160 } // namespace zypp

Generated on Tue Nov 28 16:49:30 2006 for zypp by  doxygen 1.5.0