FilelistsFileReader.cc

Go to the documentation of this file.
00001 /*---------------------------------------------------------------------\
00002 |                          ____ _   __ __ ___                          |
00003 |                         |__  / \ / / . \ . \                         |
00004 |                           / / \ V /|  _/  _/                         |
00005 |                          / /__ | | | | | |                           |
00006 |                         /_____||_| |_| |_|                           |
00007 |                                                                      |
00008 \---------------------------------------------------------------------*/
00012 #include "zypp/base/Logger.h"
00013 #include "zypp/parser/xml/Reader.h"
00014 #include "zypp/base/UserRequestException.h"
00015 
00016 #include "zypp/parser/yum/FilelistsFileReader.h"
00017 
00018 #undef ZYPP_BASE_LOGGER_LOGGROUP
00019 #define ZYPP_BASE_LOGGER_LOGGROUP "parser::yum"
00020 
00021 using namespace std;
00022 using namespace zypp::xml;
00023 
00024 namespace zypp
00025 {
00026   namespace parser
00027   {
00028     namespace yum
00029     {
00030 
00031 
00033   //
00034   //  CLASS NAME : FilelistsFileReader::Impl
00035   //
00036   class FilelistsFileReader::Impl : private base::NonCopyable
00037   {
00038   public:
00039     Impl(
00040       const Pathname & filelists_file,
00041       const ProcessPackage & callback,
00042       const ProgressData::ReceiverFnc & progress = ProgressData::ReceiverFnc());
00043 
00044   public:
00045 
00049     bool consumeNode(xml::Reader & reader_r);
00050 
00056     data::Resolvable_Ptr handoutResolvable();
00057 
00058   private:
00059 
00064     zypp::data::Resolvable_Ptr _resolvable;
00065 
00069     data::Filenames _filenames;
00070 
00074     ProcessPackage _callback;
00075 
00079     ProgressData _ticks;
00080   };
00082 
00083   FilelistsFileReader::Impl::Impl(
00084       const Pathname & filelists_file,
00085       const ProcessPackage & callback,
00086       const ProgressData::ReceiverFnc & progress)
00087     :
00088       _callback(callback)
00089   {
00090     _ticks.sendTo(progress);
00091     _ticks.name("filelist.xml.gz");
00092 
00093     Reader reader(filelists_file);
00094     MIL << "Reading " << filelists_file << endl;
00095     reader.foreachNode(bind(&FilelistsFileReader::Impl::consumeNode, this, _1));
00096   }
00097 
00098   // --------------------------------------------------------------------------
00099 
00100   /*
00101    * xpath and multiplicity of processed nodes are included in the code
00102    * for convenience:
00103    *
00104    * // xpath: <xpath> (?|*|+)
00105    *
00106    * if multiplicity is ommited, then the node has multiplicity 'one'.
00107    */
00108 
00109   // --------------------------------------------------------------------------
00110 
00111 
00112   bool FilelistsFileReader::Impl::consumeNode(Reader & reader_r)
00113   {
00114     if (reader_r->nodeType() == XML_READER_TYPE_ELEMENT)
00115     {
00116       // xpath: /filelists
00117       if (reader_r->name() == "filelists")
00118       {
00119         unsigned total_packages;
00120         zypp::str::strtonum(reader_r->getAttribute("packages").asString(), total_packages);
00121         _ticks.range(total_packages);
00122         _ticks.toMin();
00123         return true;
00124       }
00125 
00126       // xpath: /filelists/package (+)
00127       if (reader_r->name() == "package")
00128       {
00129         _resolvable = new data::Resolvable;
00130         _filenames.clear();
00131 
00132         _resolvable->name = reader_r->getAttribute("name").asString();
00133         _resolvable->arch = Arch(reader_r->getAttribute("arch").asString());
00134 
00135         return true;
00136       }
00137 
00138       // xpath: /filelists/package/version
00139       if (reader_r->name() == "version")
00140       {
00141         _resolvable->edition = Edition(reader_r->getAttribute("ver").asString(),
00142                                     reader_r->getAttribute("rel").asString(),
00143                                     reader_r->getAttribute("epoch").asString());
00144         return true;
00145       }
00146 
00147       // xpath: /filelists/package/file (*)
00148       if (reader_r->name() == "file")
00149       {
00150         // ignoring type dir/ghost  reader_r->getAttribute("type").asString();
00151         _filenames.push_back(reader_r.nodeText().asString());
00152         return true;
00153       }
00154     }
00155 
00156     else if (reader_r->nodeType() == XML_READER_TYPE_END_ELEMENT)
00157     {
00158       // xpath: /filelists/package
00159       if (reader_r->name() == "package")
00160       {
00161         if (_callback && !_filenames.empty())
00162           _callback(handoutResolvable(), _filenames);
00163 
00164         if (!_ticks.incr())
00165           ZYPP_THROW(AbortRequestException());
00166 
00167         return true;
00168       }
00169 
00170       // xpath: /filelists
00171       if (reader_r->name() == "filelists")
00172       {
00173         _ticks.toMax();
00174         return true;
00175       }
00176     }
00177 
00178     return true;
00179   }
00180 
00181   // --------------------------------------------------------------------------
00182 
00183   data::Resolvable_Ptr FilelistsFileReader::Impl::handoutResolvable()
00184   {
00185     data::Resolvable_Ptr ret;
00186     ret.swap(_resolvable);
00187     return ret;
00188   }
00189 
00190 
00192   //
00193   //  CLASS NAME : FilelistsFileReader
00194   //
00196 
00197   FilelistsFileReader::FilelistsFileReader(
00198       const Pathname & filelists_file,
00199       const ProcessPackage & callback,
00200       const ProgressData::ReceiverFnc & progress)
00201     :
00202       _pimpl(new Impl(filelists_file, callback, progress))
00203   {}
00204 
00205   FilelistsFileReader::~FilelistsFileReader()
00206   {}
00207 
00208 
00209     } // ns yum
00210   } // ns parser
00211 } // ns zypp
00212 
00213 // vim: set ts=2 sts=2 sw=2 et ai:

Generated on Tue Sep 25 19:23:03 2007 for libzypp by  doxygen 1.5.3