PrimaryFileReader.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/ZConfig.h"
00014 
00015 #include "zypp/parser/xml/Reader.h"
00016 #include "zypp/data/ResolvableData.h"
00017 #include "zypp/base/UserRequestException.h"
00018 
00019 #include "zypp/parser/yum/FileReaderBaseImpl.h"
00020 #include "zypp/parser/yum/PrimaryFileReader.h"
00021 
00022 #undef ZYPP_BASE_LOGGER_LOGGROUP
00023 #define ZYPP_BASE_LOGGER_LOGGROUP "parser::yum"
00024 
00025 using namespace std;
00026 using namespace zypp::xml;
00027 
00028 namespace zypp
00029 {
00030   namespace parser
00031   {
00032     namespace yum
00033     {
00034 
00035 
00037   //
00038   //  CLASS NAME : PrimaryFileReader::Impl
00039   //
00040   class PrimaryFileReader::Impl : public BaseImpl
00041   {
00042   public:
00044     Impl(const Pathname & primary_file,
00045          const ProcessPackage & callback,
00046          const ProgressData::ReceiverFnc & progress);
00047 
00065     bool consumeNode(xml::Reader & reader_r);
00066 
00067   private:
00073     data::Packagebase_Ptr handoutPackage();
00074 
00075   private:
00079     ProcessPackage _callback;
00080 
00085     data::Packagebase_Ptr _package;
00086 
00090     ProgressData _ticks;
00091 
00095     Arch _sysarch;
00096   };
00098 
00099 
00100   PrimaryFileReader::Impl::Impl(
00101       const Pathname & primary_file,
00102       const ProcessPackage & callback,
00103       const ProgressData::ReceiverFnc & progress)
00104     :
00105       _callback(callback)
00106     , _sysarch( ZConfig::instance().systemArchitecture() )
00107   {
00108     _ticks.sendTo(progress);
00109 
00110     Reader reader(primary_file);
00111     MIL << "Reading " << primary_file << endl;
00112     reader.foreachNode(bind( &PrimaryFileReader::Impl::consumeNode, this, _1 ));
00113   }
00114 
00115   // --------------------------------------------------------------------------
00116 
00117   bool PrimaryFileReader::Impl::consumeNode(Reader & reader_r)
00118   {
00119 //    DBG << "**node: " << reader_r->name() << " (" << reader_r->nodeType() << ")" << endl;
00120     if (isBeingProcessed(tag_package) && consumePackageNode(reader_r, _package))
00121       return true;
00122 
00123 
00124     if (reader_r->nodeType() == XML_READER_TYPE_ELEMENT)
00125     {
00126       // xpath: /metadata
00127       if (reader_r->name() == "metadata")
00128       {
00129         unsigned total_packages;
00130         zypp::str::strtonum(reader_r->getAttribute("packages").asString(), total_packages);
00131         _ticks.range(total_packages);
00132         _ticks.toMin();
00133         return true;
00134       }
00135 
00136       // xpath: /metadata/package (+)
00137       if (reader_r->name() == "package")
00138       {
00139         tag(tag_package);
00140   //      DBG << "got " << reader_r->getAttribute("type") << " package" << endl;
00141         _package = new data::Package;
00142 
00143         return consumePackageNode(reader_r, _package);
00144       }
00145     }
00146 
00147     else if ( reader_r->nodeType() == XML_READER_TYPE_END_ELEMENT )
00148     {
00149       // xpath: /metadata/package (+)
00150       if (reader_r->name() == "package")
00151       {
00152         if (_package && _callback
00153             && _package->arch.compatibleWith( _sysarch ))
00154         {
00155           _callback(handoutPackage());
00156         }
00157         if (!_ticks.incr())
00158           ZYPP_THROW(AbortRequestException());
00159 
00160         toParentTag();
00161         return true;
00162       }
00163 
00164       // xpath: /metdata
00165       if (reader_r->name() == "metadata")
00166       {
00167         _ticks.toMax();
00168         return true;
00169       }
00170     }
00171 
00172     return true;
00173   }
00174 
00175   // --------------------------------------------------------------------------
00176 
00177   data::Packagebase_Ptr PrimaryFileReader::Impl::handoutPackage()
00178   {
00179     data::Packagebase_Ptr ret;
00180     ret.swap(_package);
00181     return ret;
00182   }
00183 
00185   //
00186   //  CLASS NAME : PrimaryFileReader
00187   //
00189 
00190   PrimaryFileReader::PrimaryFileReader(
00191       const Pathname & primary_file,
00192       const ProcessPackage & callback,
00193       const ProgressData::ReceiverFnc & progress)
00194     : _pimpl(new PrimaryFileReader::Impl(primary_file, callback, progress))
00195   {}
00196 
00197 
00198   PrimaryFileReader::~PrimaryFileReader()
00199   {}
00200 
00201 
00202     } // ns yum
00203   } // ns parser
00204 } //ns zypp
00205 
00206 // vim: set ts=2 sts=2 sw=2 et ai:

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