diff options
Diffstat (limited to 'desktop/source/deployment/gui/dp_gui_extensioncmdqueue.cxx')
-rw-r--r-- | desktop/source/deployment/gui/dp_gui_extensioncmdqueue.cxx | 117 |
1 files changed, 55 insertions, 62 deletions
diff --git a/desktop/source/deployment/gui/dp_gui_extensioncmdqueue.cxx b/desktop/source/deployment/gui/dp_gui_extensioncmdqueue.cxx index 95cb874f1ca9..c91ec4a0b132 100644 --- a/desktop/source/deployment/gui/dp_gui_extensioncmdqueue.cxx +++ b/desktop/source/deployment/gui/dp_gui_extensioncmdqueue.cxx @@ -46,9 +46,7 @@ #include <com/sun/star/uno/Sequence.hxx> #include <com/sun/star/uno/TypeClass.hpp> #include <o3tl/any.hxx> -#include <osl/conditn.hxx> #include <osl/diagnose.h> -#include <osl/mutex.hxx> #include <rtl/ref.hxx> #include <rtl/ustring.hxx> #include <sal/types.h> @@ -57,6 +55,7 @@ #include <cppuhelper/exc_hlp.hxx> #include <cppuhelper/implbase.hxx> #include <comphelper/anytostring.hxx> +#include <utility> #include <vcl/svapp.hxx> #include <vcl/weld.hxx> @@ -73,8 +72,10 @@ #include <dp_identifier.hxx> #include <dp_version.hxx> +#include <condition_variable> #include <queue> #include <memory> +#include <mutex> #ifdef _WIN32 #include <o3tl/safeCoInitUninit.hxx> @@ -127,12 +128,12 @@ public: will be handled and in the second case a VersionException will be handled. */ - ProgressCmdEnv( const uno::Reference< uno::XComponentContext >& rContext, + ProgressCmdEnv( uno::Reference< uno::XComponentContext > xContext, DialogHelper* pDialogHelper, - const OUString& rTitle ) - : m_xContext( rContext ) + OUString aTitle ) + : m_xContext(std::move( xContext )) , m_pDialogHelper( pDialogHelper ) - , m_sTitle( rTitle ) + , m_sTitle(std::move( aTitle )) , m_bWarnUser( false ) , m_nCurrentProgress(0) {} @@ -171,23 +172,23 @@ struct ExtensionCmd std::vector< uno::Reference< deployment::XPackage > > m_vExtensionList; ExtensionCmd( const E_CMD_TYPE eCommand, - const OUString &rExtensionURL, - const OUString &rRepository, + OUString aExtensionURL, + OUString aRepository, const bool bWarnUser ) : m_eCmdType( eCommand ), m_bWarnUser( bWarnUser ), - m_sExtensionURL( rExtensionURL ), - m_sRepository( rRepository ) {}; + m_sExtensionURL(std::move( aExtensionURL )), + m_sRepository(std::move( aRepository )) {}; ExtensionCmd( const E_CMD_TYPE eCommand, - const uno::Reference< deployment::XPackage > &rPackage ) + uno::Reference< deployment::XPackage > xPackage ) : m_eCmdType( eCommand ), m_bWarnUser( false ), - m_xPackage( rPackage ) {}; + m_xPackage(std::move( xPackage )) {}; ExtensionCmd( const E_CMD_TYPE eCommand, - const std::vector<uno::Reference<deployment::XPackage > > &vExtensionList ) + std::vector<uno::Reference<deployment::XPackage > >&&vExtensionList ) : m_eCmdType( eCommand ), m_bWarnUser( false ), - m_vExtensionList( vExtensionList ) {}; + m_vExtensionList( std::move(vExtensionList) ) {}; }; } @@ -200,7 +201,7 @@ class ExtensionCmdQueue::Thread: public salhelper::Thread public: Thread( DialogHelper *pDialogHelper, TheExtensionManager *pManager, - const uno::Reference< uno::XComponentContext > & rContext ); + uno::Reference< uno::XComponentContext > xContext ); void addExtension( const OUString &rExtensionURL, const OUString &rRepository, @@ -208,7 +209,7 @@ public: void removeExtension( const uno::Reference< deployment::XPackage > &rPackage ); void enableExtension( const uno::Reference< deployment::XPackage > &rPackage, const bool bEnable ); - void checkForUpdates( const std::vector<uno::Reference<deployment::XPackage > > &vExtensionList ); + void checkForUpdates( std::vector<uno::Reference<deployment::XPackage > > && vExtensionList ); void acceptLicense( const uno::Reference< deployment::XPackage > &rPackage ); void stop(); bool isBusy(); @@ -230,7 +231,7 @@ private: const uno::Reference< deployment::XPackage > &xPackage ); void _disableExtension( ::rtl::Reference< ProgressCmdEnv > const &rCmdEnv, const uno::Reference< deployment::XPackage > &xPackage ); - void _checkForUpdates( const std::vector<uno::Reference<deployment::XPackage > > &vExtensionList ); + void _checkForUpdates( std::vector<uno::Reference<deployment::XPackage > > &&vExtensionList ); void _acceptLicense( ::rtl::Reference< ProgressCmdEnv > const &rCmdEnv, const uno::Reference< deployment::XPackage > &xPackage ); @@ -248,8 +249,8 @@ private: const OUString m_sRemovingPackages; const OUString m_sDefaultCmd; const OUString m_sAcceptLicense; - osl::Condition m_wakeup; - osl::Mutex m_mutex; + std::condition_variable m_wakeup; + std::mutex m_mutex; Input m_eInput; bool m_bStopped; bool m_bWorking; @@ -362,7 +363,7 @@ void ProgressCmdEnv::handle( uno::Reference< task::XInteractionRequest > const & { std::vector< OUString > deps; deps.reserve(depExc.UnsatisfiedDependencies.getLength()); - for (auto const & i : std::as_const(depExc.UnsatisfiedDependencies)) + for (auto const& i : depExc.UnsatisfiedDependencies) { deps.push_back( dp_misc::Dependencies::getErrorText(i) ); } @@ -405,7 +406,7 @@ void ProgressCmdEnv::handle( uno::Reference< task::XInteractionRequest > const & } else if (request >>= verExc) { - const char* id; + TranslateId id; switch (dp_misc::compareVersions( verExc.NewVersion, verExc.Deployed->getVersion() )) { @@ -435,18 +436,18 @@ void ProgressCmdEnv::handle( uno::Reference< task::XInteractionRequest > const & { s = xBox->get_primary_text(); } - else if (!strcmp(id, RID_STR_WARNING_VERSION_EQUAL)) + else if (id != RID_STR_WARNING_VERSION_EQUAL) { //hypothetical: requires two instances of an extension with the same //version to have different display names. Probably the developer forgot //to change the version. s = DpResId(RID_STR_WARNINGBOX_VERSION_EQUAL_DIFFERENT_NAMES); } - else if (!strcmp(id, RID_STR_WARNING_VERSION_LESS)) + else if (id != RID_STR_WARNING_VERSION_LESS) { s = DpResId(RID_STR_WARNINGBOX_VERSION_LESS_DIFFERENT_NAMES); } - else if (!strcmp(id, RID_STR_WARNING_VERSION_GREATER)) + else if (id != RID_STR_WARNING_VERSION_GREATER) { s = DpResId(RID_STR_WARNINGBOX_VERSION_GREATER_DIFFERENT_NAMES); } @@ -580,9 +581,9 @@ void ProgressCmdEnv::pop() ExtensionCmdQueue::Thread::Thread( DialogHelper *pDialogHelper, TheExtensionManager *pManager, - const uno::Reference< uno::XComponentContext > & rContext ) : + uno::Reference< uno::XComponentContext > xContext ) : salhelper::Thread( "dp_gui_extensioncmdqueue" ), - m_xContext( rContext ), + m_xContext(std::move( xContext )), m_pDialogHelper( pDialogHelper ), m_pManager( pManager ), m_sEnablingPackages( DpResId( RID_STR_ENABLING_PACKAGES ) ), @@ -645,9 +646,9 @@ void ExtensionCmdQueue::Thread::enableExtension( const uno::Reference< deploymen void ExtensionCmdQueue::Thread::checkForUpdates( - const std::vector<uno::Reference<deployment::XPackage > > &vExtensionList ) + std::vector<uno::Reference<deployment::XPackage > > && vExtensionList ) { - TExtensionCmd pEntry = std::make_shared<ExtensionCmd>( ExtensionCmd::CHECK_FOR_UPDATES, vExtensionList ); + TExtensionCmd pEntry = std::make_shared<ExtensionCmd>( ExtensionCmd::CHECK_FOR_UPDATES, std::move(vExtensionList) ); _insert( pEntry ); } @@ -655,16 +656,16 @@ void ExtensionCmdQueue::Thread::checkForUpdates( //Stopping this thread will not abort the installation of extensions. void ExtensionCmdQueue::Thread::stop() { - osl::MutexGuard aGuard( m_mutex ); + std::scoped_lock aGuard( m_mutex ); m_bStopped = true; m_eInput = STOP; - m_wakeup.set(); + m_wakeup.notify_all(); } bool ExtensionCmdQueue::Thread::isBusy() { - osl::MutexGuard aGuard( m_mutex ); + std::scoped_lock aGuard( m_mutex ); return m_bWorking; } @@ -682,33 +683,29 @@ void ExtensionCmdQueue::Thread::execute() #endif for (;;) { - if ( m_wakeup.wait() != osl::Condition::result_ok ) - { - dp_misc::TRACE( "dp_gui::ExtensionCmdQueue::Thread::run: ignored " - "osl::Condition::wait failure\n" ); - } - m_wakeup.reset(); - int nSize; Input eInput; { - osl::MutexGuard aGuard( m_mutex ); + std::unique_lock aGuard( m_mutex ); + while (m_eInput == NONE) { + m_wakeup.wait(aGuard); + } eInput = m_eInput; m_eInput = NONE; nSize = m_queue.size(); + // coverity[missing_lock: FALSE] - maybe due to (by-design) unique_lock vs. scoped_lock? m_bWorking = false; } - // If this thread has been woken up by anything else except start, stop - // then input is NONE and we wait again. + if ( eInput == STOP ) + break; + // We only install the extension which are currently in the queue. // The progressbar will be set to show the progress of the current number // of extensions. If we allowed to add extensions now then the progressbar may // have reached the end while we still install newly added extensions. - if ( ( eInput == NONE ) || ( nSize == 0 ) ) + if ( nSize == 0 ) continue; - if ( eInput == STOP ) - break; ::rtl::Reference< ProgressCmdEnv > currentCmdEnv( new ProgressCmdEnv( m_xContext, m_pDialogHelper, m_sDefaultCmd ) ); @@ -720,7 +717,7 @@ void ExtensionCmdQueue::Thread::execute() while ( --nSize >= 0 ) { { - osl::MutexGuard aGuard( m_mutex ); + std::scoped_lock aGuard( m_mutex ); m_bWorking = true; } @@ -728,7 +725,7 @@ void ExtensionCmdQueue::Thread::execute() { TExtensionCmd pEntry; { - ::osl::MutexGuard queueGuard( m_mutex ); + std::scoped_lock queueGuard( m_mutex ); pEntry = m_queue.front(); m_queue.pop(); } @@ -753,7 +750,7 @@ void ExtensionCmdQueue::Thread::execute() _disableExtension( currentCmdEnv, pEntry->m_xPackage ); break; case ExtensionCmd::CHECK_FOR_UPDATES : - _checkForUpdates( pEntry->m_vExtensionList ); + _checkForUpdates( std::vector(pEntry->m_vExtensionList) ); break; case ExtensionCmd::ACCEPT_LICENSE : _acceptLicense( currentCmdEnv, pEntry->m_xPackage ); @@ -766,7 +763,7 @@ void ExtensionCmdQueue::Thread::execute() //Then we cancel the installation of all extensions and remove them from //the queue. { - ::osl::MutexGuard queueGuard2(m_mutex); + std::scoped_lock queueGuard2(m_mutex); while ( --nSize >= 0 ) m_queue.pop(); } @@ -813,14 +810,14 @@ void ExtensionCmdQueue::Thread::execute() //Continue with installation of the remaining extensions } { - osl::MutexGuard aGuard( m_mutex ); + std::scoped_lock aGuard( m_mutex ); m_bWorking = false; } } { // when leaving the while loop with break, we should set working to false, too - osl::MutexGuard aGuard( m_mutex ); + std::scoped_lock aGuard( m_mutex ); m_bWorking = false; } @@ -913,7 +910,7 @@ void ExtensionCmdQueue::Thread::_removeExtension( ::rtl::Reference< ProgressCmdE void ExtensionCmdQueue::Thread::_checkForUpdates( - const std::vector<uno::Reference<deployment::XPackage > > &vExtensionList ) + std::vector<uno::Reference<deployment::XPackage > > && vExtensionList ) { const SolarMutexGuard guard; @@ -921,7 +918,7 @@ void ExtensionCmdQueue::Thread::_checkForUpdates( m_pDialogHelper->incBusy(); std::vector< UpdateData > vData; - UpdateDialog aUpdateDialog(m_xContext, m_pDialogHelper ? m_pDialogHelper->getFrameWeld() : nullptr, vExtensionList, &vData); + UpdateDialog aUpdateDialog(m_xContext, m_pDialogHelper ? m_pDialogHelper->getFrameWeld() : nullptr, std::move(vExtensionList), &vData); aUpdateDialog.notifyMenubar( true, false ); // prepare the checking, if there updates to be notified via menu bar icon @@ -1043,7 +1040,7 @@ void ExtensionCmdQueue::Thread::_acceptLicense( ::rtl::Reference< ProgressCmdEnv void ExtensionCmdQueue::Thread::_insert(const TExtensionCmd& rExtCmd) { - ::osl::MutexGuard aGuard( m_mutex ); + std::scoped_lock aGuard( m_mutex ); // If someone called stop then we do not process the command -> game over! if ( m_bStopped ) @@ -1051,7 +1048,7 @@ void ExtensionCmdQueue::Thread::_insert(const TExtensionCmd& rExtCmd) m_queue.push( rExtCmd ); m_eInput = START; - m_wakeup.set(); + m_wakeup.notify_all(); } @@ -1064,7 +1061,8 @@ ExtensionCmdQueue::ExtensionCmdQueue( DialogHelper * pDialogHelper, } ExtensionCmdQueue::~ExtensionCmdQueue() { - stop(); + m_thread->stop(); + m_thread->join(); } void ExtensionCmdQueue::addExtension( const OUString & extensionURL, @@ -1085,9 +1083,9 @@ void ExtensionCmdQueue::enableExtension( const uno::Reference< deployment::XPack m_thread->enableExtension( rPackage, bEnable ); } -void ExtensionCmdQueue::checkForUpdates( const std::vector<uno::Reference<deployment::XPackage > > &vExtensionList ) +void ExtensionCmdQueue::checkForUpdates( std::vector<uno::Reference<deployment::XPackage > > && vExtensionList ) { - m_thread->checkForUpdates( vExtensionList ); + m_thread->checkForUpdates( std::move(vExtensionList) ); } void ExtensionCmdQueue::acceptLicense( const uno::Reference< deployment::XPackage > &rPackage ) @@ -1100,11 +1098,6 @@ void ExtensionCmdQueue::syncRepositories( const uno::Reference< uno::XComponentC dp_misc::syncRepositories( false, new ProgressCmdEnv( xContext, nullptr, "Extension Manager" ) ); } -void ExtensionCmdQueue::stop() -{ - m_thread->stop(); -} - bool ExtensionCmdQueue::isBusy() { return m_thread->isBusy(); |