]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/acquire.h
* cleanups, documentation updates (don't show any debug output if no Debug::pkgAutoma...
[apt.git] / apt-pkg / acquire.h
index 0d8803c1d708eb999a85664e84a72a816869d395..27bb3d363a985b588c5d199d8c15371d919590eb 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: acquire.h,v 1.9 1998/11/09 01:09:26 jgg Exp $
+// $Id: acquire.h,v 1.29.2.1 2003/12/24 23:09:17 mdz Exp $
 /* ######################################################################
 
    Acquire - File Acquiration
 #include <vector>
 #include <string>
 
+using std::vector;
+using std::string;
+
 #ifdef __GNUG__
 #pragma interface "apt-pkg/acquire.h"
 #endif 
 
+#include <sys/time.h>
 #include <unistd.h>
 
 class pkgAcquireStatus;
@@ -51,8 +55,11 @@ class pkgAcquire
    class Worker;
    struct MethodConfig;
    struct ItemDesc;
-   friend Item;
-   friend Queue;
+   friend class Item;
+   friend class Queue;
+
+   typedef vector<Item *>::iterator ItemIterator;
+   typedef vector<Item *>::const_iterator ItemCIterator;
    
    protected:
    
@@ -78,11 +85,11 @@ class pkgAcquire
    
    void Enqueue(ItemDesc &Item);
    void Dequeue(Item *Item);
-   string QueueName(string URI);
+   string QueueName(string URI,MethodConfig const *&Config);
 
    // FDSET managers for derived classes
-   void SetFds(int &Fd,fd_set *RSet,fd_set *WSet);
-   void RunFds(fd_set *RSet,fd_set *WSet);   
+   virtual void SetFds(int &Fd,fd_set *RSet,fd_set *WSet);
+   virtual void RunFds(fd_set *RSet,fd_set *WSet);   
 
    // A queue calls this when it dequeues an item
    void Bump();
@@ -90,16 +97,33 @@ class pkgAcquire
    public:
 
    MethodConfig *GetConfig(string Access);
-   bool Run();
 
+   enum RunResult {Continue,Failed,Cancelled};
+
+   RunResult Run(int PulseIntervall=500000);
+   void Shutdown();
+   
    // Simple iteration mechanism
    inline Worker *WorkersBegin() {return Workers;};
    Worker *WorkerStep(Worker *I);
-   inline Item **ItemsBegin() {return Items.begin();};
-   inline Item **ItemsEnd() {return Items.end();};
+   inline ItemIterator ItemsBegin() {return Items.begin();};
+   inline ItemIterator ItemsEnd() {return Items.end();};
    
+   // Iterate over queued Item URIs
+   class UriIterator;
+   UriIterator UriBegin();
+   UriIterator UriEnd();
+   
+   // Cleans out the download dir
+   bool Clean(string Dir);
+
+   // Returns the size of the total download set
+   double TotalNeeded();
+   double FetchNeeded();
+   double PartialPresent();
+
    pkgAcquire(pkgAcquireStatus *Log = 0);
-   ~pkgAcquire();
+   virtual ~pkgAcquire();
 };
 
 // Description of an Item+URI
@@ -114,7 +138,9 @@ struct pkgAcquire::ItemDesc
 // List of possible items queued for download.
 class pkgAcquire::Queue
 {
-   friend pkgAcquire;
+   friend class pkgAcquire;
+   friend class pkgAcquire::UriIterator;
+   friend class pkgAcquire::Worker;
    Queue *Next;
    
    protected:
@@ -141,6 +167,8 @@ class pkgAcquire::Queue
    QItem *Items;
    pkgAcquire::Worker *Workers;
    pkgAcquire *Owner;
+   signed long PipeDepth;
+   unsigned long MaxPipeDepth;
    
    public:
    
@@ -154,7 +182,7 @@ class pkgAcquire::Queue
    bool ItemDone(QItem *Itm);
    
    bool Startup();
-   bool Shutdown();
+   bool Shutdown(bool Final);
    bool Cycle();
    void Bump();
    
@@ -162,6 +190,40 @@ class pkgAcquire::Queue
    ~Queue();
 };
 
+class pkgAcquire::UriIterator
+{
+   pkgAcquire::Queue *CurQ;
+   pkgAcquire::Queue::QItem *CurItem;
+   
+   public:
+   
+   // Advance to the next item
+   inline void operator ++() {operator ++();};
+   void operator ++(int)
+   {
+      CurItem = CurItem->Next;
+      while (CurItem == 0 && CurQ != 0)
+      {
+        CurItem = CurQ->Items;
+        CurQ = CurQ->Next;
+      }
+   };
+   
+   // Accessors
+   inline pkgAcquire::ItemDesc const *operator ->() const {return CurItem;};
+   inline bool operator !=(UriIterator const &rhs) const {return rhs.CurQ != CurQ || rhs.CurItem != CurItem;};
+   inline bool operator ==(UriIterator const &rhs) const {return rhs.CurQ == CurQ && rhs.CurItem == CurItem;};
+   
+   UriIterator(pkgAcquire::Queue *Q) : CurQ(Q), CurItem(0)
+   {
+      while (CurItem == 0 && CurQ != 0)
+      {
+        CurItem = CurQ->Items;
+        CurQ = CurQ->Next;
+      }
+   }   
+};
+
 // Configuration information from each method
 struct pkgAcquire::MethodConfig
 {
@@ -171,27 +233,51 @@ struct pkgAcquire::MethodConfig
 
    string Version;
    bool SingleInstance;
-   bool PreScan;
    bool Pipeline;
    bool SendConfig;
+   bool LocalOnly;
+   bool NeedsCleanup;
+   bool Removable;
    
    MethodConfig();
 };
 
 class pkgAcquireStatus
 {
+   protected:
+   
+   struct timeval Time;
+   struct timeval StartTime;
+   double LastBytes;
+   double CurrentCPS;
+   double CurrentBytes;
+   double TotalBytes;
+   double FetchedBytes;
+   unsigned long ElapsedTime;
+   unsigned long TotalItems;
+   unsigned long CurrentItems;
+   
    public:
 
    bool Update;
+   bool MorePulses;
+      
+   // Called by items when they have finished a real download
+   virtual void Fetched(unsigned long Size,unsigned long ResumePoint);
+   
+   // Called to change media
+   virtual bool MediaChange(string Media,string Drive) = 0;
    
    // Each of these is called by the workers when an event occures
-   virtual void IMSHit(pkgAcquire::ItemDesc &Itm) {};
-   virtual void Fetch(pkgAcquire::ItemDesc &Itm) {};
-   virtual void Done(pkgAcquire::ItemDesc &Itm) {};
-   virtual void Fail(pkgAcquire::ItemDesc &Itm) {};   
-   virtual void Pulse(pkgAcquire *Owner) {};
+   virtual void IMSHit(pkgAcquire::ItemDesc &/*Itm*/) {};
+   virtual void Fetch(pkgAcquire::ItemDesc &/*Itm*/) {};
+   virtual void Done(pkgAcquire::ItemDesc &/*Itm*/) {};
+   virtual void Fail(pkgAcquire::ItemDesc &/*Itm*/) {};
+   virtual bool Pulse(pkgAcquire *Owner); // returns false on user cancel
+   virtual void Start();
+   virtual void Stop();
    
-   pkgAcquireStatus() : Update(false) {};
+   pkgAcquireStatus();
    virtual ~pkgAcquireStatus() {};
 };