00001
00002
00003
00004
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
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
00102
00103
00104
00105
00106
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
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
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
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
00148 if (reader_r->name() == "file")
00149 {
00150
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
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
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
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 }
00210 }
00211 }
00212
00213