OSDN Git Service

Fixed typo in variable name.
[mutilities/MUtilities.git] / src / UpdateChecker.cpp
index 33dd516..671155d 100644 (file)
@@ -35,6 +35,7 @@
 #include <QElapsedTimer>
 #include <QSet>
 #include <QHash>
+#include <QQueue>
 
 #include "Mirrors.h"
 
@@ -91,13 +92,12 @@ while(0)
 // Helper Functions
 ////////////////////////////////////////////////////////////
 
-static QStringList buildRandomList(const char *const values[])
+static QQueue<QString> buildRandomList(const char *const *values)
 {
-       QStringList list;
-       for (int index = 0; values[index]; index++)
+       QQueue<QString> list;
+       while(*values)
        {
-               const int pos = MUtils::next_rand_u32() % (index + 1);
-               list.insert(pos, QString::fromLatin1(values[index]));
+               list.insert(MUtils::next_rand_u32(list.size() + 1), QString::fromLatin1(*(values++)));
        }
        return list;
 }
@@ -222,20 +222,23 @@ void MUtils::UpdateChecker::checkForUpdates(void)
        // ----- Test Known Hosts Connectivity ----- //
 
        int connectionScore = 0;
-       QStringList mirrorList = buildRandomList(known_hosts);
+       QQueue<QString> mirrorList = buildRandomList(known_hosts);
 
-       for(int connectionTimout = 1000; connectionTimout <= MAX_CONN_TIMEOUT; connectionTimout *= 2)
+       for(int connectionTimeout = 1000; connectionTimeout <= MAX_CONN_TIMEOUT; connectionTimeout *= 2)
        {
                QElapsedTimer elapsedTimer;
                elapsedTimer.start();
-               const int globalTimout = 2 * MIN_CONNSCORE * connectionTimout;
-               while (!elapsedTimer.hasExpired(globalTimout))
+               const qint64 globalTimeout = 2 * MIN_CONNSCORE * connectionTimeout;
+               forever
                {
-                       const QString hostName = mirrorList.takeFirst();
-                       if (tryContactHost(hostName, connectionTimout))
+                       if (mirrorList.isEmpty())
                        {
-                               setProgress(1 + (connectionScore += 1));
-                               elapsedTimer.restart();
+                               goto endLoop; /*depleted!*/
+                       }
+                       const QString hostName = mirrorList.dequeue();
+                       if (tryContactHost(hostName, connectionTimeout))
+                       {
+                               setProgress(1 + (++connectionScore));
                                if (connectionScore >= MIN_CONNSCORE)
                                {
                                        goto endLoop; /*success*/
@@ -243,10 +246,13 @@ void MUtils::UpdateChecker::checkForUpdates(void)
                        }
                        else
                        {
-                               mirrorList.append(hostName); /*re-schedule*/
+                               mirrorList.enqueue(hostName);
+                               if(elapsedTimer.hasExpired(globalTimeout))
+                               {
+                                       break; /*timer expired*/
+                               }
                        }
                        CHECK_CANCELLED();
-                       msleep(1);
                }
        }