Related: rhbz#100713 move extensions restart to a better place
move it to when the dialog is closed rather than trying to
launch it as soon as any modifications take place because
those are happening during threaded code and the restart
is always cancelled by the dialog itself leading to repeated
restart dialogs
Now at least it doesn't crash, but if we open an oxt on the command
line, a restart will reopen it, which is probably not what we want.
Maybe this restart on an extension modification is a bad idea in
the first place.
Change-Id: Ib7d6179e6703ed3353fce44c3e54f5be1c1dfa68
diff --git a/desktop/source/deployment/gui/dp_gui_dialog2.cxx b/desktop/source/deployment/gui/dp_gui_dialog2.cxx
index b14650a..bd8d222 100644
--- a/desktop/source/deployment/gui/dp_gui_dialog2.cxx
+++ b/desktop/source/deployment/gui/dp_gui_dialog2.cxx
@@ -43,6 +43,7 @@
#include <osl/mutex.hxx>
#include <svtools/extensionlistbox.hxx>
#include <svtools/restartdialog.hxx>
#include <sfx2/sfxdlg.hxx>
@@ -670,6 +671,7 @@ ExtMgrDialog::ExtMgrDialog(vcl::Window *pParent, TheExtensionManager *pManager,
, m_bEnableWarning(false)
, m_bDisableWarning(false)
, m_bDeleteWarning(false)
, m_bClosed(false)
, m_nProgress(0)
, m_pManager(pManager)
{
@@ -1146,6 +1148,12 @@ bool ExtMgrDialog::Notify( NotifyEvent& rNEvt )
return true;
}
IMPL_LINK_NOARG_TYPED(ExtMgrDialog, Restart, void*, void)
{
SolarMutexGuard aGuard;
::svtools::executeRestartDialog(comphelper::getProcessComponentContext(),
nullptr, svtools::RESTART_REASON_EXTENSION_INSTALL);
}
bool ExtMgrDialog::Close()
{
@@ -1154,6 +1162,13 @@ bool ExtMgrDialog::Close()
{
bRet = ModelessDialog::Close();
m_pManager->terminateDialog();
//only suggest restart if modified and this is the first close attempt
if (!m_bClosed && m_pManager->isModified())
{
m_pManager->clearModified();
Application::PostUserEvent(LINK(nullptr, ExtMgrDialog, Restart));
}
m_bClosed = true;
}
return bRet;
}
diff --git a/desktop/source/deployment/gui/dp_gui_dialog2.hxx b/desktop/source/deployment/gui/dp_gui_dialog2.hxx
index 82616dd..4012cfc 100644
--- a/desktop/source/deployment/gui/dp_gui_dialog2.hxx
+++ b/desktop/source/deployment/gui/dp_gui_dialog2.hxx
@@ -123,6 +123,7 @@ class ExtMgrDialog : public ModelessDialog,
bool m_bEnableWarning;
bool m_bDisableWarning;
bool m_bDeleteWarning;
bool m_bClosed;
long m_nProgress;
Idle m_aIdle;
TheExtensionManager *m_pManager;
@@ -139,6 +140,7 @@ class ExtMgrDialog : public ModelessDialog,
DECL_DLLPRIVATE_LINK_TYPED( HandleHyperlink, FixedHyperlink&, void );
DECL_DLLPRIVATE_LINK_TYPED(TimeOutHdl, Idle *, void);
DECL_DLLPRIVATE_LINK_TYPED( startProgress, void *, void );
DECL_DLLPRIVATE_LINK_TYPED( Restart, void *, void );
public:
ExtMgrDialog( vcl::Window * pParent, TheExtensionManager *pManager, Dialog::InitFlag eFlag = Dialog::InitFlag::Default );
diff --git a/desktop/source/deployment/gui/dp_gui_theextmgr.cxx b/desktop/source/deployment/gui/dp_gui_theextmgr.cxx
index 1f30767..3b1f0cb 100644
--- a/desktop/source/deployment/gui/dp_gui_theextmgr.cxx
+++ b/desktop/source/deployment/gui/dp_gui_theextmgr.cxx
@@ -54,7 +54,8 @@ TheExtensionManager::TheExtensionManager( const uno::Reference< awt::XWindow > &
m_xParent( xParent ),
m_pExtMgrDialog( nullptr ),
m_pUpdReqDialog( nullptr ),
m_pExecuteCmdQueue( nullptr )
m_pExecuteCmdQueue( nullptr ),
m_bModified(false)
{
m_xExtensionManager = deployment::ExtensionManager::get( xContext );
m_xExtensionManager->addModifyListener( this );
@@ -468,6 +469,7 @@ void TheExtensionManager::notifyTermination( ::lang::EventObject const & rEvt )
void TheExtensionManager::modified( ::lang::EventObject const & /*rEvt*/ )
throw ( uno::RuntimeException, std::exception )
{
m_bModified = true;
getDialogHelper()->prepareChecking();
createPackageList();
getDialogHelper()->checkEntries();
diff --git a/desktop/source/deployment/gui/dp_gui_theextmgr.hxx b/desktop/source/deployment/gui/dp_gui_theextmgr.hxx
index 756c0e9..6d7436cf 100644
--- a/desktop/source/deployment/gui/dp_gui_theextmgr.hxx
+++ b/desktop/source/deployment/gui/dp_gui_theextmgr.hxx
@@ -58,6 +58,7 @@ private:
ExtensionCmdQueue *m_pExecuteCmdQueue;
OUString m_sGetExtensionsURL;
bool m_bModified;
public:
static ::rtl::Reference<TheExtensionManager> s_ExtMgr;
@@ -69,6 +70,9 @@ public:
void createDialog( const bool bCreateUpdDlg );
sal_Int16 execute();
bool isModified() const { return m_bModified; }
void clearModified() { m_bModified = false; }
Dialog* getDialog()
{
if (m_pExtMgrDialog)
diff --git a/desktop/source/deployment/manager/dp_extensionmanager.cxx b/desktop/source/deployment/manager/dp_extensionmanager.cxx
index c3e4807..b98cc0e 100644
--- a/desktop/source/deployment/manager/dp_extensionmanager.cxx
+++ b/desktop/source/deployment/manager/dp_extensionmanager.cxx
@@ -44,7 +44,6 @@
#include <comphelper/sequence.hxx>
#include <xmlscript/xml_helper.hxx>
#include <osl/diagnose.h>
#include <svtools/restartdialog.hxx>
#include <vcl/svapp.hxx>
#include "dp_interact.h"
#include "dp_resource.h"
@@ -160,11 +159,10 @@ ExtensionRemoveGuard::~ExtensionRemoveGuard()
namespace dp_manager {
//ToDo: bundled extension
ExtensionManager::ExtensionManager( Reference< uno::XComponentContext > const& xContext) :
::cppu::WeakComponentImplHelper< css::deployment::XExtensionManager >(getMutex()),
m_xContext( xContext )
::cppu::WeakComponentImplHelper< css::deployment::XExtensionManager >(getMutex())
, m_xContext(xContext)
{
m_xPackageManagerFactory = css::deployment::thePackageManagerFactory::get(m_xContext);
OSL_ASSERT(m_xPackageManagerFactory.is());
@@ -174,7 +172,6 @@ ExtensionManager::ExtensionManager( Reference< uno::XComponentContext > const& x
m_repositoryNames.push_back("bundled");
}
ExtensionManager::~ExtensionManager()
{
}
@@ -1496,9 +1493,6 @@ void ExtensionManager::fireModified()
[this] (uno::Reference<util::XModifyListener> const& xListener)
{ return xListener->modified(lang::EventObject(static_cast<OWeakObject *>(this))); });
}
SolarMutexGuard aGuard;
::svtools::executeRestartDialog(comphelper::getProcessComponentContext(), nullptr, svtools::RESTART_REASON_EXTENSION_INSTALL);
}
} // namespace dp_manager