summaryrefslogtreecommitdiff
path: root/desktop/source/deployment/gui/dp_gui_extensioncmdqueue.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'desktop/source/deployment/gui/dp_gui_extensioncmdqueue.cxx')
-rw-r--r--desktop/source/deployment/gui/dp_gui_extensioncmdqueue.cxx117
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();