00001
00002
00003
00004
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
00048 bool
00049 XMLPatchParser::isInterested(const xmlNodePtr nodePtr)
00050 {
00051 return _helper.isElement(nodePtr) && _helper.name(nodePtr) == "patch";
00052 }
00053
00054
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
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 }
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
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 }
00184 }
00185 }