libept
0.5.25
|
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