std::string category;
bool rebootNeeded;
bool packageManager;
+ bool interactive;
std::string updateScript;
std::list<XMLPatchAtomData_Ptr > atoms;
};
{ }
XMLPatchParser::XMLPatchParser(istream &is, const string& baseUrl)
- : XMLNodeIterator<XMLPatchData_Ptr>(is, baseUrl /*,PATCHSCHEMA*/)
+ : XMLNodeIterator<XMLPatchData_Ptr>(is, baseUrl ,PATCHSCHEMA)
{
fetchNext();
}
XMLPatchData_Ptr patchPtr = new XMLPatchData();
xmlNodePtr dataNode = xmlTextReaderExpand(reader);
xml_assert(dataNode);
- patchPtr->timestamp = _helper.attribute(dataNode,"timestamp");
- patchPtr->patchId = _helper.attribute(dataNode,"patchid");
- patchPtr->engine = _helper.attribute(dataNode,"engine");
-
+
// default values for optional entries
patchPtr->rebootNeeded = false;
patchPtr->packageManager = false;
else if (name == "description") {
patchPtr->description.setText(_helper.content(child), Locale(_helper.attribute(child,"lang")));
}
+ else if (name == "id") {
+ patchPtr->patchId = _helper.content(child);
+ }
+ else if (name == "timestamp") {
+ patchPtr->timestamp = _helper.content(child);
+ }
else if (name == "category") {
patchPtr->category = _helper.content(child);
}
- else if (name == "reboot_needed") {
+ else if (name == "reboot-needed") {
patchPtr->rebootNeeded = true;
}
- else if (name == "package_manager") {
+ else if (name == "affects-package-manager") {
patchPtr->packageManager = true;
}
- else if (name == "update_script") {
- patchPtr->updateScript = _helper.content(child);
+ else if (name == "interactive") {
+ patchPtr->interactive = true;
}
else if (name == "atoms") {
parseAtomsNode(patchPtr, child);
--- /dev/null
+default namespace = "http://www.novell.com/metadata/zypp/xml-store"
+
+include "resolvable.rnc"
+
+start = element-patch
+
+element-patch =
+ element patch { patch }
+
+element-message =
+ element message { message }
+
+message =
+ resolvable-data,
+ element text { text }
+
+element-script =
+ element script { script }
+
+script =
+ resolvable-data,
+ element do { text },
+ element undo { text }
+
+element-atom =
+ element atom { atom }
+
+atom =
+ resolvable-data
+
+atoms =
+ element-script* & element-message* & element-atom*
+
+patch =
+ resolvable-data,
+ element-summary+,
+ element-description+,
+ element id { text },
+ element timestamp { text },
+ element category { text },
+ element affects-package-manager { boolean },
+ element reboot-needed { boolean },
+ element interactive { boolean },
+ element atoms { atoms }
+
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<grammar ns="http://www.novell.com/metadata/zypp/xml-store" xmlns="http://relaxng.org/ns/structure/1.0">
+ <include href="resolvable.rng"/>
+ <start>
+ <ref name="element-patch"/>
+ </start>
+ <define name="element-patch">
+ <element name="patch">
+ <ref name="patch"/>
+ </element>
+ </define>
+ <define name="element-message">
+ <element name="message">
+ <ref name="message"/>
+ </element>
+ </define>
+ <define name="message">
+ <ref name="resolvable-data"/>
+ <element name="text">
+ <text/>
+ </element>
+ </define>
+ <define name="element-script">
+ <element name="script">
+ <ref name="script"/>
+ </element>
+ </define>
+ <define name="script">
+ <ref name="resolvable-data"/>
+ <element name="do">
+ <text/>
+ </element>
+ <element name="undo">
+ <text/>
+ </element>
+ </define>
+ <define name="element-atom">
+ <element name="atom">
+ <ref name="atom"/>
+ </element>
+ </define>
+ <define name="atom">
+ <ref name="resolvable-data"/>
+ </define>
+ <define name="atoms">
+ <interleave>
+ <zeroOrMore>
+ <ref name="element-script"/>
+ </zeroOrMore>
+ <zeroOrMore>
+ <ref name="element-message"/>
+ </zeroOrMore>
+ <zeroOrMore>
+ <ref name="element-atom"/>
+ </zeroOrMore>
+ </interleave>
+ </define>
+ <define name="patch">
+ <ref name="resolvable-data"/>
+ <oneOrMore>
+ <ref name="element-summary"/>
+ </oneOrMore>
+ <oneOrMore>
+ <ref name="element-description"/>
+ </oneOrMore>
+ <element name="id">
+ <text/>
+ </element>
+ <element name="timestamp">
+ <text/>
+ </element>
+ <element name="category">
+ <text/>
+ </element>
+ <element name="affects-package-manager">
+ <ref name="boolean"/>
+ </element>
+ <element name="reboot-needed">
+ <ref name="boolean"/>
+ </element>
+ <element name="interactive">
+ <ref name="boolean"/>
+ </element>
+ <element name="atoms">
+ <ref name="atoms"/>
+ </element>
+ </define>
+</grammar>
element pattern { pattern }
pattern =
- resolvable-data?,
+ resolvable-data,
element-summary+,
element-description+,
element default { boolean }?,
</element>
</define>
<define name="pattern">
- <optional>
- <ref name="resolvable-data"/>
- </optional>
+ <ref name="resolvable-data"/>
<oneOrMore>
<ref name="element-summary"/>
</oneOrMore>
#define PATTERNSCHEMA (SCHEMABASE "pattern.rng")
//#define FILELISTSCHEMA (SCHEMABASE "filelists.rng")
//#define OTHERSCHEMA (SCHEMABASE "other.rng")
- //#define PATCHSCHEMA (SCHEMABASE "patch.rng")
+ #define PATCHSCHEMA (SCHEMABASE "patch.rng")
//#define PATCHESSCHEMA (SCHEMABASE "patches.rng")
//#define PRODUCTSCHEMA (SCHEMABASE "product.rng")
} // namespace xmlstore
stringstream out;
out << "<atom>" << std::endl;
out << toXML(static_cast<Resolvable::constPtr>(obj)) << std::endl;
-
- // access implementation
- out << toXML(obj->deps()) << std::endl;
out << "</atom>" << std::endl;
return out.str();
}
{
stringstream out;
out << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" << std::endl;
- out << "<patch xmlns=\"http://www.novell.com/metadata/zypp/xml-store\"" << std::endl;
- out << " patchid=\"" << xml_escape(obj->id()) << "\"" << std::endl;
- out << " timestamp=\"" << obj->timestamp().asSeconds() << "\"" << std::endl;
- out << " engine=\"1.0\">" << std::endl;
+ out << "<patch xmlns=\"http://www.novell.com/metadata/zypp/xml-store\">" << std::endl;
+
// reuse Resolvable information serialize function
out << toXML(static_cast<Resolvable::constPtr>(obj));
+
+ // access implementation
+ detail::ResImplTraits<Patch::Impl>::constPtr pipp( detail::ImplConnect::resimpl( obj ) );
+ out << translatedTextToXML(pipp->summary(), "summary");
+ out << translatedTextToXML(pipp->description(), "description");
+
+ out << "<id>" << xml_escape(obj->id()) << "</id>" << std::endl;
+ out << "<timestamp>" << obj->timestamp().asSeconds() << "</timestamp>" << std::endl;
+
+ out << "<category>" << obj->category() << "</category>" << std::endl;
+ out << "<affects-package-manager>" << ( obj->affects_pkg_manager() ? "true" : "false" ) << "</affects-package-manager>" << std::endl;
+ out << "<reboot-needed>" << ( obj->reboot_needed() ? "true" : "false" ) << "</reboot-needed>" << std::endl;
+ out << "<interactive>" << ( obj->interactive() ? "true" : "false" ) << "</interactive>" << std::endl;
+
Patch::AtomList at = obj->atoms();
out << " <atoms>" << std::endl;
for (Patch::AtomList::iterator it = at.begin(); it != at.end(); it++)
{
- // atoms tag here looks weird but lets follow YUM
-
- // I have a better idea to avoid the cast here (Michaels code in his tmp/)
Resolvable::Ptr one_atom = *it;
out << castedToXML(one_atom) << std::endl;
}