summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2016-07-08 11:20:52 +0100
committerCaolán McNamara <caolanm@redhat.com>2016-07-08 12:14:54 +0100
commitb2c6c91391f01faa287de18e59e4762031ef6ddc (patch)
treedae1959b7f9d9c99f946bbfba3dc981ae76de0a4
parentd44c1c2ca6072aae9ceea4be6796eeb15b7bed56 (diff)
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
-rw-r--r--desktop/source/deployment/gui/dp_gui_dialog2.cxx15
-rw-r--r--desktop/source/deployment/gui/dp_gui_dialog2.hxx2
-rw-r--r--desktop/source/deployment/gui/dp_gui_theextmgr.cxx4
-rw-r--r--desktop/source/deployment/gui/dp_gui_theextmgr.hxx4
-rw-r--r--desktop/source/deployment/manager/dp_extensionmanager.cxx10
5 files changed, 26 insertions, 9 deletions
diff --git a/desktop/source/deployment/gui/dp_gui_dialog2.cxx b/desktop/source/deployment/gui/dp_gui_dialog2.cxx
index b14650ac1ab8..bd8d222a9d05 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 82616dd21f1b..4012cfcafaea 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 1f30767cf419..3b1f0cb6dbc3 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 756c0e9303fa..6d7436cfb5e6 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 c3e48071f3d1..b98cc0ee95ea 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