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   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       // select for which elements process() will be called
00047       bool 
00048       YUMProductParser::isInterested(const xmlNodePtr nodePtr)
00049       {
00050         return _helper.isElement(nodePtr) && _helper.name(nodePtr) == "product";
00051       }
00052       
00053       // do the actual processing
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         // FIXME move the respective method to a common class, inherit it  
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       } /* end process */
00132       
00133       
00134       
00135     } // namespace yum
00136   } // namespace parser
00137 } // namespace zypp

Generated on Thu Jul 6 00:07:22 2006 for zypp by  doxygen 1.4.6