// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
-// $Id: orderlist.h,v 1.1 1998/07/07 04:17:01 jgg Exp $
/* ######################################################################
Order List - Represents and Manipulates an ordered list of packages.
A list of packages can be ordered by a number of conflicting criteria
each given a specific priority. Each package also has a set of flags
- indicating some usefull things about it that are derived in the
+ indicating some useful things about it that are derived in the
course of sorting. The pkgPackageManager class uses this class for
all of it's installation ordering needs.
##################################################################### */
/*}}}*/
-// Header section: pkglib
#ifndef PKGLIB_ORDERLIST_H
#define PKGLIB_ORDERLIST_H
-#ifdef __GNUG__
-#pragma interface "pkglib/orderlist.h"
-#endif
+#include <apt-pkg/pkgcache.h>
+#include <apt-pkg/cacheiterators.h>
+#include <apt-pkg/macros.h>
-#include <pkglib/pkgcache.h>
+#include <string>
class pkgDepCache;
-class pkgOrderList
+class pkgOrderList : protected pkgCache::Namespace
{
+ void * const d;
protected:
- pkgDepCache &Cache;
-
- // Bring some usefull types into the local scope
- typedef pkgCache::PkgIterator PkgIterator;
- typedef pkgCache::VerIterator VerIterator;
- typedef pkgCache::DepIterator DepIterator;
- typedef pkgCache::PrvIterator PrvIterator;
- typedef pkgCache::Package Package;
- typedef pkgCache::Version Version;
+ pkgDepCache &Cache;
typedef bool (pkgOrderList::*DepFunc)(DepIterator D);
// These are the currently selected ordering functions
// State
Package **End;
Package **List;
+ Package **AfterEnd;
+ std::string *FileList;
DepIterator Loops[20];
int LoopCount;
int Depth;
- unsigned char *Flags;
+ unsigned short *Flags;
+ bool Debug;
// Main visit function
- bool VisitNode(PkgIterator Pkg);
+ APT_DEPRECATED_MSG("Add a unique calling identifier as parameter for debugging output") bool VisitNode(PkgIterator Pkg) { return VisitNode(Pkg, "UNKNOWN"); };
+ bool VisitNode(PkgIterator Pkg, char const* from);
bool VisitDeps(DepFunc F,PkgIterator Pkg);
bool VisitRDeps(DepFunc F,PkgIterator Pkg);
bool VisitRProvides(DepFunc F,VerIterator Ver);
- bool VisitProvides(DepIterator Pkg);
+ bool VisitProvides(DepIterator Pkg,bool Critical);
// Dependency checking functions.
bool DepUnPackCrit(DepIterator D);
bool DoRun();
// For pre sorting
- static pkgOrderList *Me;
- static int OrderCompareA(const void *a, const void *b);
- static int OrderCompareB(const void *a, const void *b);
- int FileCmp(PkgIterator A,PkgIterator B);
+ int OrderCompareA(Package *a, Package *b) APT_PURE;
+ int OrderCompareB(Package *a, Package *b) APT_PURE;
+ int FileCmp(PkgIterator A,PkgIterator B) APT_PURE;
public:
typedef Package **iterator;
- // State flags
+ /* State flags
+ The Loop flag can be set on a package that is currently being processed by either SmartConfigure or
+ SmartUnPack. This allows the package manager to tell when a loop has been formed as it will try to
+ SmartUnPack or SmartConfigure a package with the Loop flag set. It will then either stop (as it knows
+ that the operation is unnecessary as its already in process), or in the case of the conflicts resolution
+ in SmartUnPack, use EarlyRemove to resolve the situation. */
enum Flags {Added = (1 << 0), AddPending = (1 << 1),
Immediate = (1 << 2), Loop = (1 << 3),
UnPacked = (1 << 4), Configured = (1 << 5),
- Removed = (1 << 6),
+ Removed = (1 << 6), // Early Remove
InList = (1 << 7),
+ After = (1 << 8),
States = (UnPacked | Configured | Removed)};
// Flag manipulators
void Flag(PkgIterator Pkg,unsigned long State, unsigned long F) {Flags[Pkg->ID] = (Flags[Pkg->ID] & (~F)) | State;};
inline void Flag(PkgIterator Pkg,unsigned long F) {Flags[Pkg->ID] |= F;};
inline void Flag(Package *Pkg,unsigned long F) {Flags[Pkg->ID] |= F;};
- inline bool IsNow(PkgIterator Pkg) {return (Flags[Pkg->ID] & States) == 0;};
+ // RmFlag removes a flag from a package
+ inline void RmFlag(Package *Pkg,unsigned long F) {Flags[Pkg->ID] &= ~F;};
+ // IsNow will return true if the Pkg has been not been either configured or unpacked
+ inline bool IsNow(PkgIterator Pkg) {return (Flags[Pkg->ID] & (States & (~Removed))) == 0;};
+ bool IsMissing(PkgIterator Pkg) APT_PURE;
void WipeFlags(unsigned long F);
-
+ void SetFileList(std::string *FileList) {this->FileList = FileList;};
+
// Accessors
inline iterator begin() {return List;};
inline iterator end() {return End;};
// Ordering modes
bool OrderCritical();
- bool OrderUnpack();
+ bool OrderUnpack(std::string *FileList = 0);
bool OrderConfigure();
int Score(PkgIterator Pkg);
- pkgOrderList(pkgDepCache &Cache);
- ~pkgOrderList();
+ explicit pkgOrderList(pkgDepCache *Cache);
+ virtual ~pkgOrderList();
};
#endif