From cc3418240a4fb8ed50e4d6188dcbec126dd2508c Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Thu, 11 May 2017 10:50:10 +0200 Subject: [PATCH] fix(src/components/core/CoreHandlers): do not emit core started until core is not created --- linphone-desktop/src/app/App.cpp | 2 +- .../src/components/core/CoreHandlers.cpp | 69 ++++++++++++++----- .../src/components/core/CoreHandlers.hpp | 22 ++++++ .../src/components/core/CoreManager.cpp | 2 +- 4 files changed, 77 insertions(+), 18 deletions(-) diff --git a/linphone-desktop/src/app/App.cpp b/linphone-desktop/src/app/App.cpp index 7f412828e..74a3aefb0 100644 --- a/linphone-desktop/src/app/App.cpp +++ b/linphone-desktop/src/app/App.cpp @@ -442,7 +442,7 @@ QString App::getLocale () const { void App::openAppAfterInit () { tryToUsePreferredLocale(); - qInfo() << QStringLiteral("Linphone core created."); + qInfo() << QStringLiteral("Open linphone app."); #ifndef __APPLE__ // Enable TrayIconSystem. diff --git a/linphone-desktop/src/components/core/CoreHandlers.cpp b/linphone-desktop/src/components/core/CoreHandlers.cpp index 26b7eb175..d177222d6 100644 --- a/linphone-desktop/src/components/core/CoreHandlers.cpp +++ b/linphone-desktop/src/components/core/CoreHandlers.cpp @@ -20,6 +20,7 @@ * Author: Ronan Abhamon */ +#include #include #include #include @@ -34,19 +35,57 @@ using namespace std; // ============================================================================= -// Emit a signal in the app context. -#define emitApp(EMIT) \ - do { \ - App *app = App::getInstance(); \ - if (QThread::currentThread() != app->thread()) { \ - QTimer::singleShot( \ - 0, app, [this]() { \ - (EMIT); \ - } \ - ); \ - } else \ - (EMIT); \ - } while (0) +// Schedule a function in app context. +void scheduleFunctionInApp (function func) { + App *app = App::getInstance(); + if (QThread::currentThread() != app->thread()) { + QTimer::singleShot(0, app, func); + } else + func(); +} + +// ----------------------------------------------------------------------------- + +CoreHandlers::CoreHandlers (CoreManager *coreManager) { + mCoreStartedLock = new QMutex(); + QObject::connect(coreManager, &CoreManager::coreCreated, this, &CoreHandlers::handleCoreCreated); +} + +CoreHandlers::~CoreHandlers () { + delete mCoreStartedLock; +} + +// ----------------------------------------------------------------------------- + +void CoreHandlers::handleCoreCreated () { + mCoreStartedLock->lock(); + + Q_ASSERT(mCoreCreated == false); + mCoreCreated = true; + notifyCoreStarted(); + + mCoreStartedLock->unlock(); +} + +void CoreHandlers::handleCoreStarted () { + mCoreStartedLock->lock(); + + Q_ASSERT(mCoreStarted == false); + mCoreStarted = true; + notifyCoreStarted(); + + mCoreStartedLock->unlock(); +} + +void CoreHandlers::notifyCoreStarted () { + if (mCoreCreated && mCoreStarted) + scheduleFunctionInApp( + [this]() { + qInfo() << QStringLiteral("Core started."); + emit coreStarted(); + } + ); +} // ----------------------------------------------------------------------------- @@ -75,10 +114,8 @@ void CoreHandlers::onGlobalStateChanged ( linphone::GlobalState gstate, const string & ) { - qInfo() << QStringLiteral("Global state: %1.").arg(gstate); - if (gstate == linphone::GlobalStateOn) - emitApp(coreStarted()); + handleCoreStarted(); } void CoreHandlers::onCallStatsUpdated ( diff --git a/linphone-desktop/src/components/core/CoreHandlers.hpp b/linphone-desktop/src/components/core/CoreHandlers.hpp index 3c7b59ead..e3132a128 100644 --- a/linphone-desktop/src/components/core/CoreHandlers.hpp +++ b/linphone-desktop/src/components/core/CoreHandlers.hpp @@ -28,11 +28,18 @@ // ============================================================================= +class CoreManager; +class QMutex; + class CoreHandlers : public QObject, public linphone::CoreListener { Q_OBJECT; +public: + CoreHandlers (CoreManager *coreManager); + ~CoreHandlers (); + signals: void authenticationRequested (const std::shared_ptr &authInfo); void callStateChanged (const std::shared_ptr &call, linphone::CallState state); @@ -42,6 +49,14 @@ signals: void registrationStateChanged (const std::shared_ptr &proxyConfig, linphone::RegistrationState state); private: + void handleCoreCreated (); + void handleCoreStarted (); + void notifyCoreStarted (); + + // --------------------------------------------------------------------------- + // Linphone callbacks. + // --------------------------------------------------------------------------- + void onAuthenticationRequested ( const std::shared_ptr &core, const std::shared_ptr &authInfo, @@ -91,6 +106,13 @@ private: linphone::RegistrationState state, const std::string &message ) override; + + // --------------------------------------------------------------------------- + + bool mCoreCreated = false; + bool mCoreStarted = false; + + QMutex *mCoreStartedLock = nullptr; }; #endif // CORE_HANDLERS_H_ diff --git a/linphone-desktop/src/components/core/CoreManager.cpp b/linphone-desktop/src/components/core/CoreManager.cpp index 2e38ab164..0a2cc4d7c 100644 --- a/linphone-desktop/src/components/core/CoreManager.cpp +++ b/linphone-desktop/src/components/core/CoreManager.cpp @@ -37,7 +37,7 @@ using namespace std; CoreManager *CoreManager::mInstance = nullptr; -CoreManager::CoreManager (QObject *parent, const QString &configPath) : QObject(parent), mHandlers(make_shared()) { +CoreManager::CoreManager (QObject *parent, const QString &configPath) : QObject(parent), mHandlers(make_shared(this)) { mPromiseBuild = QtConcurrent::run(this, &CoreManager::createLinphoneCore, configPath); QObject::connect(