]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/acquire.h
Almost done now
[apt.git] / apt-pkg / acquire.h
index b728d21339daa493ea88b2d962eae82bd7dfc78f..5d6e5502cb30babf0283688ee94d83993a50d1c4 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: acquire.h,v 1.1 1998/10/15 06:59:59 jgg Exp $
+// $Id: acquire.h,v 1.10 1998/11/11 06:54:17 jgg Exp $
 /* ######################################################################
 
    Acquire - File Acquiration
 #pragma interface "apt-pkg/acquire.h"
 #endif 
 
+#include <sys/time.h>
+#include <unistd.h>
+
+class pkgAcquireStatus;
 class pkgAcquire
 {   
    public:
@@ -47,24 +51,67 @@ class pkgAcquire
    class Queue;
    class Worker;
    struct MethodConfig;
+   struct ItemDesc;
    friend Item;
+   friend Queue;
    
    protected:
    
+   // List of items to fetch
    vector<Item *> Items;
+   
+   // List of active queues and fetched method configuration parameters
    Queue *Queues;
+   Worker *Workers;
    MethodConfig *Configs;
+   pkgAcquireStatus *Log;
+   unsigned long ToFetch;
+
+   // Configurable parameters for the schedular
+   enum {QueueHost,QueueAccess} QueueMode;
+   bool Debug;
+   bool Running;
    
    void Add(Item *Item);
    void Remove(Item *Item);
-   void Enqueue(Item *Item,string URI);
+   void Add(Worker *Work);
+   void Remove(Worker *Work);
+   
+   void Enqueue(ItemDesc &Item);
+   void Dequeue(Item *Item);
+   string QueueName(string URI);
+
+   // FDSET managers for derived classes
+   void SetFds(int &Fd,fd_set *RSet,fd_set *WSet);
+   void RunFds(fd_set *RSet,fd_set *WSet);   
+
+   // A queue calls this when it dequeues an item
+   void Bump();
    
    public:
+
+   MethodConfig *GetConfig(string Access);
+   bool Run();
+
+   // Simple iteration mechanism
+   inline Worker *WorkersBegin() {return Workers;};
+   Worker *WorkerStep(Worker *I);
+   inline Item **ItemsBegin() {return Items.begin();};
+   inline Item **ItemsEnd() {return Items.end();};
    
-   pkgAcquire();
+   pkgAcquire(pkgAcquireStatus *Log = 0);
    ~pkgAcquire();
 };
 
+// Description of an Item+URI
+struct pkgAcquire::ItemDesc
+{
+   string URI;
+   string Description;
+   string ShortDesc;
+   Item *Owner;
+};
+
 // List of possible items queued for download.
 class pkgAcquire::Queue
 {
@@ -72,26 +119,97 @@ class pkgAcquire::Queue
    Queue *Next;
    
    protected:
-   
-   string Access;
-   string URIMatch;
-   
-   vector<Item *> Items;
+
+   // Queued item
+   struct QItem : pkgAcquire::ItemDesc
+   {
+      QItem *Next;      
+      pkgAcquire::Worker *Worker;
+      
+      void operator =(pkgAcquire::ItemDesc const &I)
+      {
+        URI = I.URI;
+        Description = I.Description;
+        ShortDesc = I.ShortDesc;
+        Owner = I.Owner;
+      };
+   };
+   
+   // Name of the queue
+   string Name;
+
+   // Items queued into this queue
+   QItem *Items;
+   pkgAcquire::Worker *Workers;
+   pkgAcquire *Owner;
    
    public:
+   
+   // Put an item into this queue
+   void Enqueue(ItemDesc &Item);
+   bool Dequeue(Item *Owner);
+
+   // Find a Queued item
+   QItem *FindItem(string URI,pkgAcquire::Worker *Owner);
+   bool ItemStart(QItem *Itm,unsigned long Size);
+   bool ItemDone(QItem *Itm);
+   
+   bool Startup();
+   bool Shutdown();
+   bool Cycle();
+   void Bump();
+   
+   Queue(string Name,pkgAcquire *Owner);
+   ~Queue();
 };
 
 // Configuration information from each method
 struct pkgAcquire::MethodConfig
 {
+   MethodConfig *Next;
+   
    string Access;
 
    string Version;
    bool SingleInstance;
    bool PreScan;
+   bool Pipeline;
+   bool SendConfig;
    
    MethodConfig();
-   ~MethodConfig();
+};
+
+class pkgAcquireStatus
+{
+   protected:
+   
+   struct timeval Time;
+   struct timeval StartTime;
+   unsigned long LastBytes;
+   double CurrentCPS;
+   unsigned long CurrentBytes;
+   unsigned long TotalBytes;
+   unsigned long FetchedBytes;
+   unsigned long ElapsedTime;
+   
+   public:
+
+   bool Update;
+   
+   // Called by items when they have finished a real download
+   virtual void Fetched(unsigned long Size,unsigned long ResumePoint);
+   
+   // 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 Start();
+   virtual void Stop();
+
+   pkgAcquireStatus();
+   virtual ~pkgAcquireStatus() {};
 };
 
 #endif