PackagesFileReader.cc

Go to the documentation of this file.
00001 /*---------------------------------------------------------------------\
00002 |                          ____ _   __ __ ___                          |
00003 |                         |__  / \ / / . \ . \                         |
00004 |                           / / \ V /|  _/  _/                         |
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       //        CLASS NAME : PackagesFileReader::Impl
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             //  Filter unwanted stuff
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: // single tags
00081           void consumeVer( const SingleTagPtr & tag_r )
00082           { /* NOP */; }
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               // _data->arch is arch_noarch per default
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: // [medianr filename]
00170                 _data->repositoryLocation.setLocation( Pathname(_data->arch.asString()) / words[1],
00171                                                        str::strtonum<unsigned>(words[0]) );
00172                 break;
00173 
00174               case 3: // [medianr filename dir]
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: // multi tags
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       //        CLASS NAME : PackagesFileReader
00315       //
00317 
00319       //
00320       //        METHOD NAME : PackagesFileReader::PackagesFileReader
00321       //        METHOD TYPE : Ctor
00322       //
00323       PackagesFileReader::PackagesFileReader()
00324       {}
00325 
00327       //
00328       //        METHOD NAME : PackagesFileReader::~PackagesFileReader
00329       //        METHOD TYPE : Dtor
00330       //
00331       PackagesFileReader::~PackagesFileReader()
00332       {}
00333 
00335       //
00336       //        METHOD NAME : PackagesFileReader::beginParse
00337       //        METHOD TYPE : void
00338       //
00339       void PackagesFileReader::beginParse()
00340       {
00341         _pimpl.reset( new Impl(*this) );
00342       }
00343 
00345       //
00346       //        METHOD NAME : PackagesFileReader::consume
00347       //        METHOD TYPE : void
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           // consume old data
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           // start new data
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       //        METHOD NAME : PackagesFileReader::consume
00391       //        METHOD TYPE : void
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       //        METHOD NAME : PackagesFileReader::lastData
00414       //        METHOD TYPE : void
00415       //
00416       void PackagesFileReader::endParse()
00417       {
00418         // consume oldData
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     } // namespace susetags
00441   } // namespace parser
00444 } // namespace zypp

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