00001
00002
00003
00004
00005
00006
00007
00008
00013 #include <zypp/parser/yum/YUMRepomdParser.h>
00014 #include <zypp/parser/LibXMLHelper.h>
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/base/Logger.h>
00021 #include <zypp/parser/yum/schemanames.h>
00022
00023 using namespace std;
00024 namespace zypp
00025 {
00026 namespace parser
00027 {
00028 namespace yum
00029 {
00030
00031 YUMRepomdParser::~YUMRepomdParser()
00032 { }
00033
00034 YUMRepomdParser::YUMRepomdParser()
00035 { }
00036
00037 YUMRepomdParser::YUMRepomdParser(YUMRepomdData_Ptr& entry)
00038 : XMLNodeIterator<YUMRepomdData_Ptr>(entry)
00039 { }
00040
00041
00042
00043 bool
00044 YUMRepomdParser::isInterested(const xmlNodePtr nodePtr)
00045 {
00046 return _helper.isElement(nodePtr) && _helper.name(nodePtr) == "data";
00047 }
00048
00049
00050 YUMRepomdData_Ptr
00051 YUMRepomdParser::process(const xmlTextReaderPtr reader)
00052 {
00053 xml_assert(reader);
00054 YUMRepomdData_Ptr repoPtr = new YUMRepomdData;
00055 xmlNodePtr dataNode = xmlTextReaderExpand(reader);
00056 xml_assert(dataNode);
00057 repoPtr->type = _helper.attribute(dataNode,"type");
00058
00059 for (xmlNodePtr child = dataNode->children;
00060 child && child != dataNode;
00061 child = child->next)
00062 {
00063 if (_helper.isElement(child))
00064 {
00065 string name = _helper.name(child);
00066 if (name == "location")
00067 {
00068 repoPtr->location = _helper.attribute(child,"href");
00069 }
00070 else if (name == "checksum")
00071 {
00072 repoPtr->checksumType = _helper.attribute(child,"type");
00073 repoPtr->checksum = _helper.content(child);
00074 }
00075 else if (name == "timestamp")
00076 {
00077 repoPtr->timestamp = _helper.content(child);
00078 }
00079 else if (name == "open-checksum")
00080 {
00081 repoPtr->openChecksumType = _helper.attribute(child, "type");
00082 repoPtr->openChecksum = _helper.content(child);
00083 }
00084 else
00085 {
00086 WAR << "YUM <data> contains the unknown element <" << name << "> "
00087 << _helper.positionInfo(child) << ", skipping" << endl;
00088 }
00089 }
00090 }
00091 return repoPtr;
00092 }
00093
00094
00095 YUMRepomdParser::YUMRepomdParser(std::istream &is, const std::string &baseUrl, parser::ParserProgress::Ptr progress)
00096 : XMLNodeIterator<YUMRepomdData_Ptr>(is, baseUrl,REPOMDSCHEMA, progress)
00097 {
00098 fetchNext();
00099 }
00100
00101 }
00102 }
00103 }