]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/orderlist.h
tests: don't do boundless string compares with data()
[apt.git] / apt-pkg / orderlist.h
index 7a33b97cc845c8debaba8495b5e404ba5d235c11..9171c45d66adc0794117d1ffd1e6458b98bb03a5 100644 (file)
@@ -1,42 +1,33 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: orderlist.h,v 1.3 1999/07/03 03:10:35 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 "apt-pkg/orderlist.h"
-#endif 
-
 #include <apt-pkg/pkgcache.h>
+#include <apt-pkg/cacheiterators.h>
+#include <apt-pkg/macros.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
@@ -48,18 +39,21 @@ class pkgOrderList
    // State
    Package **End;
    Package **List;
-   string *FileList;
+   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);
@@ -75,21 +69,26 @@ class pkgOrderList
    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
@@ -98,9 +97,14 @@ class pkgOrderList
    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;};
@@ -112,13 +116,13 @@ class pkgOrderList
    
    // Ordering modes
    bool OrderCritical();
-   bool OrderUnpack(string *FileList = 0);
+   bool OrderUnpack(std::string *FileList = 0);
    bool OrderConfigure();
 
    int Score(PkgIterator Pkg);
 
-   pkgOrderList(pkgDepCache &Cache);
-   ~pkgOrderList();
+   explicit pkgOrderList(pkgDepCache *Cache);
+   virtual ~pkgOrderList();
 };
 
 #endif