apt  0.9.7.5ubuntu2
orderlist.h
1 // -*- mode: cpp; mode: fold -*-
2 // Description /*{{{*/
3 // $Id: orderlist.h,v 1.9 2001/02/20 07:03:17 jgg Exp $
4 /* ######################################################################
5 
6  Order List - Represents and Manipulates an ordered list of packages.
7 
8  A list of packages can be ordered by a number of conflicting criteria
9  each given a specific priority. Each package also has a set of flags
10  indicating some useful things about it that are derived in the
11  course of sorting. The pkgPackageManager class uses this class for
12  all of it's installation ordering needs.
13 
14  ##################################################################### */
15  /*}}}*/
16 #ifndef PKGLIB_ORDERLIST_H
17 #define PKGLIB_ORDERLIST_H
18 
19 
20 #include <apt-pkg/pkgcache.h>
21 #include <apt-pkg/macros.h>
22 
23 class pkgDepCache;
25 {
26  protected:
27 
28  pkgDepCache &Cache;
29  typedef bool (pkgOrderList::*DepFunc)(DepIterator D);
30 
31  // These are the currently selected ordering functions
32  DepFunc Primary;
33  DepFunc Secondary;
34  DepFunc RevDepends;
35  DepFunc Remove;
36 
37  // State
38  Package **End;
39  Package **List;
40  Package **AfterEnd;
41  std::string *FileList;
42  DepIterator Loops[20];
43  int LoopCount;
44  int Depth;
45  unsigned short *Flags;
46  bool Debug;
47 
48  // Main visit function
49  __deprecated bool VisitNode(PkgIterator Pkg) { return VisitNode(Pkg, "UNKNOWN"); };
50  bool VisitNode(PkgIterator Pkg, char const* from);
51  bool VisitDeps(DepFunc F,PkgIterator Pkg);
52  bool VisitRDeps(DepFunc F,PkgIterator Pkg);
53  bool VisitRProvides(DepFunc F,VerIterator Ver);
54  bool VisitProvides(DepIterator Pkg,bool Critical);
55 
56  // Dependency checking functions.
57  bool DepUnPackCrit(DepIterator D);
58  bool DepUnPackPreD(DepIterator D);
59  bool DepUnPackPre(DepIterator D);
60  bool DepUnPackDep(DepIterator D);
61  bool DepConfigure(DepIterator D);
62  bool DepRemove(DepIterator D);
63 
64  // Analysis helpers
65  bool AddLoop(DepIterator D);
66  bool CheckDep(DepIterator D);
67  bool DoRun();
68 
69  // For pre sorting
70  static pkgOrderList *Me;
71  static int OrderCompareA(const void *a, const void *b);
72  static int OrderCompareB(const void *a, const void *b);
73  int FileCmp(PkgIterator A,PkgIterator B);
74 
75  public:
76 
77  typedef Package **iterator;
78 
79  /* State flags
80  The Loop flag can be set on a package that is currently being processed by either SmartConfigure or
81  SmartUnPack. This allows the package manager to tell when a loop has been formed as it will try to
82  SmartUnPack or SmartConfigure a package with the Loop flag set. It will then either stop (as it knows
83  that the operation is unnecessary as its already in process), or in the case of the conflicts resolution
84  in SmartUnPack, use EarlyRemove to resolve the situation. */
85  enum Flags {Added = (1 << 0), AddPending = (1 << 1),
86  Immediate = (1 << 2), Loop = (1 << 3),
87  UnPacked = (1 << 4), Configured = (1 << 5),
88  Removed = (1 << 6), // Early Remove
89  InList = (1 << 7),
90  After = (1 << 8),
91  States = (UnPacked | Configured | Removed)};
92 
93  // Flag manipulators
94  inline bool IsFlag(PkgIterator Pkg,unsigned long F) {return (Flags[Pkg->ID] & F) == F;};
95  inline bool IsFlag(Package *Pkg,unsigned long F) {return (Flags[Pkg->ID] & F) == F;};
96  void Flag(PkgIterator Pkg,unsigned long State, unsigned long F) {Flags[Pkg->ID] = (Flags[Pkg->ID] & (~F)) | State;};
97  inline void Flag(PkgIterator Pkg,unsigned long F) {Flags[Pkg->ID] |= F;};
98  inline void Flag(Package *Pkg,unsigned long F) {Flags[Pkg->ID] |= F;};
99  // RmFlag removes a flag from a package
100  inline void RmFlag(Package *Pkg,unsigned long F) {Flags[Pkg->ID] &= ~F;};
101  // IsNow will return true if the Pkg has been not been either configured or unpacked
102  inline bool IsNow(PkgIterator Pkg) {return (Flags[Pkg->ID] & (States & (~Removed))) == 0;};
103  bool IsMissing(PkgIterator Pkg);
104  void WipeFlags(unsigned long F);
105  void SetFileList(std::string *FileList) {this->FileList = FileList;};
106 
107  // Accessors
108  inline iterator begin() {return List;};
109  inline iterator end() {return End;};
110  inline void push_back(Package *Pkg) {*(End++) = Pkg;};
111  inline void push_back(PkgIterator Pkg) {*(End++) = Pkg;};
112  inline void pop_back() {End--;};
113  inline bool empty() {return End == List;};
114  inline unsigned int size() {return End - List;};
115 
116  // Ordering modes
117  bool OrderCritical();
118  bool OrderUnpack(std::string *FileList = 0);
119  bool OrderConfigure();
120 
121  int Score(PkgIterator Pkg);
122 
123  pkgOrderList(pkgDepCache *Cache);
124  ~pkgOrderList();
125 };
126 
127 #endif