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