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(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
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 == "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 }
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
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 }
00193 }
00194 }