00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef PKGLIB_ORDERLIST_H
00017 #define PKGLIB_ORDERLIST_H
00018
00019
00020 #include <apt-pkg/pkgcache.h>
00021
00022 class pkgDepCache;
00023 class pkgOrderList : protected pkgCache::Namespace
00024 {
00025 protected:
00026
00027 pkgDepCache &Cache;
00028 typedef bool (pkgOrderList::*DepFunc)(DepIterator D);
00029
00030
00031 DepFunc Primary;
00032 DepFunc Secondary;
00033 DepFunc RevDepends;
00034 DepFunc Remove;
00035
00036
00037 Package **End;
00038 Package **List;
00039 Package **AfterEnd;
00040 string *FileList;
00041 DepIterator Loops[20];
00042 int LoopCount;
00043 int Depth;
00044 unsigned short *Flags;
00045 bool Debug;
00046
00047
00048 bool VisitNode(PkgIterator Pkg);
00049 bool VisitDeps(DepFunc F,PkgIterator Pkg);
00050 bool VisitRDeps(DepFunc F,PkgIterator Pkg);
00051 bool VisitRProvides(DepFunc F,VerIterator Ver);
00052 bool VisitProvides(DepIterator Pkg,bool Critical);
00053
00054
00055 bool DepUnPackCrit(DepIterator D);
00056 bool DepUnPackPreD(DepIterator D);
00057 bool DepUnPackPre(DepIterator D);
00058 bool DepUnPackDep(DepIterator D);
00059 bool DepConfigure(DepIterator D);
00060 bool DepRemove(DepIterator D);
00061
00062
00063 bool AddLoop(DepIterator D);
00064 bool CheckDep(DepIterator D);
00065 bool DoRun();
00066
00067
00068 static pkgOrderList *Me;
00069 static int OrderCompareA(const void *a, const void *b);
00070 static int OrderCompareB(const void *a, const void *b);
00071 int FileCmp(PkgIterator A,PkgIterator B);
00072
00073 public:
00074
00075 typedef Package **iterator;
00076
00077
00078 enum Flags {Added = (1 << 0), AddPending = (1 << 1),
00079 Immediate = (1 << 2), Loop = (1 << 3),
00080 UnPacked = (1 << 4), Configured = (1 << 5),
00081 Removed = (1 << 6),
00082 InList = (1 << 7),
00083 After = (1 << 8),
00084 States = (UnPacked | Configured | Removed)};
00085
00086
00087 inline bool IsFlag(PkgIterator Pkg,unsigned long F) {return (Flags[Pkg->ID] & F) == F;};
00088 inline bool IsFlag(Package *Pkg,unsigned long F) {return (Flags[Pkg->ID] & F) == F;};
00089 void Flag(PkgIterator Pkg,unsigned long State, unsigned long F) {Flags[Pkg->ID] = (Flags[Pkg->ID] & (~F)) | State;};
00090 inline void Flag(PkgIterator Pkg,unsigned long F) {Flags[Pkg->ID] |= F;};
00091 inline void Flag(Package *Pkg,unsigned long F) {Flags[Pkg->ID] |= F;};
00092 inline bool IsNow(PkgIterator Pkg) {return (Flags[Pkg->ID] & (States & (~Removed))) == 0;};
00093 bool IsMissing(PkgIterator Pkg);
00094 void WipeFlags(unsigned long F);
00095 void SetFileList(string *FileList) {this->FileList = FileList;};
00096
00097
00098 inline iterator begin() {return List;};
00099 inline iterator end() {return End;};
00100 inline void push_back(Package *Pkg) {*(End++) = Pkg;};
00101 inline void push_back(PkgIterator Pkg) {*(End++) = Pkg;};
00102 inline void pop_back() {End--;};
00103 inline bool empty() {return End == List;};
00104 inline unsigned int size() {return End - List;};
00105
00106
00107 bool OrderCritical();
00108 bool OrderUnpack(string *FileList = 0);
00109 bool OrderConfigure();
00110
00111 int Score(PkgIterator Pkg);
00112
00113 pkgOrderList(pkgDepCache *Cache);
00114 ~pkgOrderList();
00115 };
00116
00117 #endif