X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/b2e465d6d32d2dc884f58b94acb7e35f671a87fe..486d4273eed5191263a332b760b5976924200cae:/apt-pkg/acquire.cc diff --git a/apt-pkg/acquire.cc b/apt-pkg/acquire.cc index 1be8551f4..fff1b2b6a 100644 --- a/apt-pkg/acquire.cc +++ b/apt-pkg/acquire.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: acquire.cc,v 1.47 2001/02/20 07:03:17 jgg Exp $ +// $Id: acquire.cc,v 1.50 2004/03/17 05:17:11 mdz Exp $ /* ###################################################################### Acquire - File Acquiration @@ -24,6 +24,9 @@ #include #include + +#include +#include #include #include @@ -31,6 +34,8 @@ #include /*}}}*/ +using namespace std; + // Acquire::pkgAcquire - Constructor /*{{{*/ // --------------------------------------------------------------------- /* We grab some runtime state from the configuration space */ @@ -83,7 +88,11 @@ pkgAcquire::~pkgAcquire() void pkgAcquire::Shutdown() { while (Items.size() != 0) + { + if (Items[0]->Status == Item::StatFetching) + Items[0]->Status = Item::StatError; delete Items[0]; + } while (Queues != 0) { @@ -109,10 +118,15 @@ void pkgAcquire::Remove(Item *Itm) { Dequeue(Itm); - for (vector::iterator I = Items.begin(); I < Items.end(); I++) + for (ItemIterator I = Items.begin(); I != Items.end();) { if (*I == Itm) + { Items.erase(I); + I = Items.begin(); + } + else + I++; } } /*}}}*/ @@ -252,7 +266,11 @@ pkgAcquire::MethodConfig *pkgAcquire::GetConfig(string Access) Worker Work(Conf); if (Work.Start() == false) return 0; - + + /* if a method uses DownloadLimit, we switch to SingleInstance mode */ + if(_config->FindI("Acquire::"+Access+"::DlLimit",0) > 0) + Conf->SingleInstance = true; + return Conf; } /*}}}*/ @@ -299,7 +317,7 @@ void pkgAcquire::RunFds(fd_set *RSet,fd_set *WSet) /* This runs the queues. It manages a select loop for all of the Worker tasks. The workers interact with the queues and items to manage the actual fetch. */ -pkgAcquire::RunResult pkgAcquire::Run() +pkgAcquire::RunResult pkgAcquire::Run(int PulseIntervall) { Running = true; @@ -314,7 +332,7 @@ pkgAcquire::RunResult pkgAcquire::Run() // Run till all things have been acquired struct timeval tv; tv.tv_sec = 0; - tv.tv_usec = 500000; + tv.tv_usec = PulseIntervall; while (ToFetch > 0) { fd_set RFds; @@ -344,7 +362,7 @@ pkgAcquire::RunResult pkgAcquire::Run() // Timeout, notify the log class if (Res == 0 || (Log != 0 && Log->Update == true)) { - tv.tv_usec = 500000; + tv.tv_usec = PulseIntervall; for (Worker *I = Workers; I != 0; I = I->NextAcquire) I->Pulse(); if (Log != 0 && Log->Pulse(this) == false) @@ -364,7 +382,7 @@ pkgAcquire::RunResult pkgAcquire::Run() I->Shutdown(false); // Shut down the items - for (Item **I = Items.begin(); I != Items.end(); I++) + for (ItemIterator I = Items.begin(); I != Items.end(); I++) (*I)->Finished(); if (_error->PendingError()) @@ -419,7 +437,7 @@ bool pkgAcquire::Clean(string Dir) continue; // Look in the get list - vector::iterator I = Items.begin(); + ItemCIterator I = Items.begin(); for (; I != Items.end(); I++) if (flNotDir((*I)->DestFile) == Dir->d_name) break; @@ -440,7 +458,7 @@ bool pkgAcquire::Clean(string Dir) double pkgAcquire::TotalNeeded() { double Total = 0; - for (pkgAcquire::Item **I = ItemsBegin(); I != ItemsEnd(); I++) + for (ItemCIterator I = ItemsBegin(); I != ItemsEnd(); I++) Total += (*I)->FileSize; return Total; } @@ -451,7 +469,7 @@ double pkgAcquire::TotalNeeded() double pkgAcquire::FetchNeeded() { double Total = 0; - for (pkgAcquire::Item **I = ItemsBegin(); I != ItemsEnd(); I++) + for (ItemCIterator I = ItemsBegin(); I != ItemsEnd(); I++) if ((*I)->Local == false) Total += (*I)->FileSize; return Total; @@ -463,12 +481,12 @@ double pkgAcquire::FetchNeeded() double pkgAcquire::PartialPresent() { double Total = 0; - for (pkgAcquire::Item **I = ItemsBegin(); I != ItemsEnd(); I++) + for (ItemCIterator I = ItemsBegin(); I != ItemsEnd(); I++) if ((*I)->Local == false) Total += (*I)->PartialSize; return Total; } - /*}}}*/ + // Acquire::UriBegin - Start iterator for the uri list /*{{{*/ // --------------------------------------------------------------------- /* */ @@ -728,7 +746,7 @@ bool pkgAcquireStatus::Pulse(pkgAcquire *Owner) // Compute the total number of bytes to fetch unsigned int Unknown = 0; unsigned int Count = 0; - for (pkgAcquire::Item **I = Owner->ItemsBegin(); I != Owner->ItemsEnd(); + for (pkgAcquire::ItemCIterator I = Owner->ItemsBegin(); I != Owner->ItemsEnd(); I++, Count++) { TotalItems++; @@ -790,6 +808,32 @@ bool pkgAcquireStatus::Pulse(pkgAcquire *Owner) Time = NewTime; } + int fd = _config->FindI("APT::Status-Fd",-1); + if(fd > 0) + { + ostringstream status; + + char msg[200]; + long i = CurrentItems < TotalItems ? CurrentItems + 1 : CurrentItems; + unsigned long ETA = + (unsigned long)((TotalBytes - CurrentBytes) / CurrentCPS); + + // only show the ETA if it makes sense + if (ETA > 0 && ETA < 172800 /* two days */ ) + snprintf(msg,sizeof(msg), _("Retrieving file %li of %li (%s remaining)"), i, TotalItems, TimeToStr(ETA).c_str()); + else + snprintf(msg,sizeof(msg), _("Retrieving file %li of %li"), i, TotalItems); + + + + // build the status str + status << "dlstatus:" << i + << ":" << (CurrentBytes/float(TotalBytes)*100.0) + << ":" << msg + << endl; + write(fd, status.str().c_str(), status.str().size()); + } + return true; } /*}}}*/