• Main Page
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

package.h

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 
00003 #ifndef EPT_APT_PACKAGE_H
00004 #define EPT_APT_PACKAGE_H
00005 
00006 namespace ept {
00007 namespace core {
00008 namespace package {
00009 
00010 struct Setup {
00011     typedef ept::Token Token;
00012     typedef package::Internal Internal;
00013     typedef package::PropertyId PropertyId;
00014     typedef package::InternalList InternalList;
00015 };
00016 
00017 template<> struct PropertyType< Name > { typedef std::string T; };
00018 template<> struct PropertyType< Versions > { typedef VersionList T; };
00019 template<> struct PropertyType< AnyVersion > { typedef Token T; };
00020 template<> struct PropertyType< State > { typedef PackageState T; };
00021 template<> struct PropertyType< CandidateVersion > { typedef Token T; };
00022 template<> struct PropertyType< InstalledVersion > { typedef Token T; };
00023 
00024 struct Source : core::Source< Source, Setup, PropertyType >
00025 {
00026     AptDatabase &m_db;
00027 
00028     Source( AptDatabase &db ) : m_db( db ) {}
00029 
00030     InternalList listInternal() {
00031         return InternalList( m_db.cache().PkgBegin() );
00032     }
00033 
00034     Internal lookupToken( Token t ) {
00035         return m_db.lookupPackage( t );
00036     }
00037 
00038     Token getToken( Internal i ) {
00039         Token t;
00040         t._id = i.Name();
00041         return t;
00042     }
00043 
00044     bool exists( Token t ) {
00045         if ( t.hasVersion() )
00046             return !m_db.lookupVersion( t ).end();
00047         else
00048             return !lookupToken( t ).end();
00049     }
00050 
00051     Token versionToken( pkgCache::VerIterator vi ) {
00052         if ( vi.end() )
00053             return Token();
00054         return Token( std::string( vi.ParentPkg().Name() ) + "_" + vi.VerStr() );
00055     }
00056 
00057     template< PropertyId p >
00058     typename PropertyType< p >::T getInternal( Internal );
00059 
00060     template< typename List >
00061     void revertState( List l ) {
00062         while ( !l.empty() ) {
00063             PackageState s = getInternal< State >( l.head() );
00064             if ( !s.keep() || s.purge() ) {
00065                 pkgDepCache::StateCache &S = db().state()[ l.head() ];
00066                 db().state().MarkKeep( l.head(), false, false );
00067                 S.iFlags &= ~pkgDepCache::Purge;
00068                 S.iFlags &= ~pkgDepCache::ReInstall;
00069             }
00070             l = l.tail();
00071         }
00072     }
00073 
00074     void revertStates() {
00075         pkgDepCache::ActionGroup group( db().state() );
00076         revertState( listInternal() );
00077     }
00078 
00079     typedef ComposedList< State > ChangeList;
00080 
00081     static bool isChanged( Token t, PackageState s );
00082     static bool isUpgradable( Token t, PackageState s );
00083 
00084     PropertyFilter< State, __typeof( &isChanged ) >::T changedList() {
00085         return propertyFilter< State >( isChanged );
00086     }
00087 
00088     PropertyFilter< State, __typeof( &isUpgradable ) >::T upgradableList() {
00089         return propertyFilter< State >( isUpgradable );
00090     }
00091 
00092     AptDatabase &db() { return m_db; }
00093 };
00094 
00095 template<> inline std::string Source::getInternal< Name >( Internal i ) {
00096     return i.Name();
00097 }
00098 
00099 template<> inline PackageState Source::getInternal< State >( Internal i ) {
00100     return m_db.packageState( i );
00101 }
00102 
00103 template<> inline Token Source::getInternal< CandidateVersion >( Internal i ) {
00104     return versionToken( m_db.candidateVersion( i ) );
00105 }
00106 
00107 template<> inline Token Source::getInternal< AnyVersion >( Internal i ) {
00108     return versionToken( m_db.candidateVersion( i ) );
00109 }
00110 
00111 template<> inline Token Source::getInternal< InstalledVersion >( Internal i ) {
00112     return versionToken( m_db.installedVersion( i ) );
00113 }
00114 
00115 inline bool Source::isChanged( Token, PackageState s ) {
00116     return s.modify();
00117 }
00118 
00119 inline bool Source::isUpgradable( Token, PackageState s ) {
00120     return s.upgradable();
00121 }
00122 
00123 }
00124 }
00125 }
00126 
00127 #endif

Generated on Fri Oct 14 2011 17:41:02 for libept by  doxygen 1.7.1