X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/0118833a3b3e65ad7296863aa7d49574eb615f83..36f610f18a9a12c02ba89c6bb84726f7ed3ba7ad:/apt-pkg/acquire.h diff --git a/apt-pkg/acquire.h b/apt-pkg/acquire.h index b728d2133..156fc7aae 100644 --- a/apt-pkg/acquire.h +++ b/apt-pkg/acquire.h @@ -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.20 1999/03/27 03:02:39 jgg Exp $ /* ###################################################################### Acquire - File Acquiration @@ -39,6 +39,10 @@ #pragma interface "apt-pkg/acquire.h" #endif +#include +#include + +class pkgAcquireStatus; class pkgAcquire { public: @@ -47,51 +51,220 @@ class pkgAcquire class Queue; class Worker; struct MethodConfig; + struct ItemDesc; friend Item; + friend Queue; protected: + // List of items to fetch vector 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,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); + + // 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();}; + + // 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 + unsigned long TotalNeeded(); + unsigned long FetchNeeded(); + unsigned long PartialPresent(); - 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 { friend pkgAcquire; + friend pkgAcquire::UriIterator; Queue *Next; protected: + + // 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; + }; + }; - string Access; - string URIMatch; + // Name of the queue + string Name; + + // Items queued into this queue + QItem *Items; + pkgAcquire::Worker *Workers; + pkgAcquire *Owner; + signed long PipeDepth; + unsigned long MaxPipeDepth; - vector Items; + 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(); +}; + +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 { + MethodConfig *Next; + string Access; string Version; bool SingleInstance; - bool PreScan; - + bool Pipeline; + bool SendConfig; + bool LocalOnly; + 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; + unsigned long TotalItems; + unsigned long CurrentItems; + + public: + + bool Update; + + // 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 Start(); + virtual void Stop(); + + pkgAcquireStatus(); + virtual ~pkgAcquireStatus() {}; }; #endif