libzypp  10.5.0
RepomdFileReader.cc
Go to the documentation of this file.
00001 /*---------------------------------------------------------------------\
00002 |                          ____ _   __ __ ___                          |
00003 |                         |__  / \ / / . \ . \                         |
00004 |                           / / \ V /|  _/  _/                         |
00005 |                          / /__ | | | | | |                           |
00006 |                         /_____||_| |_| |_|                           |
00007 |                                                                      |
00008 \---------------------------------------------------------------------*/
00012 #include <iostream>
00013 
00014 #include "zypp/base/String.h"
00015 #include "zypp/base/Logger.h"
00016 
00017 #include "zypp/Pathname.h"
00018 #include "zypp/Date.h"
00019 #include "zypp/CheckSum.h"
00020 #include "zypp/parser/xml/Reader.h"
00021 
00022 #include "zypp/parser/yum/RepomdFileReader.h"
00023 
00024 #undef ZYPP_BASE_LOGGER_LOGGROUP
00025 #define ZYPP_BASE_LOGGER_LOGGROUP "parser::yum"
00026 
00027 using namespace std;
00028 using namespace zypp::xml;
00029 using zypp::repo::yum::ResourceType;
00030 
00031 namespace zypp
00032 {
00033   namespace parser
00034   {
00035     namespace yum
00036     {
00037 
00038 
00040   //
00041   //  CLASS NAME : RepomdFileReader::Impl
00042   //
00043   class RepomdFileReader::Impl : private base::NonCopyable
00044   {
00045   public:
00046 
00051     enum Tag
00052     {
00053       tag_NONE,
00054       tag_Repomd,
00055       tag_Data,
00056       tag_Location,
00057       tag_CheckSum,
00058       tag_Timestamp,
00059       tag_OpenCheckSum
00060     };
00061 
00062   public:
00068     Impl(const Pathname &repomd_file, const ProcessResource & callback);
00069 
00073     bool consumeNode( Reader & reader_r );
00074 
00075 
00076   private:
00078     OnMediaLocation _location;
00079 
00081     Tag _tag;
00082 
00084     repo::yum::ResourceType _type;
00085 
00087     ProcessResource _callback;
00088 
00090     CheckSum _checksum;
00091 
00093     std::string _checksum_type;
00094 
00096     Date _timestamp;
00097   };
00099 
00100   RepomdFileReader::Impl::Impl(
00101       const Pathname &repomd_file, const ProcessResource & callback)
00102     :
00103       _tag(tag_NONE), _type(ResourceType::NONE_e), _callback(callback)
00104   {
00105     Reader reader( repomd_file );
00106     MIL << "Reading " << repomd_file << endl;
00107     reader.foreachNode( bind( &RepomdFileReader::Impl::consumeNode, this, _1 ) );
00108   }
00109 
00110   // --------------------------------------------------------------------------
00111 
00112   /*
00113    * xpath and multiplicity of processed nodes are included in the code
00114    * for convenience:
00115    *
00116    * // xpath: <xpath> (?|*|+)
00117    *
00118    * if multiplicity is ommited, then the node has multiplicity 'one'.
00119    */
00120 
00121   // --------------------------------------------------------------------------
00122 
00123   bool RepomdFileReader::Impl::consumeNode( Reader & reader_r )
00124   {
00125     if ( reader_r->nodeType() == XML_READER_TYPE_ELEMENT )
00126     {
00127       // xpath: /repomd
00128       if ( reader_r->name() == "repomd" )
00129       {
00130         _tag = tag_Repomd;
00131         return true;
00132       }
00133 
00134       // xpath: /repomd/data (+)
00135       if ( reader_r->name() == "data" )
00136       {
00137         _tag = tag_Data;
00138         _type = ResourceType(reader_r->getAttribute("type").asString());
00139         return true;
00140       }
00141 
00142       // xpath: /repomd/location
00143       if ( reader_r->name() == "location" )
00144       {
00145         _tag = tag_Location;
00146         _location.setLocation( reader_r->getAttribute("href").asString(), 1 );
00147         // ignoring attribute xml:base
00148         return true;
00149       }
00150 
00151       // xpath: /repomd/checksum
00152       if ( reader_r->name() == "checksum" )
00153       {
00154         _tag = tag_CheckSum;
00155         string checksum_type = reader_r->getAttribute("type").asString() ;
00156         string checksum_vaue = reader_r.nodeText().asString();
00157         _location.setChecksum( CheckSum( checksum_type, checksum_vaue ) );
00158         return true;
00159       }
00160 
00161       // xpath: /repomd/timestamp
00162       if ( reader_r->name() == "timestamp" )
00163       {
00164         // ignore it
00165         return true;
00166       }
00167 
00169     }
00170 
00171     else if ( reader_r->nodeType() == XML_READER_TYPE_END_ELEMENT )
00172     {
00173       // xpath: /repomd/data
00174       if ( reader_r->name() == "data" )
00175       {
00176         if (_callback)
00177           _callback( _location, _type );
00178 
00179         return true;
00180       }
00181     }
00182 
00183     return true;
00184   }
00185 
00186 
00188   //
00189   //  CLASS NAME : RepomdFileReader
00190   //
00192 
00193   RepomdFileReader::RepomdFileReader(
00194       const Pathname & repomd_file, const ProcessResource & callback)
00195     :
00196       _pimpl(new Impl(repomd_file, callback))
00197   {}
00198 
00199   RepomdFileReader::~RepomdFileReader()
00200   {}
00201 
00202 
00203     } // ns yum
00204   } // ns parser
00205 } // ns zypp
00206 
00207 // vim: set ts=2 sts=2 sw=2 et ai: