* apt-pkg/deb/dpkgpm.cc:
authorMichael Vogt <michael.vogt@ubuntu.com>
Wed, 2 Jun 2010 14:40:40 +0000 (16:40 +0200)
committerMichael Vogt <michael.vogt@ubuntu.com>
Wed, 2 Jun 2010 14:40:40 +0000 (16:40 +0200)
  - add missing include
* methods/mirror.{cc,h}:
  - add SelectNextMirror() and InitMirrors() functions
  - read all mirrors into the AllMirrors vector

apt-pkg/deb/dpkgpm.cc
methods/mirror.cc
methods/mirror.h

index 18c7317..7e5171e 100644 (file)
@@ -21,6 +21,7 @@
 #include <stdlib.h>
 #include <fcntl.h>
 #include <sys/select.h>
+#include <sys/stat.h>
 #include <sys/types.h>
 #include <sys/wait.h>
 #include <signal.h>
index b3a956b..0a0d07e 100644 (file)
@@ -162,7 +162,21 @@ bool MirrorMethod::DownloadMirrorFile(string mirror_uri_str)
    return res;
 }
 
-bool MirrorMethod::SelectMirror()
+bool MirrorMethod::SelectNextMirror()
+{
+   if (AllMirrors.size() < 1)
+      return false;
+
+   Mirror = AllMirrors[0];
+   AllMirrors.erase(AllMirrors.begin());
+   if(Debug)
+      cerr << "using mirror: " << Mirror << endl;
+
+   UsedMirror = Mirror;
+   return true;
+}
+
+bool MirrorMethod::InitMirrors()
 {
    // if we do not have a MirrorFile, fallback
    if(!FileExists(MirrorFile))
@@ -179,11 +193,13 @@ bool MirrorMethod::SelectMirror()
    //      get into sync issues (got indexfiles from mirror A,
    //      but packages from mirror B - one might be out of date etc)
    ifstream in(MirrorFile.c_str());
-   getline(in, Mirror);
-   if(Debug)
-      cerr << "Using mirror: " << Mirror << endl;
-
-   UsedMirror = Mirror;
+   string s;
+   while (!in.eof()) 
+   {
+      getline(in, s);
+      AllMirrors.push_back(s);
+   }
+   SelectNextMirror();
    return true;
 }
 
@@ -275,7 +291,7 @@ bool MirrorMethod::Fetch(FetchItem *Itm)
    }
 
    if(Mirror.empty()) {
-      if(!SelectMirror()) {
+      if(!InitMirrors()) {
         // no valid mirror selected, something went wrong downloading
         // from the master mirror site most likely and there is
         // no old mirror file availalbe
index ed81780..1b506dc 100644 (file)
@@ -26,6 +26,7 @@ class MirrorMethod : public HttpMethod
    // we simply transform between BaseUri and Mirror
    string BaseUri;    // the original mirror://... url
    string Mirror;     // the selected mirror uri (http://...)
+   vector<string> AllMirrors; // all available mirrors
    string MirrorFile; // the file that contains the list of mirrors
    bool DownloadedMirrorFile; // already downloaded this session
 
@@ -34,7 +35,8 @@ class MirrorMethod : public HttpMethod
  protected:
    bool DownloadMirrorFile(string uri);
    string GetMirrorFileName(string uri);
-   bool SelectMirror();
+   bool InitMirrors();
+   bool SelectNextMirror();
    bool Clean(string dir);
    
    // we need to overwrite those to transform the url back