00001
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