00001 /*---------------------------------------------------------------------\ 00002 | ____ _ __ __ ___ | 00003 | |__ / \ / / . \ . \ | 00004 | / / \ V /| _/ _/ | 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 namespace parser { 00026 namespace yum { 00027 00028 YUMRepomdParser::~YUMRepomdParser() 00029 { } 00030 00031 YUMRepomdParser::YUMRepomdParser() 00032 { } 00033 00034 YUMRepomdParser::YUMRepomdParser(YUMRepomdData_Ptr& entry) 00035 : XMLNodeIterator<YUMRepomdData_Ptr>(entry) 00036 { } 00037 00038 00039 // select for which elements process() will be called 00040 bool 00041 YUMRepomdParser::isInterested(const xmlNodePtr nodePtr) 00042 { 00043 return _helper.isElement(nodePtr) && _helper.name(nodePtr) == "data"; 00044 } 00045 00046 // do the actual processing 00047 YUMRepomdData_Ptr 00048 YUMRepomdParser::process(const xmlTextReaderPtr reader) 00049 { 00050 xml_assert(reader); 00051 YUMRepomdData_Ptr repoPtr = new YUMRepomdData; 00052 xmlNodePtr dataNode = xmlTextReaderExpand(reader); 00053 xml_assert(dataNode); 00054 repoPtr->type = _helper.attribute(dataNode,"type"); 00055 00056 for (xmlNodePtr child = dataNode->children; 00057 child && child != dataNode; 00058 child = child->next) { 00059 if (_helper.isElement(child)) { 00060 string name = _helper.name(child); 00061 if (name == "location") { 00062 repoPtr->location = _helper.attribute(child,"href"); 00063 } 00064 else if (name == "checksum") { 00065 repoPtr->checksumType = _helper.attribute(child,"type"); 00066 repoPtr->checksum = _helper.content(child); 00067 } 00068 else if (name == "timestamp") { 00069 repoPtr->timestamp = _helper.content(child); 00070 } 00071 else if (name == "open-checksum") { 00072 repoPtr->openChecksumType = _helper.attribute(child, "type"); 00073 repoPtr->openChecksum = _helper.content(child); 00074 } 00075 else { 00076 WAR << "YUM <data> contains the unknown element <" << name << "> " 00077 << _helper.positionInfo(child) << ", skipping" << endl; 00078 } 00079 } 00080 } 00081 return repoPtr; 00082 } /* end process */ 00083 00084 00085 YUMRepomdParser::YUMRepomdParser(istream &is, const string &baseUrl) 00086 : XMLNodeIterator<YUMRepomdData_Ptr>(is, baseUrl,REPOMDSCHEMA) 00087 { 00088 fetchNext(); 00089 } 00090 00091 } // namespace yum 00092 } // namespace parser 00093 } // namespace zypp