XMLPatchParser.cc

Go to the documentation of this file.
00001 /*---------------------------------------------------------------------\
00002 |                          ____ _   __ __ ___                          |
00003 |                         |__  / \ / / . \ . \                         |
00004 |                           / / \ V /|  _/  _/                         |
00005 |                          / /__ | | | | | |                           |
00006 |                         /_____||_| |_| |_|                           |
00007 |                                                                      |
00008 \---------------------------------------------------------------------*/
00013 #include <zypp/parser/xmlstore/XMLPatchParser.h>
00014 
00015 #include <istream>
00016 #include <string>
00017 #include "zypp/parser/xml_parser_assert.h"
00018 #include <libxml/xmlreader.h>
00019 #include <libxml/tree.h>
00020 #include <zypp/parser/LibXMLHelper.h>
00021 #include <zypp/base/Logger.h>
00022 #include <zypp/parser/xmlstore/schemanames.h>
00023 
00024 using namespace std;
00025 
00026 namespace zypp {
00027   namespace parser {
00028     namespace xmlstore {
00029 
00030       XMLPatchParser::~XMLPatchParser()
00031       { }
00032 
00033       XMLPatchParser::XMLPatchParser(std::istream &is, const std::string& baseUrl)
00034         : XMLNodeIterator<XMLPatchData_Ptr>(is, baseUrl ,PATCHSCHEMA)
00035       {
00036         fetchNext();
00037       }
00038 
00039       XMLPatchParser::XMLPatchParser()
00040       { }
00041 
00042       XMLPatchParser::XMLPatchParser(XMLPatchData_Ptr& entry)
00043       : XMLNodeIterator<XMLPatchData_Ptr>(entry)
00044       { }
00045 
00046 
00047       // select for which elements process() will be called
00048       bool
00049       XMLPatchParser::isInterested(const xmlNodePtr nodePtr)
00050       {
00051         return _helper.isElement(nodePtr) && _helper.name(nodePtr) == "patch";
00052       }
00053 
00054       // do the actual processing
00055       XMLPatchData_Ptr
00056       XMLPatchParser::process(const xmlTextReaderPtr reader)
00057       {
00058         xml_assert(reader);
00059         XMLPatchData_Ptr patchPtr = new XMLPatchData();
00060         xmlNodePtr dataNode = xmlTextReaderExpand(reader);
00061         xml_assert(dataNode);
00062 
00063         // default values for optional entries
00064         patchPtr->rebootNeeded = false;
00065         patchPtr->packageManager = false;
00066 
00067         parseResObjectCommonData( patchPtr, dataNode);
00068         parseDependencies( patchPtr, dataNode);
00069 
00070         for (xmlNodePtr child = dataNode->children; child && child != dataNode; child = child->next)
00071         {
00072           if (_helper.isElement(child))
00073           {
00074             string name = _helper.name(child);
00075 
00076             if (name == "id") {
00077               patchPtr->patchId = _helper.content(child);
00078             }
00079             else if (name == "timestamp") {
00080               patchPtr->timestamp = _helper.content(child);
00081             }
00082             else if (name == "category") {
00083               patchPtr->category = _helper.content(child);
00084             }
00085             else if (name == "reboot-needed") {
00086               patchPtr->rebootNeeded = (_helper.content(child) == "true") ? true : false;
00087             }
00088             else if (name == "affects-package-manager") {
00089               patchPtr->packageManager = (_helper.content(child) == "true") ? true : false;
00090             }
00091             else if (name == "atoms") {
00092               parseAtomsNode(patchPtr, child);
00093             }
00094           }
00095         }
00096         return patchPtr;
00097       } /* end process */
00098 
00099 
00100       void
00101       XMLPatchParser::parseAtomsNode(XMLPatchData_Ptr dataPtr, xmlNodePtr formatNode)
00102       {
00103         xml_assert(formatNode);
00104         for (xmlNodePtr child = formatNode->children; child != 0; child = child ->next)
00105         {
00106           if (_helper.isElement(child))
00107           {
00108             string name = _helper.name(child);
00109             XXX << "parseAtomsNode(" << name << ")" << endl;
00110             if (name == "atom")
00111             {
00112                 parseAtomNode (dataPtr, child);
00113             }
00114             else if (name == "script")
00115             {
00116                 parseScriptNode (dataPtr, child);
00117             }
00118             else if (name == "message")
00119             {
00120                 parseMessageNode (dataPtr, child);
00121             }
00122           }
00123         }
00124       }
00125 
00126       void
00127       XMLPatchParser::parseAtomNode(XMLPatchData_Ptr dataPtr, xmlNodePtr formatNode)
00128       {
00129         XMLPatchAtomData_Ptr atom(new XMLPatchAtomData);
00130         // inject dependencies and other stuff
00131         parseResObjectCommonData( atom, formatNode);
00132         parseDependencies( atom, formatNode);
00133 
00134         dataPtr->atoms.push_back(atom);
00135       }
00136 
00137       void
00138       XMLPatchParser::parseScriptNode(XMLPatchData_Ptr dataPtr, xmlNodePtr formatNode)
00139       {
00140         XMLPatchScriptData_Ptr script(new XMLPatchScriptData);
00141 
00142         parseResObjectCommonData( script, formatNode);
00143         parseDependencies( script, formatNode);
00144 
00145         for (xmlNodePtr child = formatNode->children;  child != 0; child = child ->next)
00146         {
00147           if (_helper.isElement(child))
00148           {
00149             string name = _helper.name(child);
00150             if (name == "do") {
00151               script->doScript = _helper.content(child);
00152             }
00153             else if (name == "undo")
00154             {
00155               script->undoScript = _helper.content(child);
00156             }
00157           }
00158         }
00159         dataPtr->atoms.push_back(script);
00160       }
00161 
00162       void
00163       XMLPatchParser::parseMessageNode(XMLPatchData_Ptr dataPtr, xmlNodePtr formatNode)
00164       {
00165         XMLPatchMessageData_Ptr message(new XMLPatchMessageData);
00166 
00167         parseResObjectCommonData( message, formatNode);
00168         parseDependencies( message, formatNode);
00169 
00170         for (xmlNodePtr child = formatNode->children;  child != 0; child = child ->next)
00171         {
00172           if (_helper.isElement(child))
00173           {
00174             string name = _helper.name(child);
00175             if (name == "text") {
00176               message->text.setText(_helper.content(child), Locale(_helper.attribute(child,"lang")));
00177             }
00178           }
00179         }
00180         dataPtr->atoms.push_back(message);
00181       }
00182 
00183     } // namespace yum
00184   } // namespace parser
00185 } // namespace zypp

Generated on Tue Sep 25 19:23:03 2007 for libzypp by  doxygen 1.5.3