libept
apt.h
Go to the documentation of this file.
1 // -*- C++ -*-
2 #ifndef EPT_APT_APT_H
3 #define EPT_APT_APT_H
4 
9 /*
10  * Copyright (C) 2007,2008 Enrico Zini <enrico@enricozini.org>
11  *
12  * This library is free software; you can redistribute it and/or
13  * modify it under the terms of the GNU Lesser General Public
14  * License as published by the Free Software Foundation; either
15  * version 2.1 of the License, or (at your option) any later version.
16  *
17  * This library is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20  * Lesser General Public License for more details.
21  *
22  * You should have received a copy of the GNU Lesser General Public
23  * License along with this library; if not, write to the Free Software
24  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
25  */
26 
27 #include <ept/apt/version.h>
28 #include <iterator>
29 #include <stdexcept>
30 
31 class pkgCache;
32 
33 namespace ept {
34 namespace apt {
35 
36 class Exception : public std::runtime_error
37 {
38 public:
39  Exception(const std::string& message);
40  ~Exception() noexcept override;
41 };
42 
43 class Apt;
44 class AptImplementation;
45 class RecordIteratorImpl;
46 
47 struct PackageState {
48  enum Query {
49  Install = 1 << 0,
50  Upgrade = 1 << 1,
51  Keep = 1 << 2,
52  Remove = 1 << 3,
53  Installed = 1 << 4,
54  Upgradable = 1 << 5,
55  NowBroken = 1 << 6,
56  WillBreak = 1 << 7,
57  ReInstall = 1 << 8,
58  Purge = 1 << 9,
59  Hold = 1 << 10,
60  Valid = 1 << 11
61  };
62 
63  typedef unsigned state;
64 
65  operator unsigned() { return m_state; };
66 
67  PackageState &operator=( unsigned i ) {
68  m_state = i;
69  return *this;
70  }
71 
73  m_state |= s.m_state;
74  return *this;
75  }
76 
77  PackageState( unsigned a ) {
78  m_state = a;
79  }
80 
81  PackageState() : m_state( 0 ) {}
82 
83  // FIXME this probably needs to be used consistently in core and out of core
84  bool isValid() const { return m_state & Valid; }
85  // FIXME compatibility API for non-core apt
86  bool isInstalled() const { return installed(); }
87 
88  bool install() const { return m_state & Install; }
89  // reinstall() implies install()
90  bool reinstall() const { return m_state & ReInstall; }
91  bool remove() const { return m_state & Remove; }
92  // purge() implies remove()
93  bool purge() const { return m_state & Purge; }
94  bool keep() const { return m_state & Keep; }
95  bool willBreak() const { return m_state & WillBreak; }
96  // upgrade() implies install()
97  bool upgrade() const { return hasNewVersion() && install(); }
98  // newInsstal() implies install()
99  bool newInstall() const { return !installed() && install(); }
100  bool hold() const { return m_state & Hold; }
101 
102  bool installed() const { return m_state & Installed; }
103  bool hasNewVersion() const { return m_state & Upgradable; }
104  bool upgradable() const { return hasNewVersion() && !hold(); }
105  bool held() const { return hasNewVersion() && hold(); }
106  bool nowBroken() const { return m_state & NowBroken; }
107 
108  bool modify() const { return install() || remove(); }
109 
110 protected:
111  unsigned m_state;
112 };
113 
120 class Apt
121 {
122 protected:
123  AptImplementation* impl;
124 
125 public:
126  // Iterate Packages in the Apt cache
127  class Iterator : public std::iterator<std::input_iterator_tag, std::string, void, void, void>
128  {
129  void* cur;
130 
131  protected:
132  // Construct a valid iterator
133  Iterator(void* cur) : cur(cur) {}
134 
135  // Construct and end iterator
136  Iterator() : cur(0) {}
137 
138  public:
139  // Copy constructor
140  Iterator(const Iterator&);
141  ~Iterator();
142  std::string operator*();
143  Iterator& operator++();
144  Iterator& operator=(const Iterator&);
145  bool operator==(const Iterator&) const;
146  bool operator!=(const Iterator&) const;
147 
148  // FIXME: Iterator operator++(int); cannot be easily implemented
149  // because of how Apt's pkgIterator works
150 
151  friend class Apt;
152  };
153 
154  // Iterate Package records in the Apt cache
155  class RecordIterator : public std::iterator<std::input_iterator_tag, std::string, void, void, void>
156  {
157  RecordIteratorImpl* impl;
158  size_t pos;
159  std::string cur;
160  size_t cur_pos;
161 
162  protected:
163  // Construct a valid iterator
164  RecordIterator(RecordIteratorImpl* cur, size_t pos = 0);
165 
166  // Construct and end iterator
167  RecordIterator() : impl(0), pos(0), cur_pos(0) {}
168 
169  public:
170  // Copy constructor
171  RecordIterator(const RecordIterator& r);
172 
173  ~RecordIterator();
174  std::string operator*();
175  std::string* operator->();
176  RecordIterator& operator++();
177  RecordIterator& operator=(const RecordIterator& r);
178  bool operator==(const RecordIterator&) const;
179  bool operator!=(const RecordIterator&) const;
180 
181  // FIXME: Iterator operator++(int); cannot be easily implemented
182  // because of how Apt's pkgIterator works
183 
184  friend class Apt;
185  };
186 
189 
193  Apt();
194  ~Apt();
195 
196 
197  iterator begin() const;
198  iterator end() const;
199 
200  record_iterator recordBegin() const;
201  record_iterator recordEnd() const;
202 
203 
205  size_t size() const;
206 
211  bool isValid(const std::string& pkg) const;
212 
215  std::string validate(const std::string& pkg) const
216  {
217  if (isValid(pkg))
218  return pkg;
219  return std::string();
220  }
221 
224  Version validate(const Version& ver) const;
225 
227  Version installedVersion(const std::string& pkg) const;
228 
230  Version candidateVersion(const std::string& pkg) const;
231 
236  Version anyVersion(const std::string& pkg) const;
237 
239  PackageState state(const std::string& pkg) const;
240 
247  //template<typename FILTER, typename OUT>
248  //void search(const FILTER& filter, OUT& out);
249 
251  std::string rawRecord(const std::string& pkg) const;
252 
254  std::string rawRecord(const Version& ver) const;
255 
257  const pkgCache* aptPkgCache() const;
258 
259 
260 
262  time_t timestamp();
263 
270  void checkCacheUpdates();
271 
278  void invalidateTimestamp();
279 };
280 
281 }
282 }
283 
284 // vim:set ts=4 sw=4:
285 #endif
PackageState(unsigned a)
Definition: apt.h:77
bool purge() const
Definition: apt.h:93
Query
Definition: apt.h:48
Definition: apt.h:47
std::string validate(const std::string &pkg) const
Validate a package name, returning it if it exists in the APT database, or returning the empty string...
Definition: apt.h:215
Exception(const std::string &message)
Definition: apt.cc:66
Iterator iterator
Definition: apt.h:187
bool install() const
Definition: apt.h:88
size_t size(const std::string &file)
File size.
Definition: sys.cc:116
bool upgradable() const
Definition: apt.h:104
PackageState & operator|=(const PackageState &s)
Definition: apt.h:72
Iterator(void *cur)
Definition: apt.h:133
bool held() const
Definition: apt.h:105
bool newInstall() const
Definition: apt.h:99
String functions.
Definition: apt.cc:38
bool installed() const
Definition: apt.h:102
RecordIterator()
Definition: apt.h:167
PackageState()
Definition: apt.h:81
bool upgrade() const
Definition: apt.h:97
bool reinstall() const
Definition: apt.h:90
Definition: apt.h:36
High-level access to the Apt cache, as a data provider for the ept framework.
Definition: apt.h:120
~Exception() noexcept override
Definition: apt.cc:71
unsigned m_state
Definition: apt.h:111
Definition: apt.h:127
bool isInstalled() const
Definition: apt.h:86
bool hold() const
Definition: apt.h:100
bool isValid() const
Definition: apt.h:84
Iterator()
Definition: apt.h:136
Representation of a package with a version.
Definition: apt.h:155
AptImplementation * impl
Definition: apt.h:123
bool modify() const
Definition: apt.h:108
time_t timestamp()
Return the last update timestamp of the index.
Definition: axi.cc:48
bool willBreak() const
Definition: apt.h:95
PackageState & operator=(unsigned i)
Definition: apt.h:67
RecordIterator record_iterator
Definition: apt.h:188
bool keep() const
Definition: apt.h:94
unsigned state
Definition: apt.h:63
Lightweight Version class that represent a package with a version, with very cheap value copy operati...
Definition: version.h:40
bool nowBroken() const
Definition: apt.h:106
bool hasNewVersion() const
Definition: apt.h:103