00001
00002
00003
00004
00005
00006
00007
00008
00012 #include <iostream>
00013 #include "zypp/base/Logger.h"
00014 #include "zypp/ZConfig.h"
00015
00016 #include "zypp/parser/susetags/PackagesFileReader.h"
00017 #include "zypp/parser/susetags/FileReaderBaseImpl.h"
00018
00019 using std::endl;
00020 #undef ZYPP_BASE_LOGGER_LOGGROUP
00021 #define ZYPP_BASE_LOGGER_LOGGROUP "parser::susetags"
00022
00024 namespace zypp
00025 {
00026
00027 namespace parser
00028 {
00029
00030 namespace susetags
00031 {
00032
00034
00035
00036
00038 class PackagesFileReader::Impl : public BaseImpl
00039 {
00040 public:
00041 Impl( const PackagesFileReader & parent_r )
00042 : BaseImpl( parent_r )
00043 , _sysarch( ZConfig::instance().systemArchitecture() )
00044 {}
00045
00046 virtual ~Impl()
00047 {}
00048
00049 bool hasPackage() const
00050 { return _pkgData; }
00051
00052 bool hasSourcepackage() const
00053 { return _srcpkgData; }
00054
00055 data::Package_Ptr handoutPackage()
00056 {
00057 data::Package_Ptr ret;
00058 ret.swap( _pkgData );
00059 _srcpkgData = 0;
00060 _data = 0;
00061
00062 if ( ret
00063 && ! ret->arch.compatibleWith( _sysarch ) )
00064 {
00065 return 0;
00066 }
00067 return ret;
00068 }
00069
00070 data::SrcPackage_Ptr handoutSourcepackage()
00071 {
00072 data::SrcPackage_Ptr ret;
00073 ret.swap( _srcpkgData );
00074 _pkgData = 0;
00075 _data = 0;
00076 return ret;
00077 }
00078
00079 public:
00081 void consumeVer( const SingleTagPtr & tag_r )
00082 { ; }
00083
00085 void consumePkg( const SingleTagPtr & tag_r )
00086 {
00087 std::vector<std::string> words;
00088 if ( str::split( tag_r->value, std::back_inserter(words) ) != 4 )
00089 {
00090 ZYPP_THROW( error( tag_r, "Expected [name version release arch]") );
00091 }
00092
00093 if ( words[3] == "src" || words[3] == "nosrc")
00094 {
00095 ++_c_srcpkg;
00096 _data = _srcpkgData = new data::SrcPackage;
00097 _pkgData = 0;
00098
00099 }
00100 else
00101 {
00102 ++_c_pkg;
00103 _data = _pkgData = new data::Package;
00104 _srcpkgData = 0;
00105 _data->arch = Arch( words[3] );
00106 }
00107 _data->name = words[0];
00108 _data->edition = Edition( words[1],words[2] );
00109 }
00110
00112 void consumeCks( const SingleTagPtr & tag_r )
00113 {
00114 std::vector<std::string> words;
00115 if ( str::split( tag_r->value, std::back_inserter(words) ) != 2 )
00116 {
00117 ZYPP_THROW( error( tag_r, "Expected [type checksum]") );
00118 }
00119 _data->repositoryLocation.setChecksum(CheckSum( words[0], words[1] ));
00120 }
00121
00123 void consumeGrp( const SingleTagPtr & tag_r )
00124 {
00125 _data->group = tag_r->value;
00126 }
00127
00129 void consumeVnd( const SingleTagPtr & tag_r )
00130 {
00131 _data->vendor = tag_r->value;
00132 }
00133
00135 void consumeLic( const SingleTagPtr & tag_r )
00136 {
00137 _data->license = tag_r->value;
00138 }
00139
00141 void consumeSrc( const SingleTagPtr & tag_r )
00142 {
00143 if ( ! _pkgData )
00144 {
00145 ZYPP_THROW( error( tag_r, "Unexpected sourcepackage definition for sourcepackage") );
00146 }
00147
00148 std::vector<std::string> words;
00149 if ( str::split( tag_r->value, std::back_inserter(words) ) != 4 )
00150 {
00151 ZYPP_THROW( error( tag_r, "Expected sourcepackages [name version release arch]") );
00152 }
00153
00154 _pkgData->srcPackageIdent = NVR( words[0], Edition( words[1],words[2] ) );
00155 }
00156
00158 void consumeTim( const SingleTagPtr & tag_r )
00159 {
00160 _data->buildTime = str::strtonum<Date::ValueType>( tag_r->value );
00161 }
00162
00164 void consumeLoc( const SingleTagPtr & tag_r )
00165 {
00166 std::vector<std::string> words;
00167 switch ( str::split( tag_r->value, std::back_inserter(words) ) )
00168 {
00169 case 2:
00170 _data->repositoryLocation.setLocation( Pathname(_data->arch.asString()) / words[1],
00171 str::strtonum<unsigned>(words[0]) );
00172 break;
00173
00174 case 3:
00175 _data->repositoryLocation.setLocation( Pathname(words[2]) / words[1],
00176 str::strtonum<unsigned>(words[0]) );
00177 break;
00178
00179 default:
00180 ZYPP_THROW( error( tag_r, "Expected [medianr filename dir]") );
00181 break;
00182 }
00183 }
00184
00186 void consumeSiz( const SingleTagPtr & tag_r )
00187 {
00188 std::vector<std::string> words;
00189 if ( str::split( tag_r->value, std::back_inserter(words) ) != 2 )
00190 {
00191 ZYPP_THROW( error( tag_r, "Expected [archivesize size]") );
00192 }
00193 _data->repositoryLocation.setDownloadSize(str::strtonum<ByteCount::SizeType>( words[0] ));
00194 _data->installedSize = str::strtonum<ByteCount::SizeType>( words[1] );
00195 }
00196
00201 void consumeShr( const SingleTagPtr & tag_r )
00202 {
00203 std::vector<std::string> words;
00204 if ( str::split( tag_r->value, std::back_inserter(words) ) != 4 )
00205 {
00206 ZYPP_THROW( error( tag_r, "Expected [name version release arch]") );
00207 }
00208
00209 if ( words[3] == "src" || words[3] == "nosrc")
00210 {
00211 _data->sharedDataTag = makeSharedIdent( ResTraits<SrcPackage>::kind,
00212 words[0],
00213 Edition( words[1], words[2] ),
00214 Arch() );
00215 }
00216 else
00217 {
00218 _data->sharedDataTag = makeSharedIdent( ResTraits<Package>::kind,
00219 words[0],
00220 Edition( words[1], words[2] ),
00221 Arch( words[3] ) );
00222 }
00223 }
00224
00225 public:
00227 void consumeReq( const MultiTagPtr & tag_r )
00228 {
00229 depParse<Package>( tag_r, _data->deps[Dep::REQUIRES] );
00230 }
00231
00233 void consumePrq( const MultiTagPtr & tag_r )
00234 {
00235 depParse<Package>( tag_r, _data->deps[Dep::PREREQUIRES] );
00236 }
00237
00239 void consumePrv( const MultiTagPtr & tag_r )
00240 {
00241 depParse<Package>( tag_r, _data->deps[Dep::PROVIDES] );
00242 }
00243
00245 void consumeCon( const MultiTagPtr & tag_r )
00246 {
00247 depParse<Package>( tag_r, _data->deps[Dep::CONFLICTS] );
00248 }
00249
00251 void consumeObs( const MultiTagPtr & tag_r )
00252 {
00253 depParse<Package>( tag_r, _data->deps[Dep::OBSOLETES] );
00254 }
00255
00257 void consumeRec( const MultiTagPtr & tag_r )
00258 {
00259 depParse<Package>( tag_r, _data->deps[Dep::RECOMMENDS] );
00260 }
00261
00263 void consumeFre( const MultiTagPtr & tag_r )
00264 {
00265 depParse<Package>( tag_r, _data->deps[Dep::FRESHENS] );
00266 }
00267
00269 void consumeEnh( const MultiTagPtr & tag_r )
00270 {
00271 depParse<Package>( tag_r, _data->deps[Dep::ENHANCES] );
00272 }
00273
00275 void consumeSug( const MultiTagPtr & tag_r )
00276 {
00277 depParse<Package>( tag_r, _data->deps[Dep::SUGGESTS] );
00278 }
00279
00281 void consumeSup( const MultiTagPtr & tag_r )
00282 {
00283 depParse<Package>( tag_r, _data->deps[Dep::SUPPLEMENTS] );
00284 }
00285
00287 void consumeKwd( const MultiTagPtr & tag_r )
00288 {
00289 std::copy( tag_r->value.begin(),
00290 tag_r->value.end(),
00291 std::inserter(_data->keywords, _data->keywords.begin()) );
00292 }
00293
00295 void consumeAut( const MultiTagPtr & tag_r )
00296 {
00297 _data->authors.swap( tag_r->value );
00298 }
00299
00300 public:
00301 DefaultIntegral<unsigned,0> _c_pkg;
00302 DefaultIntegral<unsigned,0> _c_srcpkg;
00303
00304 private:
00305 data::Packagebase_Ptr _data;
00306 data::Package_Ptr _pkgData;
00307 data::SrcPackage_Ptr _srcpkgData;
00308 Arch _sysarch;
00309 };
00311
00313
00314
00315
00317
00319
00320
00321
00322
00323 PackagesFileReader::PackagesFileReader()
00324 {}
00325
00327
00328
00329
00330
00331 PackagesFileReader::~PackagesFileReader()
00332 {}
00333
00335
00336
00337
00338
00339 void PackagesFileReader::beginParse()
00340 {
00341 _pimpl.reset( new Impl(*this) );
00342 }
00343
00345
00346
00347
00348
00349 void PackagesFileReader::consume( const SingleTagPtr & tag_r )
00350 {
00351 #define TAGN(V) tag_r->name == #V
00352 #define TAGFWD(V) ( TAGN(V) ) _pimpl->consume##V( tag_r )
00353
00354 if ( TAGN( Pkg ) )
00355 {
00356
00357 if ( _pimpl->hasPackage() )
00358 {
00359 if ( _pkgConsumer )
00360 {
00361 data::Package_Ptr ptr = _pimpl->handoutPackage();
00362 if ( ptr )
00363 _pkgConsumer( ptr );
00364 }
00365 }
00366 else if ( _pimpl->hasSourcepackage() )
00367 {
00368 if ( _srcPkgConsumer )
00369 _srcPkgConsumer( _pimpl->handoutSourcepackage() );
00370 }
00371
00372 _pimpl->consumePkg( tag_r );
00373 }
00374 else if TAGFWD( Cks );
00375 else if TAGFWD( Grp );
00376 else if TAGFWD( Vnd );
00377 else if TAGFWD( Lic );
00378 else if TAGFWD( Src );
00379 else if TAGFWD( Tim );
00380 else if TAGFWD( Loc );
00381 else if TAGFWD( Siz );
00382 else if TAGFWD( Shr );
00383 else if TAGFWD( Ver );
00384 else
00385 { WAR << errPrefix( tag_r, "Unknown tag" ) << endl; }
00386 }
00387
00389
00390
00391
00392
00393 void PackagesFileReader::consume( const MultiTagPtr & tag_r )
00394 {
00395 if TAGFWD( Req );
00396 else if TAGFWD( Prq );
00397 else if TAGFWD( Prv );
00398 else if TAGFWD( Con );
00399 else if TAGFWD( Obs );
00400 else if TAGFWD( Rec );
00401 else if TAGFWD( Fre );
00402 else if TAGFWD( Enh );
00403 else if TAGFWD( Sug );
00404 else if TAGFWD( Sup );
00405 else if TAGFWD( Kwd );
00406 else if TAGFWD( Aut );
00407 else
00408 { WAR << errPrefix( tag_r, "Unknown tag" ) << endl; }
00409 }
00410
00412
00413
00414
00415
00416 void PackagesFileReader::endParse()
00417 {
00418
00419 if ( _pimpl->hasPackage() )
00420 {
00421 if ( _pkgConsumer )
00422 {
00423 data::Package_Ptr ptr = _pimpl->handoutPackage();
00424 if ( ptr )
00425 _pkgConsumer( ptr );
00426 }
00427 }
00428 else if ( _pimpl->hasSourcepackage() )
00429 {
00430 if ( _srcPkgConsumer )
00431 _srcPkgConsumer( _pimpl->handoutSourcepackage() );
00432 }
00433 MIL << "[Packages]" << "(" << _pimpl->_c_pkg << "|" << _pimpl->_c_srcpkg << ")" << endl;
00434 _pimpl.reset();
00435 }
00436
00438 }
00441 }
00444 }