00001
00002
00003
00004
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
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
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
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
00137 if (reader_r->name() == "package")
00138 {
00139 tag(tag_package);
00140
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
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
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
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 }
00203 }
00204 }
00205
00206