aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarja Hassinen <marja.hassinen@nokia.com>2010-12-20 12:28:16 +0200
committerMarja Hassinen <marja.hassinen@nokia.com>2010-12-20 12:28:16 +0200
commit4659f97087ce3b3680ebd45e7bf8ed7e5f52c8b2 (patch)
tree1895b50d7fc4a7ec18c53d0e174646d760122e7f
parentc8b443d961edf3cbf16b1ca76db8542455ea84ad (diff)
lcs: fixing the waitForSubscriptionAndBlock.
Oops, the previous commit contained the first part of the "add waitUntilReadyAndBlock" change. This is the second part.
-rw-r--r--libcontextsubscriber/src/contextkitplugin.cpp26
-rw-r--r--libcontextsubscriber/src/contextkitplugin.h4
-rw-r--r--libcontextsubscriber/src/iproviderplugin.h3
-rw-r--r--libcontextsubscriber/unit-tests/provider/contextkitplugin.h1
-rw-r--r--libcontextsubscriber/unit-tests/provider/testprovider.cpp4
5 files changed, 36 insertions, 2 deletions
diff --git a/libcontextsubscriber/src/contextkitplugin.cpp b/libcontextsubscriber/src/contextkitplugin.cpp
index eeb8b7a1..da43ddb0 100644
--- a/libcontextsubscriber/src/contextkitplugin.cpp
+++ b/libcontextsubscriber/src/contextkitplugin.cpp
@@ -88,8 +88,10 @@ ContextKitPlugin::ContextKitPlugin(const QDBusConnection bus, const QString& bus
managerInterface(0),
connection(new QDBusConnection(bus)),
busName(busName),
+ newProtocol(true),
defaultNewProtocol(true),
- newProtocol(true)
+ providerAppearedQueued(false),
+ providerAppearedSkip(false)
{
reset();
// Notice if the provider on the dbus comes and goes
@@ -103,6 +105,7 @@ ContextKitPlugin::ContextKitPlugin(const QDBusConnection bus, const QString& bus
// the provider at startup, whether it's present or not.
providerListener->startListening(false);
QMetaObject::invokeMethod(this, "onProviderAppeared", Qt::QueuedConnection);
+ providerAppearedQueued = true;
}
void ContextKitPlugin::setDefaultNewProtocol(bool s) {
@@ -133,6 +136,16 @@ void ContextKitPlugin::onProviderAppeared()
// 4. providerListener notices that the provider was started
// In this case, the plugin is in "ready" state already.
+ providerAppearedQueued = false;
+
+ if (providerAppearedSkip) {
+ // Now we had queued this function to be called, but before it was
+ // called, waitUntilReadyAndBlock called it. Skip the scheduled call
+ // (but not the later calls).
+ providerAppearedSkip = false;
+ return;
+ }
+
contextDebug() << "Provider appeared:" << busName;
reset();
@@ -387,6 +400,17 @@ void ContextKitPlugin::onNewValueChanged(QList<QVariant> value,
}
}
+void ContextKitPlugin::waitUntilReadyAndBlock()
+{
+ onProviderAppeared();
+ if (providerAppearedQueued) {
+ // Calling onProviderAppeared was already scheduled but we already
+ // called it now. Arrange so that the scheduled call is skipped when
+ // the event is processed.
+ providerAppearedSkip = true;
+ }
+}
+
void ContextKitPlugin::waitForSubscriptionAndBlock(const QString& key)
{
// Force the subscriptions (that were scheduled) to happen now
diff --git a/libcontextsubscriber/src/contextkitplugin.h b/libcontextsubscriber/src/contextkitplugin.h
index abeebc7c..9d00a106 100644
--- a/libcontextsubscriber/src/contextkitplugin.h
+++ b/libcontextsubscriber/src/contextkitplugin.h
@@ -71,6 +71,7 @@ public:
void subscribe(QSet<QString> keys);
void unsubscribe(QSet<QString> keys);
void setDefaultNewProtocol(bool s);
+ void waitUntilReadyAndBlock();
void waitForSubscriptionAndBlock(const QString& key);
Q_SIGNALS:
@@ -118,6 +119,9 @@ private:
QHash<QString, PendingSubscribeWatcher*> pendingWatchers;
QSet<QString> pendingKeys;
+
+ bool providerAppearedQueued;
+ bool providerAppearedSkip;
};
QVariant demarshallValue(const QVariant &v);
diff --git a/libcontextsubscriber/src/iproviderplugin.h b/libcontextsubscriber/src/iproviderplugin.h
index f5a44abd..79ba9da5 100644
--- a/libcontextsubscriber/src/iproviderplugin.h
+++ b/libcontextsubscriber/src/iproviderplugin.h
@@ -40,7 +40,8 @@ class IProviderPlugin : public QObject
public:
virtual void subscribe(QSet<QString> keys) = 0;
virtual void unsubscribe(QSet<QString> keys) = 0;
- virtual void waitForSubscriptionAndBlock(const QString& key) = 0;
+ virtual void waitUntilReadyAndBlock() { }
+ virtual void waitForSubscriptionAndBlock(const QString& key) { }
Q_SIGNALS:
void ready();
diff --git a/libcontextsubscriber/unit-tests/provider/contextkitplugin.h b/libcontextsubscriber/unit-tests/provider/contextkitplugin.h
index ef5f9c24..0c346836 100644
--- a/libcontextsubscriber/unit-tests/provider/contextkitplugin.h
+++ b/libcontextsubscriber/unit-tests/provider/contextkitplugin.h
@@ -44,6 +44,7 @@ class ContextKitPlugin : public IProviderPlugin
public:
void subscribe(QSet<QString> keys);
void unsubscribe(QSet<QString> keys);
+ void waitUntilReadyAndBlock();
void waitForSubscriptionAndBlock(const QString& key);
Q_SIGNALS:
diff --git a/libcontextsubscriber/unit-tests/provider/testprovider.cpp b/libcontextsubscriber/unit-tests/provider/testprovider.cpp
index 84934417..8f22d909 100644
--- a/libcontextsubscriber/unit-tests/provider/testprovider.cpp
+++ b/libcontextsubscriber/unit-tests/provider/testprovider.cpp
@@ -137,6 +137,10 @@ void ContextKitPlugin::waitForSubscriptionAndBlock(const QString& key)
{
}
+void ContextKitPlugin::waitUntilReadyAndBlock()
+{
+}
+
//
// Definition of testcases
//