libept  0.5.25
package.h
Go to the documentation of this file.
1 // -*- C++ -*-
2 
3 #ifndef EPT_APT_PACKAGE_H
4 #define EPT_APT_PACKAGE_H
5 
6 namespace ept {
7 namespace core {
8 namespace package {
9 
10 struct Setup {
11  typedef ept::Token Token;
15 };
16 
17 template<> struct PropertyType< Name > { typedef std::string T; };
18 template<> struct PropertyType< Versions > { typedef VersionList T; };
19 template<> struct PropertyType< AnyVersion > { typedef Token T; };
20 template<> struct PropertyType< State > { typedef PackageState T; };
21 template<> struct PropertyType< CandidateVersion > { typedef Token T; };
22 template<> struct PropertyType< InstalledVersion > { typedef Token T; };
23 
24 struct Source : core::Source< Source, Setup, PropertyType >
25 {
27 
28  Source( AptDatabase &db ) : m_db( db ) {}
29 
31  return InternalList( m_db.cache().PkgBegin() );
32  }
33 
35  return m_db.lookupPackage( t );
36  }
37 
39  Token t;
40  t._id = i.Name();
41  return t;
42  }
43 
44  bool exists( Token t ) {
45  if ( t.hasVersion() )
46  return !m_db.lookupVersion( t ).end();
47  else
48  return !lookupToken( t ).end();
49  }
50 
51  Token versionToken( pkgCache::VerIterator vi ) {
52  if ( vi.end() )
53  return Token();
54  return Token( std::string( vi.ParentPkg().Name() ) + "_" + vi.VerStr() );
55  }
56 
57  template< PropertyId p >
59 
60  template< typename List >
61  void revertState( List l ) {
62  while ( !l.empty() ) {
63  PackageState s = getInternal< State >( l.head() );
64  if ( !s.keep() || s.purge() ) {
65  pkgDepCache::StateCache &S = db().state()[ l.head() ];
66  db().state().MarkKeep( l.head(), false, false );
67  S.iFlags &= ~pkgDepCache::Purge;
68  S.iFlags &= ~pkgDepCache::ReInstall;
69  }
70  l = l.tail();
71  }
72  }
73 
74  void revertStates() {
75  pkgDepCache::ActionGroup group( db().state() );
77  }
78 
79  typedef ComposedList< State > ChangeList;
80 
81  static bool isChanged( Token t, PackageState s );
82  static bool isUpgradable( Token t, PackageState s );
83 
84  PropertyFilter< State, __typeof( &isChanged ) >::T changedList() {
85  return propertyFilter< State >( isChanged );
86  }
87 
88  PropertyFilter< State, __typeof( &isUpgradable ) >::T upgradableList() {
89  return propertyFilter< State >( isUpgradable );
90  }
91 
92  AptDatabase &db() { return m_db; }
93 };
94 
95 template<> inline std::string Source::getInternal< Name >( Internal i ) {
96  return i.Name();
97 }
98 
99 template<> inline PackageState Source::getInternal< State >( Internal i ) {
100  return m_db.packageState( i );
101 }
102 
103 template<> inline Token Source::getInternal< CandidateVersion >( Internal i ) {
104  return versionToken( m_db.candidateVersion( i ) );
105 }
106 
107 template<> inline Token Source::getInternal< AnyVersion >( Internal i ) {
108  return versionToken( m_db.candidateVersion( i ) );
109 }
110 
111 template<> inline Token Source::getInternal< InstalledVersion >( Internal i ) {
112  return versionToken( m_db.installedVersion( i ) );
113 }
114 
116  return s.modify();
117 }
118 
120  return s.upgradable();
121 }
122 
123 }
124 }
125 }
126 
127 #endif