[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: KDE/kdenetwork/kget
From: Matthias Fuchs <mat69 () gmx ! net>
Date: 2011-09-05 10:32:55
Message-ID: 20110905103255.38D3FAC87C () svn ! kde ! org
[Download RAW message or body]
SVN commit 1251552 by mfuchs:
Adds support for retrieving the network status.
If there is no network connection all jobs are stopped,
avoiding that they are aborted. As soon as there is a
network connection again the jobs will resume, depending
on their policies in fact.
M +1 -1 CMakeLists.txt
M +35 -0 core/kget.cpp
M +10 -0 core/kget.h
M +37 -13 core/scheduler.cpp
M +20 -0 core/scheduler.h
--- trunk/KDE/kdenetwork/kget/CMakeLists.txt #1251551:1251552
@@ -146,7 +146,7 @@
kde4_add_library(kgetcore SHARED ${kgetcore_SRCS})
-target_link_libraries(kgetcore ${KDE4_KIO_LIBS})
+target_link_libraries(kgetcore ${KDE4_KIO_LIBS} ${KDE4_SOLID_LIBS})
if (KDE4WORKSPACE_FOUND)
target_link_libraries(kgetcore ${KDE4WORKSPACE_KWORKSPACE_LIBS})
--- trunk/KDE/kdenetwork/kget/core/kget.cpp #1251551:1251552
@@ -814,6 +814,7 @@
MainWindow * KGet::m_mainWindow = 0;
KUiServerJobs * KGet::m_jobManager = 0;
TransferHistoryStore * KGet::m_store = 0;
+bool KGet::m_hasConnection = true;
#ifdef HAVE_NEPOMUK
NepomukController *KGet::m_nepomukController = 0;
#endif
@@ -835,6 +836,10 @@
QObject::connect(m_transferTreeModel, \
SIGNAL(transfersChangedEvent(QMap<TransferHandler*,Transfer::ChangesFlags>)),
m_jobManager, \
SLOT(slotTransfersChanged(QMap<TransferHandler*,Transfer::ChangesFlags>)));
+ //check if there is a connection
+ const Solid::Networking::Status status = Solid::Networking::status();
+ KGet::setHasNetworkConnection((status == Solid::Networking::Connected) || \
(status == Solid::Networking::Unknown)); +
//Load all the available plugins
loadPlugins();
@@ -1214,6 +1219,28 @@
kDebug(5001) << "Number of factories = " << m_transferFactories.size();
}
+
+void KGet::setHasNetworkConnection(bool hasConnection)
+{
+ kDebug(5001) << "Existing internet connection:" << hasConnection << "old:" << \
m_hasConnection; + if (hasConnection == m_hasConnection) {
+ return;
+ }
+ m_hasConnection = hasConnection;
+
+ if (hasConnection) {
+ KGet::showNotification(m_mainWindow, "notification",
+ i18n("Internet connection established, resuming \
transfers."), + "dialog-info");
+
+ } else {
+ KGet::showNotification(m_mainWindow, "notification",
+ i18n("No internet connection, stopping transfers."),
+ "dialog-info");
+ }
+ m_scheduler->setHasNetworkConnection(hasConnection);
+}
+
KGetPlugin * KGet::createPluginFromService( const KService::Ptr &service )
{
//try to load the specified library
@@ -1278,6 +1305,9 @@
\
SLOT(groupsChangedEvent(QMap<TransferGroupHandler*,TransferGroup::ChangesFlags>)));
connect(KGet::model(), \
SIGNAL(transferMovedEvent(TransferHandler*,TransferGroupHandler*)),
\
SLOT(transferMovedEvent(TransferHandler*,TransferGroupHandler*))); + \
connect(Solid::Networking::notifier(), \
SIGNAL(statusChanged(Solid::Networking::Status)), + this, \
SLOT(slotNetworkStatusChanged(Solid::Networking::Status))); +
}
GenericObserver::~GenericObserver()
@@ -1465,6 +1495,11 @@
m_notifications.remove(notification);
}
+void GenericObserver::slotNetworkStatusChanged(const Solid::Networking::Status \
&status) +{
+ KGet::setHasNetworkConnection((status == Solid::Networking::Connected) || \
(status == Solid::Networking::Unknown)); +}
+
void GenericObserver::groupsChangedEvent(QMap<TransferGroupHandler*, \
TransferGroup::ChangesFlags> groups) {
bool recalculate = false;
--- trunk/KDE/kdenetwork/kget/core/kget.h #1251551:1251552
@@ -24,6 +24,7 @@
#include <KNotification>
#include <ktabwidget.h>
+#include <Solid/Networking>
#include <QtXml/QDomElement>
#include "kuiserverjobs.h"
@@ -415,6 +416,12 @@
//Plugin-related functions
static KGetPlugin * createPluginFromService( const KService::Ptr &service );
+ /**
+ * Stops all downloads if there is no connection and also displays
+ * a message.
+ * If there is a connection, then the downloads will be started again
+ */
+ static void setHasNetworkConnection(bool hasConnection);
/**
* Deletes the given file, if possible.
@@ -446,6 +453,8 @@
//pointer to the used TransferHistoryStore
static TransferHistoryStore *m_store;
+ static bool m_hasConnection;
+
#ifdef HAVE_NEPOMUK
static NepomukController *m_nepomukController;
#endif
@@ -485,6 +494,7 @@
void slotAbortAfterFinishAction();
void slotResolveTransferError();
void slotNotificationClosed();
+ void slotNetworkStatusChanged(const Solid::Networking::Status &status);
private:
bool allTransfersFinished();
--- trunk/KDE/kdenetwork/kget/core/scheduler.cpp #1251551:1251552
@@ -22,7 +22,8 @@
m_stallTime(5),
m_stallTimeout(Settings::reconnectDelay()),
m_abortTimeout(Settings::reconnectDelay()),
- m_isSuspended(false)
+ m_isSuspended(false),
+ m_hasConnection(true)
{
}
@@ -38,12 +39,35 @@
m_isSuspended = isSuspended;
//update all the queues
- if (changed && !m_isSuspended) {
+ if (changed && shouldUpdate()) {
+ updateAllQueues();
+ }
+}
+
+void Scheduler::setHasNetworkConnection(bool hasConnection)
+{
+ const bool changed = (hasConnection != m_hasConnection);
+ m_hasConnection = hasConnection;
+
+ if (changed) {
+ if (hasConnection) {
+ if (!m_failureCheckTimer) {
+ m_failureCheckTimer = startTimer(1000);
+ }
+ updateAllQueues();
+ } else {
+ if (m_failureCheckTimer) {
+ killTimer(m_failureCheckTimer);
+ m_failureCheckTimer = 0;
+ }
foreach (JobQueue *queue, m_queues) {
- updateQueue(queue);
+ for (JobQueue::iterator it = queue->begin(); it != queue->end(); \
++it) { + (*it)->stop();
}
}
}
+ }
+}
void Scheduler::addQueue(JobQueue * queue)
{
@@ -80,11 +104,8 @@
m_stallTimeout = Settings::reconnectDelay();
m_abortTimeout = Settings::reconnectDelay();
- foreach(JobQueue * queue, m_queues)
- {
- updateQueue(queue);
+ updateAllQueues();
}
-}
void Scheduler::jobQueueChangedEvent(JobQueue * queue, JobQueue::Status status)
{
@@ -229,13 +250,9 @@
{
static bool updatingQueue = false;
- if(updatingQueue)
+ if (!shouldUpdate() || updatingQueue)
return;
- if (m_isSuspended) {
- return;
- }
-
updatingQueue = true;
int runningJobs = 0; //Jobs that are running (and not in the stallTimeout)
@@ -307,6 +324,13 @@
updatingQueue = false;
}
+void Scheduler::updateAllQueues()
+{
+ foreach (JobQueue *queue, m_queues) {
+ updateQueue(queue);
+ }
+}
+
bool Scheduler::shouldBeRunning( Job * job )
{
Job::Policy policy = job->policy();
@@ -331,7 +355,7 @@
Q_UNUSED(event)
// kDebug(5001);
- if (m_isSuspended) {
+ if (!shouldUpdate()) {
return;
}
--- trunk/KDE/kdenetwork/kget/core/scheduler.h #1251551:1251552
@@ -90,6 +90,13 @@
void setIsSuspended(bool isSuspended);
/**
+ * The JobQueues will be informed of changes in the network connection
+ * If there is no network connection then the Scheduler won't act on
+ * the timerEvent or updateQueue
+ */
+ void setHasNetworkConnection(bool hasConnection);
+
+ /**
* Adds a queue to the scheduler.
*
* @param queue The queue that should be added
@@ -150,6 +157,14 @@
//Virtual QObject method
void timerEvent(QTimerEvent * event);
+ /**
+ * Calls updateQueue for all queues
+ * @see updateQueue
+ */
+ void updateAllQueues();
+
+ bool shouldUpdate() const;
+
private:
QList<JobQueue *> m_queues;
QMap<Job *, JobFailure> m_failedJobs;
@@ -160,6 +175,11 @@
int m_stallTimeout;
int m_abortTimeout;
bool m_isSuspended;
+ bool m_hasConnection;
};
+inline bool Scheduler::shouldUpdate() const
+{
+ return !m_isSuspended && m_hasConnection;
+}
#endif
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic