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(istream &is, const 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 == "summary") {
00077               patchPtr->summary.setText(_helper.content(child), Locale(_helper.attribute(child,"lang")));
00078             }
00079             else if (name == "description") {
00080               patchPtr->description.setText(_helper.content(child), Locale(_helper.attribute(child,"lang")));
00081             }
00082             else if (name == "id") {
00083               patchPtr->patchId = _helper.content(child);
00084             }
00085             else if (name == "timestamp") {
00086               patchPtr->timestamp = _helper.content(child);
00087             }
00088             else if (name == "category") {
00089             patchPtr->category = _helper.content(child);
00090             }
00091             else if (name == "reboot-needed") {
00092             patchPtr->rebootNeeded = true;
00093             }
00094             else if (name == "affects-package-manager") {
00095               patchPtr->packageManager = true;
00096             }
00097             else if (name == "interactive") {
00098               patchPtr->interactive = true;
00099             }
00100             else if (name == "atoms") {
00101               parseAtomsNode(patchPtr, child);
00102             }
00103           }
00104         }
00105         return patchPtr;
00106       } /* end process */
00107       
00108       
00109       void 
00110       XMLPatchParser::parseAtomsNode(XMLPatchData_Ptr dataPtr, xmlNodePtr formatNode)
00111       {
00112         xml_assert(formatNode);
00113         for (xmlNodePtr child = formatNode->children; child != 0; child = child ->next)
00114         {
00115           if (_helper.isElement(child))
00116           {
00117             string name = _helper.name(child);
00118             XXX << "parseAtomsNode(" << name << ")" << endl;
00119             if (name == "atom")
00120             {
00121                 parseAtomNode (dataPtr, child);
00122             }
00123             else if (name == "script")
00124             {
00125                 parseScriptNode (dataPtr, child);
00126             }
00127             else if (name == "message")
00128             {
00129                 parseMessageNode (dataPtr, child);
00130             }
00131           }
00132         }
00133       } 
00134     
00135       void
00136       XMLPatchParser::parseAtomNode(XMLPatchData_Ptr dataPtr, xmlNodePtr formatNode)
00137       {
00138         XMLPatchAtomData_Ptr atom(new XMLPatchAtomData);
00139         // inject dependencies and other stuff
00140         parseResObjectCommonData( atom, formatNode);
00141         parseDependencies( atom, formatNode);
00142               
00143         dataPtr->atoms.push_back(atom);
00144       }
00145       
00146       void
00147       XMLPatchParser::parseScriptNode(XMLPatchData_Ptr dataPtr, xmlNodePtr formatNode)
00148       {
00149         XMLPatchScriptData_Ptr script(new XMLPatchScriptData);
00150         
00151         parseResObjectCommonData( script, formatNode);
00152         parseDependencies( script, formatNode);
00153         
00154         for (xmlNodePtr child = formatNode->children;  child != 0; child = child ->next)
00155         { 
00156           if (_helper.isElement(child))
00157           {
00158             string name = _helper.name(child);
00159             if (name == "do") {
00160               script->do_script = _helper.content(child);
00161             }
00162             else if (name == "undo")
00163             {
00164               script->undo_script = _helper.content(child);
00165             }
00166           }
00167         }
00168         dataPtr->atoms.push_back(script);
00169       }
00170       
00171       void
00172       XMLPatchParser::parseMessageNode(XMLPatchData_Ptr dataPtr, xmlNodePtr formatNode)
00173       {
00174         XMLPatchMessageData_Ptr message(new XMLPatchMessageData);
00175         
00176         parseResObjectCommonData( message, formatNode);
00177         parseDependencies( message, formatNode);
00178         
00179         for (xmlNodePtr child = formatNode->children;  child != 0; child = child ->next)
00180         {
00181           if (_helper.isElement(child))
00182           {
00183             string name = _helper.name(child);
00184             if (name == "text") {
00185               message->text.setText(_helper.content(child), Locale(_helper.attribute(child,"lang")));
00186             }
00187           }
00188         }        
00189         dataPtr->atoms.push_back(message);
00190       }
00191 
00192     } // namespace yum
00193   } // namespace parser
00194 } // namespace zypp

Generated on Thu May 4 16:03:23 2006 for zypp by  doxygen 1.4.6