[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [kactivitymanagerd] src/service: Ensuring proper activity loading when the config file is not comple
From:       Ivan Čukić <ivan.cukic () kde ! org>
Date:       2016-10-09 19:29:46
Message-ID: E1btJn8-00089q-EL () code ! kde ! org
[Download RAW message or body]

Git commit 127cb1df00e8b42aed758c373608231aa1290ba9 by Ivan Čukić.
Committed on 09/10/2016 at 19:24.
Pushed by ivan into branch 'master'.

Ensuring proper activity loading when the config file is not complete

M  +39   -7    src/service/Activities.cpp

http://commits.kde.org/kactivitymanagerd/127cb1df00e8b42aed758c373608231aa1290ba9

diff --git a/src/service/Activities.cpp b/src/service/Activities.cpp
index 55dab56..0d54eb0 100644
--- a/src/service/Activities.cpp
+++ b/src/service/Activities.cpp
@@ -86,17 +86,35 @@ Activities::Private::Private(Activities *parent)
     //     << QStandardPaths::standardLocations(config.locationType())
     //     ;
 
-    // Reading activities from the config file
+    // Reading activities from the config file.
+    // Saving only the running activities means that if we have any
+    // errors in the config, we might end up with all activities
+    // stopped
+
+    const auto defaultState
+        = !mainConfig().hasKey("runningActivities") ? Activities::Running :
+          !mainConfig().hasKey("stoppedActivities") ? Activities::Stopped :
+                                                      Activities::Running;
 
     const auto runningActivities
-        = mainConfig()
-              .readEntry("runningActivities", QStringList())
-              .toSet();
+        = mainConfig().readEntry("runningActivities", QStringList()).toSet();
+    const auto stoppedActivities
+        = mainConfig().readEntry("stoppedActivities", QStringList()).toSet();
+
+    // Do we have a running activity?
+    bool atLeastOneRunning = false;
 
     for (const auto &activity: activityNameConfig().keyList()) {
-        activities[activity] = runningActivities.contains(activity)
-                                      ? Activities::Running
-                                      : Activities::Stopped;
+        auto state =
+            runningActivities.contains(activity) ? Activities::Running :
+            stoppedActivities.contains(activity) ? Activities::Stopped :
+                                                   defaultState;
+
+        activities[activity] = state;
+
+        if (state == Activities::Running) {
+            atLeastOneRunning = true;
+        }
     }
 
     // Is this our first start?
@@ -110,6 +128,17 @@ Activities::Private::Private(Activities *parent)
                 "AddActivity",
                 Qt::QueuedConnection,
                 Q_ARG(QString, name));
+
+    } else if (!atLeastOneRunning) {
+        // If we have no running activities, but we have activities,
+        // we are in a problem. This should not happen unless the
+        // configuration file is in a big problem and told us there
+        // are no running activities, and enlists all of them as stopped.
+        // In that case, we will pretend all of them are running
+        qWarning() << "The config file enlisted all activities as stopped";
+        for (const auto &keys: activities.keys()) {
+            activities[keys] = Activities::Running;
+        }
     }
 }
 
@@ -333,6 +362,9 @@ void Activities::Private::setActivityState(const QString &activity,
         mainConfig().writeEntry("runningActivities",
                                 activities.keys(Activities::Running)
                                 + activities.keys(Activities::Starting));
+        mainConfig().writeEntry("stoppedActivities",
+                                activities.keys(Activities::Stopped)
+                                + activities.keys(Activities::Stopping));
         scheduleConfigSync();
     }
 }
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic