diff options
author | Sachin Kundu <ext-sachin.kundu@nokia.com> | 2010-12-10 12:49:36 +0200 |
---|---|---|
committer | Sachin Kundu <ext-sachin.kundu@nokia.com> | 2010-12-10 12:49:36 +0200 |
commit | f891042021f2593d74c33de175f2c76077355649 (patch) | |
tree | 9978bde5ba22cc952a9ea278cb9d4033b26045f9 | |
parent | 67aab107e8d6419c339a6cab4f2926eee0c51327 (diff) |
Fixes: NB#208330 - meegotouchhome process causing high wakeups when device is in idle state
RevBy: Vesa Halttunen, Pauli Lehtinen
-rw-r--r-- | debian/changelog | 1 | ||||
-rw-r--r-- | src/extensions/applicationextension/mextensionhandle.cpp | 63 | ||||
-rw-r--r-- | src/extensions/applicationextension/mextensionhandle.h | 8 | ||||
-rw-r--r-- | src/extensions/applicationextension/mextensionhandle_p.h | 9 | ||||
-rw-r--r-- | src/extensions/applicationextension/mextensionrunner.cpp | 32 | ||||
-rw-r--r-- | src/extensions/applicationextension/mextensionrunner.h | 16 | ||||
-rw-r--r-- | tests/stubs/mextensionhandle_stub.h | 8 | ||||
-rw-r--r-- | tests/ut_mapplethandle/ut_mapplethandle.pro | 5 | ||||
-rw-r--r-- | tests/ut_mextensionhandle/ut_mextensionhandle.cpp | 65 | ||||
-rw-r--r-- | tests/ut_mextensionhandle/ut_mextensionhandle.h | 3 | ||||
-rw-r--r-- | tests/ut_mextensionhandle/ut_mextensionhandle.pro | 5 | ||||
-rw-r--r-- | tests/ut_mextensionrunner/ut_mextensionrunner.cpp | 54 | ||||
-rw-r--r-- | tests/ut_mextensionrunner/ut_mextensionrunner.h | 3 | ||||
-rw-r--r-- | tests/ut_mextensionrunner/ut_mextensionrunner.pro | 5 |
14 files changed, 253 insertions, 24 deletions
diff --git a/debian/changelog b/debian/changelog index 8f4e7384..441efec5 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,6 +1,7 @@ libmeegotouch (0.20.65~1) unstable; urgency=low * unreleased + * Fixes: NB#208330 - meegotouchhome process causing high wakeups when device is in idle state -- Adrian Yanes <ext-adrian.yanes@nokia.com> Wed, 08 Dec 2010 15:56:30 +0200 diff --git a/src/extensions/applicationextension/mextensionhandle.cpp b/src/extensions/applicationextension/mextensionhandle.cpp index e0c9d7a1..2760b7b4 100644 --- a/src/extensions/applicationextension/mextensionhandle.cpp +++ b/src/extensions/applicationextension/mextensionhandle.cpp @@ -57,6 +57,10 @@ #include <MAction> #include <mobjectmenu.h> +#ifdef HAVE_CONTEXTSUBSCRIBER +#include "contextproperty.h" +#endif + #include "mwidgetcreator.h" M_REGISTER_WIDGET(MExtensionHandle) @@ -66,12 +70,18 @@ const QString MExtensionHandlePrivate::PACKAGE_MANAGER_DBUS_PATH = "/com/nokia/p //! D-Bus interface of the Package Manager const QString MExtensionHandlePrivate::PACKAGE_MANAGER_DBUS_INTERFACE = "com.nokia.package_manager"; +//! Interval for checking that the extension is alive +static const uint ALIVE_TIMER_INTERVAL = 5000; + MExtensionHandlePrivate::MExtensionHandlePrivate() : restartCount(0), aliveResponseTimeout(3000), runnerConnectionTimeout(20000), applicationVisible(true), remoteActions(), +#ifdef HAVE_CONTEXTSUBSCRIBER + screenBlankProperty(new ContextProperty("Session.State", this)), +#endif q_ptr(NULL) { communicationTimer.setSingleShot(true); @@ -116,29 +126,20 @@ MExtensionHandle::MExtensionHandle(QGraphicsItem *parent) : MWidgetController(new MExtensionHandleModel, parent), d_ptr(new MExtensionHandlePrivate()) { - Q_D(MExtensionHandle); - - if (d) - d->q_ptr = this; - - // TODO: FIXME - this needs to have the scene specified, - // temporarily uses currently active MWindow's scene. - connect(MApplication::activeWindow(), - SIGNAL(orientationChanged(M::Orientation)), - this, SLOT(orientationEvent(M::Orientation))); - - connect(this, SIGNAL(visibleChanged()), this, SLOT(visibilityChanged())); - - // Configure the timers - connect(&d->aliveTimer, SIGNAL(timeout()), this, SLOT(sendAliveMessageRequest())); - connect(&d->communicationTimer, SIGNAL(timeout()), this, SLOT(communicationTimerTimeout())); + initialize(); } MExtensionHandle::MExtensionHandle(MExtensionHandlePrivate *dd, MExtensionHandleModel *model, QGraphicsItem *parent) : MWidgetController(model, parent), d_ptr(dd) { + initialize(); +} + +void MExtensionHandle::initialize() +{ Q_D(MExtensionHandle); + if (d) d->q_ptr = this; @@ -153,6 +154,10 @@ MExtensionHandle::MExtensionHandle(MExtensionHandlePrivate *dd, MExtensionHandle // Configure the timers connect(&d->aliveTimer, SIGNAL(timeout()), this, SLOT(sendAliveMessageRequest())); connect(&d->communicationTimer, SIGNAL(timeout()), this, SLOT(communicationTimerTimeout())); + +#ifdef HAVE_CONTEXTSUBSCRIBER + connect(d->screenBlankProperty, SIGNAL(valueChanged()), this, SLOT(updateDisplayState())); +#endif } MExtensionHandle::~MExtensionHandle() @@ -160,6 +165,25 @@ MExtensionHandle::~MExtensionHandle() kill(); } +void MExtensionHandle::updateDisplayState() +{ + Q_D(MExtensionHandle); + +#ifdef HAVE_CONTEXTSUBSCRIBER + if(state() == MExtensionHandleModel::RUNNING) { + bool blanked = d->screenBlankProperty->value().toString() == "blanked"; + + if(blanked && d->aliveTimer.isActive()) { + d->aliveTimer.stop(); + d->communicationTimer.stop(); + } else if(!d->aliveTimer.isActive()) { + d->aliveTimer.start(ALIVE_TIMER_INTERVAL); + sendAliveMessageRequest(); + } + } +#endif +} + void MExtensionHandle::initPlaceHolder(const QString &packageName, const QString &installationError) { model()->setPackageName(packageName); @@ -279,10 +303,13 @@ void MExtensionHandle::connectionEstablished() // Set the state to running model()->setCurrentState(MExtensionHandleModel::RUNNING); - // Send alive request every 5 seconds. Send the first alive request immediately. - d->aliveTimer.start(5000); + // Send alive requests at certain interval. Send the first alive request immediately. + d->aliveTimer.start(ALIVE_TIMER_INTERVAL); sendAliveMessageRequest(); + // Set the current display state + updateDisplayState(); + // Send the visibility changed message to the runner d->visibilityChanged(); diff --git a/src/extensions/applicationextension/mextensionhandle.h b/src/extensions/applicationextension/mextensionhandle.h index fae9e793..e986bb62 100644 --- a/src/extensions/applicationextension/mextensionhandle.h +++ b/src/extensions/applicationextension/mextensionhandle.h @@ -242,6 +242,11 @@ protected slots: */ void remoteActionTriggered(); + /*! + * \brief Stops or starts the alive timer depending on the display blanking state + */ + void updateDisplayState(); + signals: /*! * \brief Signals that a pixmap has been taken into use by the runner @@ -256,6 +261,9 @@ signals: private: Q_DECLARE_PRIVATE(MExtensionHandle) + //! Initializes the object + void initialize(); + //! Sets the state to BROKEN and restarts if this is the first time void setBrokenState(); diff --git a/src/extensions/applicationextension/mextensionhandle_p.h b/src/extensions/applicationextension/mextensionhandle_p.h index c1e3cba4..2e9a2288 100644 --- a/src/extensions/applicationextension/mextensionhandle_p.h +++ b/src/extensions/applicationextension/mextensionhandle_p.h @@ -30,6 +30,10 @@ class MAction; +#ifdef HAVE_CONTEXTSUBSCRIBER +class ContextProperty; +#endif + /*! * A private data class for MExtensionHandle. */ @@ -91,6 +95,11 @@ public: //! A list of remote actions QList<MAction *> remoteActions; +#ifdef HAVE_CONTEXTSUBSCRIBER + //! Context property for getting the screen blanking status + ContextProperty *screenBlankProperty; +#endif + //! D-Bus service of the Package Manager static const QString PACKAGE_MANAGER_DBUS_SERVICE; diff --git a/src/extensions/applicationextension/mextensionrunner.cpp b/src/extensions/applicationextension/mextensionrunner.cpp index 805874df..49736210 100644 --- a/src/extensions/applicationextension/mextensionrunner.cpp +++ b/src/extensions/applicationextension/mextensionrunner.cpp @@ -64,6 +64,9 @@ #ifdef QT_OPENGL_LIB #include <QGLWidget> #endif +#ifdef HAVE_CONTEXTSUBSCRIBER +#include "contextproperty.h" +#endif #include <typeinfo> @@ -101,6 +104,10 @@ MExtensionRunner::MExtensionRunner() : widget(NULL), scene(NULL), view(NULL), +#ifdef HAVE_CONTEXTSUBSCRIBER + screenBlankProperty(new ContextProperty("Session.State", this)), +#endif + displayBlanked(false), #ifdef QT_OPENGL_LIB context(NULL), #endif @@ -113,6 +120,9 @@ MExtensionRunner::MExtensionRunner() : connect(communicator, SIGNAL(messageReceived(MAppletMessage)), this, SLOT(messageReceived(MAppletMessage))); connect(aliveTimer, SIGNAL(timeout()), this, SLOT(hostProcessNotAlive())); connect(communicator, SIGNAL(connectionLost()), this, SLOT(hostProcessNotAlive())); +#ifdef HAVE_CONTEXTSUBSCRIBER + connect(screenBlankProperty, SIGNAL(valueChanged()), this, SLOT(updateDisplayState())); +#endif } MExtensionRunner::~MExtensionRunner() @@ -170,6 +180,24 @@ bool MExtensionRunner::init(const QString &serverName) return true; } +void MExtensionRunner::updateDisplayState() +{ +#ifdef HAVE_CONTEXTSUBSCRIBER + bool blanked = screenBlankProperty->value().toString() == "blanked"; + + if(displayBlanked != blanked) { + displayBlanked = blanked; + + if(blanked) { + aliveTimer->stop(); + } else { + aliveTimer->start(ALIVE_TIMER_TIMEOUT); + } + } +#endif +} + + void MExtensionRunner::teardown() { delete scene; @@ -193,7 +221,9 @@ void MExtensionRunner::messageReceived(const MAppletMessage &message) } aliveTimer->stop(); - aliveTimer->start(ALIVE_TIMER_TIMEOUT); + if(!displayBlanked) { + aliveTimer->start(ALIVE_TIMER_TIMEOUT); + } switch (message.type()) { case MAppletMessage::MousePressMessage: diff --git a/src/extensions/applicationextension/mextensionrunner.h b/src/extensions/applicationextension/mextensionrunner.h index bf7dac21..b13d2210 100644 --- a/src/extensions/applicationextension/mextensionrunner.h +++ b/src/extensions/applicationextension/mextensionrunner.h @@ -42,6 +42,9 @@ class QAction; #ifdef QT_OPENGL_LIB class QGLContext; #endif +#ifdef HAVE_CONTEXTSUBSCRIBER +class ContextProperty; +#endif //! \internal /** @@ -108,6 +111,11 @@ protected slots: */ virtual void hostProcessNotAlive(); + /*! + * \brief Stops or starts the alive timer depending on the display blanking state + */ + void updateDisplayState(); + protected: //! AppletClient for communicating between the runner and the host processes. MAppletClient *communicator; @@ -131,6 +139,14 @@ protected: //! List to hold object menu actions received from widget. QList<QAction *> widgetObjectMenuActions; +#ifdef HAVE_CONTEXTSUBSCRIBER + //! Context property for getting the screen blanking status + ContextProperty *screenBlankProperty; +#endif + + //! True if the display is currently blanked + bool displayBlanked; + #ifdef QT_OPENGL_LIB //! OpenGL context QGLContext *context; diff --git a/tests/stubs/mextensionhandle_stub.h b/tests/stubs/mextensionhandle_stub.h index 0dd01da1..cd9cf9f6 100644 --- a/tests/stubs/mextensionhandle_stub.h +++ b/tests/stubs/mextensionhandle_stub.h @@ -63,6 +63,7 @@ class MExtensionHandleStub : public StubBase { virtual void remoteActionTriggered(); virtual void setBrokenState(); virtual void displayContextMenu(QList<QString> actions); + virtual void updateDisplayState(); }; // 2. IMPLEMENT STUB @@ -95,6 +96,10 @@ void MExtensionHandleStub::reinit() { stubMethodEntered("reinit"); } +void MExtensionHandleStub::updateDisplayState() { + stubMethodEntered("updateDisplayState"); +} + void MExtensionHandleStub::setAliveResponseTimeout(uint timeout) { QList<ParameterBase*> params; params.append( new Parameter<uint >(timeout)); @@ -394,5 +399,8 @@ void MExtensionHandle::displayContextMenu(QList<QString> actions) { gMExtensionHandleStub->displayContextMenu(actions); } +void MExtensionHandle::updateDisplayState() { + gMExtensionHandleStub->updateDisplayState(); +} #endif diff --git a/tests/ut_mapplethandle/ut_mapplethandle.pro b/tests/ut_mapplethandle/ut_mapplethandle.pro index 23870d5c..9de703f9 100644 --- a/tests/ut_mapplethandle/ut_mapplethandle.pro +++ b/tests/ut_mapplethandle/ut_mapplethandle.pro @@ -6,6 +6,11 @@ INCLUDEPATH += \ $$MSRCDIR/corelib/style QT += xml +contains(DEFINES, HAVE_CONTEXTSUBSCRIBER) { + CONFIG += link_pkgconfig + PKGCONFIG += contextsubscriber-1.0 +} + MODEL_HEADERS += \ $$MSRCDIR/corelib/widgets/mwidgetmodel.h \ $$MSRCDIR/extensions/applicationextension/mextensionhandlemodel.h \ diff --git a/tests/ut_mextensionhandle/ut_mextensionhandle.cpp b/tests/ut_mextensionhandle/ut_mextensionhandle.cpp index 1f99efd7..ce67cc71 100644 --- a/tests/ut_mextensionhandle/ut_mextensionhandle.cpp +++ b/tests/ut_mextensionhandle/ut_mextensionhandle.cpp @@ -55,6 +55,10 @@ #include <mappletid_stub.h> #include <mscenemanager.h> +#ifdef HAVE_CONTEXTSUBSCRIBER +#include "contextproperty.h" +#endif + MApplication *app; bool visibility; @@ -74,6 +78,15 @@ void MWidget::contextMenuEvent(QGraphicsSceneContextMenuEvent *) Ut_MExtensionHandle::contextMenuOpened = true; } +// ContextProperty stubs +#ifdef HAVE_CONTEXTSUBSCRIBER +QString gContextPropertyValue = ""; +QVariant ContextProperty::value() const +{ + return gContextPropertyValue; +} +#endif + // MSceneManager stubs (used by MExtensionHandle) void MSceneManager::appearSceneWindow(MSceneWindow *, MSceneWindow::DeletionPolicy) { @@ -163,11 +176,26 @@ bool MAppletCommunicator::sendMessage(const MAppletMessage &message) } // QTimer stubs -bool timerCalled = false; +QList<QTimer*> gQTimerStartCalls; +void QTimer::start() +{ + gQTimerStartCalls.append(this); + id = 1; +} + +void QTimer::start(int) +{ + start(); +} + +bool gQTimerStopCalled = false; +QList<QTimer*> gQTimerStopCalls; void QTimer::stop() { - timerCalled = true; + gQTimerStopCalled = true; + gQTimerStopCalls.append(this); + id = -1; } int elapsedQTime = 0; @@ -234,7 +262,13 @@ void Ut_MExtensionHandle::init() listenForConnection = true; elapsedQTime = 0; - timerCalled = false; + gQTimerStartCalls.clear(); + gQTimerStopCalled = false; + gQTimerStopCalls.clear(); + +#ifdef HAVE_CONTEXTSUBSCRIBER + gContextPropertyValue = ""; +#endif gStartQProcess = true; @@ -405,7 +439,7 @@ void Ut_MExtensionHandle::testAppletCommunication() handle->init("/bin/true", "metaDataFileName"); MAppletAliveMessageResponse message; handle->messageReceivedFromRunner(message); - QCOMPARE(timerCalled, true); + QCOMPARE(gQTimerStopCalled, true); } void Ut_MExtensionHandle::testRelayingMousePress() @@ -644,4 +678,27 @@ void Ut_MExtensionHandle::testSetSizeHints() QCOMPARE(handle->model()->sizeHints(), sizeHints); } +#ifdef HAVE_CONTEXTSUBSCRIBER +void Ut_MExtensionHandle::testWhenDisplayBlankedThenAliveCheckingStops() +{ + handle->init("/bin/true", "metaDataFileName"); + emit connectionFromRunnerEstablished(); + QVERIFY(qFind(gQTimerStartCalls, &handle->privateClass()->aliveTimer) != gQTimerStartCalls.end()); + QVERIFY(qFind(gQTimerStartCalls, &handle->privateClass()->communicationTimer) != gQTimerStartCalls.end()); + + gContextPropertyValue = "blanked"; + gQTimerStopCalls.clear(); + handle->updateDisplayState(); + QVERIFY(qFind(gQTimerStopCalls, &handle->privateClass()->aliveTimer) != gQTimerStopCalls.end()); + QVERIFY(qFind(gQTimerStopCalls, &handle->privateClass()->communicationTimer) != gQTimerStopCalls.end()); + + gContextPropertyValue = ""; + gQTimerStartCalls.clear(); + handle->updateDisplayState(); + QVERIFY(qFind(gQTimerStartCalls, &handle->privateClass()->aliveTimer) != gQTimerStartCalls.end()); + QVERIFY(qFind(gQTimerStartCalls, &handle->privateClass()->communicationTimer) != gQTimerStartCalls.end()); +} +#endif + + QTEST_APPLESS_MAIN(Ut_MExtensionHandle) diff --git a/tests/ut_mextensionhandle/ut_mextensionhandle.h b/tests/ut_mextensionhandle/ut_mextensionhandle.h index b6867afe..47938a2c 100644 --- a/tests/ut_mextensionhandle/ut_mextensionhandle.h +++ b/tests/ut_mextensionhandle/ut_mextensionhandle.h @@ -91,6 +91,9 @@ private slots: void testInstallationOperationCompleteWithError(); void testAppletInstallationProgess(); void testSetSizeHints(); +#ifdef HAVE_CONTEXTSUBSCRIBER + void testWhenDisplayBlankedThenAliveCheckingStops(); +#endif signals: void messageReceived(const MAppletMessage &message); diff --git a/tests/ut_mextensionhandle/ut_mextensionhandle.pro b/tests/ut_mextensionhandle/ut_mextensionhandle.pro index 39f42455..0a54a9e9 100644 --- a/tests/ut_mextensionhandle/ut_mextensionhandle.pro +++ b/tests/ut_mextensionhandle/ut_mextensionhandle.pro @@ -6,6 +6,11 @@ INCLUDEPATH += \ $$MSRCDIR/corelib/style QT += xml +contains(DEFINES, HAVE_CONTEXTSUBSCRIBER) { + CONFIG += link_pkgconfig + PKGCONFIG += contextsubscriber-1.0 +} + MODEL_HEADERS += \ $$MSRCDIR/corelib/widgets/mwidgetmodel.h \ $$MSRCDIR/extensions/applicationextension/mextensionhandlemodel.h diff --git a/tests/ut_mextensionrunner/ut_mextensionrunner.cpp b/tests/ut_mextensionrunner/ut_mextensionrunner.cpp index 9223d793..709fce2b 100644 --- a/tests/ut_mextensionrunner/ut_mextensionrunner.cpp +++ b/tests/ut_mextensionrunner/ut_mextensionrunner.cpp @@ -41,10 +41,23 @@ #include <QtTest/QtTest> #include <QGraphicsLinearLayout> +#ifdef HAVE_CONTEXTSUBSCRIBER +#include "contextproperty.h" +#endif + #ifdef Q_WS_X11 #include <X11/Xlib.h> #endif +// ContextProperty stubs +#ifdef HAVE_CONTEXTSUBSCRIBER +QString gContextPropertyValue = ""; +QVariant ContextProperty::value() const +{ + return gContextPropertyValue; +} +#endif + // MWindow stubs (to prevent crashing) MWindow::MWindow(QWidget *parent) : QGraphicsView(parent), @@ -56,13 +69,28 @@ MWindow::~MWindow() } // QTimer stubs (used by MExtensionRunner) -void QTimer::start(int) +QList<QTimer*> gQTimerStartCalls; +void QTimer::start() { + gQTimerStartCalls.append(this); + id = 1; if (Ut_MExtensionRunner::timerImmediateTimeout) { emit timeout(); } } +void QTimer::start(int) +{ + start(); +} + +QList<QTimer*> gQTimerStopCalls; +void QTimer::stop() +{ + gQTimerStopCalls.append(this); + id = -1; +} + // QCoreApplication stubs (used by MExtensionRunner) void QCoreApplication::quit() { @@ -147,6 +175,8 @@ void Ut_MExtensionRunner::init() connect(this, SIGNAL(sendMessage(MAppletMessage)), m_instance, SLOT(messageReceived(MAppletMessage))); timerImmediateTimeout = false; + gQTimerStartCalls.clear(); + gQTimerStopCalls.clear(); quitCalled = false; gMAppletSharedMutexStub->stubReset(); gMAppletSharedMutexStub->stubSetReturnValue("init", true); @@ -159,6 +189,10 @@ void Ut_MExtensionRunner::init() MAppletCommunicator_sentUpdateGeometryMessageSizeHints = QVector<QSizeF>(Qt::NSizeHints); sceneRenderCalled = false; gMAppletSettingsStub->stubReset(); + +#ifdef HAVE_CONTEXTSUBSCRIBER + gContextPropertyValue = ""; +#endif } void Ut_MExtensionRunner::cleanup() @@ -486,4 +520,22 @@ void Ut_MExtensionRunner::testObjectMenuRequestMessageGetsPropagated() QCOMPARE(MAppletCommunicator_sentObjectMenuActionList.at(0), QString("correct_action")); } +#ifdef HAVE_CONTEXTSUBSCRIBER +void Ut_MExtensionRunner::testWhenDisplayBlankedThenAliveCheckingStops() +{ + gContextPropertyValue = "blanked"; + gQTimerStopCalls.clear(); + m_instance->updateDisplayState(); + QVERIFY(qFind(gQTimerStopCalls, m_instance->aliveTimer) != gQTimerStopCalls.end()); + + gQTimerStartCalls.clear(); + m_instance->messageReceived(MAppletAliveMessageRequest()); + QCOMPARE(gQTimerStartCalls.count(), 0); + + gContextPropertyValue = ""; + m_instance->updateDisplayState(); + QVERIFY(qFind(gQTimerStartCalls, m_instance->aliveTimer) != gQTimerStartCalls.end()); +} +#endif + QTEST_MAIN(Ut_MExtensionRunner) diff --git a/tests/ut_mextensionrunner/ut_mextensionrunner.h b/tests/ut_mextensionrunner/ut_mextensionrunner.h index df568732..3ded0271 100644 --- a/tests/ut_mextensionrunner/ut_mextensionrunner.h +++ b/tests/ut_mextensionrunner/ut_mextensionrunner.h @@ -76,6 +76,9 @@ private slots: void testSceneChanged(); void testObjectMenuRequestMessage(); void testObjectMenuRequestMessageGetsPropagated(); +#ifdef HAVE_CONTEXTSUBSCRIBER + void testWhenDisplayBlankedThenAliveCheckingStops(); +#endif signals: void sendMessage(const MAppletMessage &message); diff --git a/tests/ut_mextensionrunner/ut_mextensionrunner.pro b/tests/ut_mextensionrunner/ut_mextensionrunner.pro index f832419b..7f5facff 100644 --- a/tests/ut_mextensionrunner/ut_mextensionrunner.pro +++ b/tests/ut_mextensionrunner/ut_mextensionrunner.pro @@ -3,6 +3,11 @@ include(../common_mextensions.pri) QT += network xml +contains(DEFINES, HAVE_CONTEXTSUBSCRIBER) { + CONFIG += link_pkgconfig + PKGCONFIG += contextsubscriber-1.0 +} + SOURCES += ut_mextensionrunner.cpp \ $$MSRCDIR/extensions/applicationextension/mextensionrunner.cpp \ ../stubs/stubbase.cpp |