From 723731c7e586266b294abc58bac83376e8d8bdf6 Mon Sep 17 00:00:00 2001 From: Julien Wadel Date: Tue, 26 Nov 2024 17:55:17 +0100 Subject: [PATCH] Fix restart with core/models reallocations. --- Linphone/core/App.cpp | 46 ++++++++++--------- Linphone/model/core/CoreModel.cpp | 1 + Linphone/model/setting/SettingsModel.cpp | 1 + Linphone/view/Page/Window/AbstractWindow.qml | 9 ++-- Linphone/view/Page/Window/Main/MainWindow.qml | 2 +- 5 files changed, 34 insertions(+), 25 deletions(-) diff --git a/Linphone/core/App.cpp b/Linphone/core/App.cpp index 660dd2c8..47e73f7b 100644 --- a/Linphone/core/App.cpp +++ b/Linphone/core/App.cpp @@ -444,7 +444,7 @@ void App::initCore() { if (mParser->isSet("qt-logs-only")) QtLogger::enableQtOnly(true); QMetaObject::invokeMethod( mLinphoneThread->getThreadId(), - [this]() mutable { + [this, settings = mSettings]() mutable { lInfo() << log().arg("Updating downloaded codec files"); ToolModel::updateCodecs(); // removing codec updates suffic (.in) before the core is created. lInfo() << log().arg("Starting Core"); @@ -454,7 +454,7 @@ void App::initCore() { lDebug() << log().arg("Creating SettingsModel"); SettingsModel::create(); lDebug() << log().arg("Creating SettingsCore"); - auto settings = SettingsCore::create(); + if (!settings) settings = SettingsCore::create(); lDebug() << log().arg("Creating Ui"); QMetaObject::invokeMethod(App::getInstance()->thread(), [this, settings, coreStarted] { // QML @@ -501,24 +501,22 @@ void App::initCore() { // Enable notifications. mNotifier = new Notifier(mEngine); - mSettings = settings; - mEngine->setObjectOwnership(mSettings.get(), QQmlEngine::CppOwnership); + mEngine->setObjectOwnership(settings.get(), QQmlEngine::CppOwnership); mEngine->setObjectOwnership(this, QQmlEngine::CppOwnership); - setAccountList(AccountList::create()); - setCallList(CallList::create()); - setAutoStart(mSettings->getAutoStart()); - setQuitOnLastWindowClosed(mSettings->getExitOnClose()); - connect(mSettings.get(), &SettingsCore::exitOnCloseChanged, this, &App::onExitOnCloseChanged, - Qt::UniqueConnection); - setLocale(settings->getConfigLocale()); + if (!mAccountList) setAccountList(AccountList::create()); + else mAccountList->lUpdate(); + if (!mCallList) setCallList(CallList::create()); + else mCallList->lUpdate(); - if (mSettings) { + if (!mSettings) { + mSettings = settings; + setLocale(settings->getConfigLocale()); + setAutoStart(settings->getAutoStart()); + setQuitOnLastWindowClosed(settings->getExitOnClose()); mEngine->setObjectOwnership(mSettings.get(), QQmlEngine::CppOwnership); - setAutoStart(mSettings->getAutoStart()); - setQuitOnLastWindowClosed(mSettings->getExitOnClose()); + connect(mSettings.get(), &SettingsCore::exitOnCloseChanged, this, &App::onExitOnCloseChanged, Qt::UniqueConnection); - setLocale(mSettings->getConfigLocale()); QObject::connect(mSettings.get(), &SettingsCore::autoStartChanged, [this]() { mustBeInMainThread(log().arg(Q_FUNC_INFO)); setAutoStart(mSettings->getAutoStart()); @@ -527,6 +525,12 @@ void App::initCore() { mustBeInMainThread(log().arg(Q_FUNC_INFO)); if (mSettings) setLocale(mSettings->getConfigLocale()); }); + connect(mSettings.get(), &SettingsCore::exitOnCloseChanged, this, &App::onExitOnCloseChanged, + Qt::UniqueConnection); + } else { + setLocale(settings->getConfigLocale()); + setAutoStart(settings->getAutoStart()); + setQuitOnLastWindowClosed(settings->getExitOnClose()); } const QUrl url("qrc:/qt/qml/Linphone/view/Page/Window/Main/MainWindow.qml"); QObject::connect( @@ -683,14 +687,14 @@ void App::restart() { mEngine->clearSingletons(); delete mEngine; mEngine = nullptr; - if (mSettings) mSettings.reset(); + // if (mSettings) mSettings.reset(); initCore(); // Retrieve self from current Core/Model connection and reset Qt connections. - auto oldConnection = mCoreModelConnection; - oldConnection->mCore.lock(); - auto me = oldConnection->mCore.mQData; - setSelf(me); - oldConnection->mCore.unlock(); + // auto oldConnection = mCoreModelConnection; + // oldConnection->mCore.lock(); + // auto me = oldConnection->mCore.mQData; + // setSelf(me); + // oldConnection->mCore.unlock(); exit((int)StatusCode::gRestartCode); }); }); diff --git a/Linphone/model/core/CoreModel.cpp b/Linphone/model/core/CoreModel.cpp index 636bc394..b750b29b 100644 --- a/Linphone/model/core/CoreModel.cpp +++ b/Linphone/model/core/CoreModel.cpp @@ -56,6 +56,7 @@ CoreModel::~CoreModel() { } std::shared_ptr CoreModel::create(const QString &configPath, QThread *parent) { + if (gCoreModel) return gCoreModel; auto model = std::make_shared(configPath, parent); model->setSelf(model); gCoreModel = model; diff --git a/Linphone/model/setting/SettingsModel.cpp b/Linphone/model/setting/SettingsModel.cpp index 8e335573..38e5970a 100644 --- a/Linphone/model/setting/SettingsModel.cpp +++ b/Linphone/model/setting/SettingsModel.cpp @@ -70,6 +70,7 @@ SettingsModel::~SettingsModel() { shared_ptr SettingsModel::create() { // auto model = Utils::makeQObject_ptr(); + if (gSettingsModel) return gSettingsModel; auto model = make_shared(); gSettingsModel = model; return model; diff --git a/Linphone/view/Page/Window/AbstractWindow.qml b/Linphone/view/Page/Window/AbstractWindow.qml index 125659dd..4df5a6bd 100644 --- a/Linphone/view/Page/Window/AbstractWindow.qml +++ b/Linphone/view/Page/Window/AbstractWindow.qml @@ -238,9 +238,12 @@ ApplicationWindow { onPopupCountChanged: { nextY = mainWindow.height for(var i = 0; i < popupCount; ++i) { - popupList[i].y = nextY - popupList[i].height - popupList[i].index = i - nextY = nextY - popupList[i].height - 15 + var popupItem = popupList[i] + if( popupItem ){ + popupItem.y = nextY - popupItem.height + popupItem.index = i + nextY = nextY - popupItem.height - 15 + } } } } diff --git a/Linphone/view/Page/Window/Main/MainWindow.qml b/Linphone/view/Page/Window/Main/MainWindow.qml index 7ad97f51..611593c2 100644 --- a/Linphone/view/Page/Window/Main/MainWindow.qml +++ b/Linphone/view/Page/Window/Main/MainWindow.qml @@ -135,7 +135,7 @@ AbstractWindow { Component { id: loginPage LoginPage { - showBackButton: accountProxy.haveAccount + showBackButton: accountProxy?.haveAccount || false onGoBack: openMainPage() onUseSIPButtonClicked: mainWindowStackView.push(sipLoginPage) onGoToRegister: mainWindowStackView.replace(registerPage)