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;
12 : typedef package::Internal Internal;
13 : typedef package::PropertyId PropertyId;
14 : typedef package::InternalList InternalList;
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 15 : {
26 : AptDatabase &m_db;
27 :
28 15 : Source( AptDatabase &db ) : m_db( db ) {}
29 :
30 3 : InternalList listInternal() {
31 3 : return InternalList( m_db.cache().PkgBegin() );
32 : }
33 :
34 17 : Internal lookupToken( Token t ) {
35 17 : return m_db.lookupPackage( t );
36 : }
37 :
38 3777 : Token getToken( Internal i ) {
39 3777 : Token t;
40 3777 : t._id = i.Name();
41 0 : return t;
42 : }
43 :
44 8 : bool exists( Token t ) {
45 8 : if ( t.hasVersion() )
46 0 : return !m_db.lookupVersion( t ).end();
47 : else
48 8 : 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 >
58 : typename PropertyType< p >::T getInternal( Internal );
59 :
60 : template< typename List >
61 1 : void revertState( List l ) {
62 3779 : while ( !l.empty() ) {
63 3777 : PackageState s = getInternal< State >( l.head() );
64 3777 : if ( !s.keep() || s.purge() ) {
65 2 : pkgDepCache::StateCache &S = db().state()[ l.head() ];
66 2 : db().state().MarkKeep( l.head(), false, false );
67 2 : S.iFlags &= ~pkgDepCache::Purge;
68 2 : S.iFlags &= ~pkgDepCache::ReInstall;
69 : }
70 3777 : l = l.tail();
71 : }
72 1 : }
73 :
74 1 : void revertStates() {
75 1 : pkgDepCache::ActionGroup group( db().state() );
76 1 : revertState( listInternal() );
77 1 : }
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 9 : AptDatabase &db() { return m_db; }
93 : };
94 :
95 3778 : template<> inline std::string Source::getInternal< Name >( Internal i ) {
96 3778 : return i.Name();
97 : }
98 :
99 3783 : template<> inline PackageState Source::getInternal< State >( Internal i ) {
100 3783 : 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 :
115 : inline bool Source::isChanged( Token, PackageState s ) {
116 : return s.modify();
117 : }
118 :
119 : inline bool Source::isUpgradable( Token, PackageState s ) {
120 : return s.upgradable();
121 : }
122 :
123 : }
124 : }
125 : }
126 :
127 : #endif
|