osl::Mutex->std::mutex in FSStorage

Change-Id: I62980bec76425980804368ba009ffaeb6bef800a
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/147104
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
This commit is contained in:
Noel Grandin 2023-02-15 18:47:57 +02:00
parent 17827ea497
commit a38f13e364
2 changed files with 63 additions and 42 deletions

View file

@ -75,10 +75,10 @@ FSStorage::FSStorage( const ::ucbhelper::Content& aContent,
FSStorage::~FSStorage()
{
::osl::MutexGuard aGuard( m_aMutex );
std::unique_lock aGuard( m_aMutex );
osl_atomic_increment(&m_refCount); // to call dispose
try {
dispose();
disposeImpl(aGuard);
}
catch( uno::RuntimeException& )
{}
@ -103,7 +103,7 @@ bool FSStorage::MakeFolderNoUI( std::u16string_view rFolder )
ucbhelper::Content& FSStorage::GetContent()
{
::osl::MutexGuard aGuard( m_aMutex );
std::unique_lock aGuard( m_aMutex );
return m_aContent;
}
@ -244,14 +244,14 @@ uno::Sequence< sal_Int8 > SAL_CALL FSStorage::getImplementationId()
void SAL_CALL FSStorage::copyToStorage( const uno::Reference< embed::XStorage >& xDest )
{
::osl::MutexGuard aGuard( m_aMutex );
std::unique_lock aGuard( m_aMutex );
if ( !xDest.is() || xDest == uno::Reference< uno::XInterface >( static_cast< OWeakObject*> ( this ), uno::UNO_QUERY ) )
throw lang::IllegalArgumentException(); // TODO:
try
{
CopyContentToStorage_Impl( GetContent(), xDest );
CopyContentToStorage_Impl( m_aContent, xDest );
}
catch( embed::InvalidStorageException& )
{
@ -285,8 +285,14 @@ void SAL_CALL FSStorage::copyToStorage( const uno::Reference< embed::XStorage >&
uno::Reference< io::XStream > SAL_CALL FSStorage::openStreamElement(
const OUString& aStreamName, sal_Int32 nOpenMode )
{
::osl::MutexGuard aGuard( m_aMutex );
std::unique_lock aGuard( m_aMutex );
return openStreamElementImpl(aGuard, aStreamName, nOpenMode);
}
uno::Reference< io::XStream > FSStorage::openStreamElementImpl(
std::unique_lock<std::mutex>& /*rGuard*/,
std::u16string_view aStreamName, sal_Int32 nOpenMode )
{
// TODO/LATER: may need possibility to create folder if it was removed, since the folder can not be locked
INetURLObject aFileURL( m_aURL );
aFileURL.Append( aStreamName );
@ -383,8 +389,14 @@ uno::Reference< io::XStream > SAL_CALL FSStorage::openEncryptedStreamElement(
uno::Reference< embed::XStorage > SAL_CALL FSStorage::openStorageElement(
const OUString& aStorName, sal_Int32 nStorageMode )
{
::osl::MutexGuard aGuard( m_aMutex );
std::unique_lock aGuard( m_aMutex );
return openStorageElementImpl(aGuard, aStorName, nStorageMode);
}
uno::Reference< embed::XStorage > FSStorage::openStorageElementImpl(
std::unique_lock<std::mutex>& /*rGuard*/,
std::u16string_view aStorName, sal_Int32 nStorageMode )
{
if ( ( nStorageMode & embed::ElementModes::WRITE )
&& !( m_nMode & embed::ElementModes::WRITE ) )
throw io::IOException(); // TODO: error handling
@ -460,7 +472,7 @@ uno::Reference< embed::XStorage > SAL_CALL FSStorage::openStorageElement(
uno::Reference< io::XStream > SAL_CALL FSStorage::cloneStreamElement( const OUString& aStreamName )
{
::osl::MutexGuard aGuard( m_aMutex );
std::unique_lock aGuard( m_aMutex );
// TODO/LATER: may need possibility to create folder if it was removed, since the folder can not be locked
INetURLObject aFileURL( m_aURL );
@ -532,7 +544,7 @@ void SAL_CALL FSStorage::copyStorageElementLastCommitTo(
const OUString& aStorName,
const uno::Reference< embed::XStorage >& xTargetStorage )
{
::osl::MutexGuard aGuard( m_aMutex );
std::unique_lock aGuard( m_aMutex );
uno::Reference< embed::XStorage > xSourceStor( openStorageElement( aStorName, embed::ElementModes::READ ),
uno::UNO_SET_THROW );
@ -541,7 +553,7 @@ void SAL_CALL FSStorage::copyStorageElementLastCommitTo(
sal_Bool SAL_CALL FSStorage::isStreamElement( const OUString& aElementName )
{
::osl::MutexGuard aGuard( m_aMutex );
std::unique_lock aGuard( m_aMutex );
INetURLObject aURL( m_aURL );
aURL.Append( aElementName );
@ -551,7 +563,7 @@ sal_Bool SAL_CALL FSStorage::isStreamElement( const OUString& aElementName )
sal_Bool SAL_CALL FSStorage::isStorageElement( const OUString& aElementName )
{
::osl::MutexGuard aGuard( m_aMutex );
std::unique_lock aGuard( m_aMutex );
INetURLObject aURL( m_aURL );
aURL.Append( aElementName );
@ -561,7 +573,7 @@ sal_Bool SAL_CALL FSStorage::isStorageElement( const OUString& aElementName )
void SAL_CALL FSStorage::removeElement( const OUString& aElementName )
{
::osl::MutexGuard aGuard( m_aMutex );
std::unique_lock aGuard( m_aMutex );
INetURLObject aURL( m_aURL );
aURL.Append( aElementName );
@ -575,7 +587,7 @@ void SAL_CALL FSStorage::removeElement( const OUString& aElementName )
void SAL_CALL FSStorage::renameElement( const OUString& aElementName, const OUString& aNewName )
{
::osl::MutexGuard aGuard( m_aMutex );
std::unique_lock aGuard( m_aMutex );
INetURLObject aOldURL( m_aURL );
aOldURL.Append( aElementName );
@ -596,7 +608,7 @@ void SAL_CALL FSStorage::renameElement( const OUString& aElementName, const OUSt
uno::Reference< ucb::XCommandEnvironment > xDummyEnv;
::ucbhelper::Content aSourceContent( aOldURL.GetMainURL( INetURLObject::DecodeMechanism::NONE ), xDummyEnv, comphelper::getProcessComponentContext() );
GetContent().transferContent(aSourceContent, ::ucbhelper::InsertOperation::Move, aNewName,
m_aContent.transferContent(aSourceContent, ::ucbhelper::InsertOperation::Move, aNewName,
ucb::NameClash::ERROR);
}
catch( embed::InvalidStorageException& )
@ -640,7 +652,7 @@ void SAL_CALL FSStorage::copyElementTo( const OUString& aElementName,
const uno::Reference< embed::XStorage >& xDest,
const OUString& aNewName )
{
::osl::MutexGuard aGuard( m_aMutex );
std::unique_lock aGuard( m_aMutex );
if ( !xDest.is() )
throw uno::RuntimeException();
@ -711,7 +723,7 @@ void SAL_CALL FSStorage::moveElementTo( const OUString& aElementName,
const uno::Reference< embed::XStorage >& xDest,
const OUString& aNewName )
{
::osl::MutexGuard aGuard( m_aMutex );
std::unique_lock aGuard( m_aMutex );
copyElementTo( aElementName, xDest, aNewName );
INetURLObject aOwnURL( m_aURL );
@ -724,7 +736,7 @@ void SAL_CALL FSStorage::moveElementTo( const OUString& aElementName,
uno::Any SAL_CALL FSStorage::getByName( const OUString& aName )
{
::osl::MutexGuard aGuard( m_aMutex );
std::unique_lock aGuard( m_aMutex );
if ( aName.isEmpty() )
throw lang::IllegalArgumentException();
@ -738,11 +750,11 @@ uno::Any SAL_CALL FSStorage::getByName( const OUString& aName )
if ( ::utl::UCBContentHelper::IsFolder( aURL.GetMainURL( INetURLObject::DecodeMechanism::NONE ) ) )
{
aResult <<= openStorageElement( aName, embed::ElementModes::READ );
aResult <<= openStorageElementImpl( aGuard, aName, embed::ElementModes::READ );
}
else if ( ::utl::UCBContentHelper::IsDocument( aURL.GetMainURL( INetURLObject::DecodeMechanism::NONE ) ) )
{
aResult <<= openStreamElement( aName, embed::ElementModes::READ );
aResult <<= openStreamElementImpl( aGuard, aName, embed::ElementModes::READ );
}
else
throw container::NoSuchElementException(); // TODO:
@ -773,7 +785,7 @@ uno::Any SAL_CALL FSStorage::getByName( const OUString& aName )
uno::Sequence< OUString > SAL_CALL FSStorage::getElementNames()
{
::osl::MutexGuard aGuard( m_aMutex );
std::unique_lock aGuard( m_aMutex );
uno::Sequence< OUString > aResult;
@ -783,7 +795,7 @@ uno::Sequence< OUString > SAL_CALL FSStorage::getElementNames()
sal_Int32 nSize = 0;
uno::Reference<sdbc::XResultSet> xResultSet
= GetContent().createCursor(aProps, ::ucbhelper::INCLUDE_FOLDERS_AND_DOCUMENTS);
= m_aContent.createCursor(aProps, ::ucbhelper::INCLUDE_FOLDERS_AND_DOCUMENTS);
uno::Reference< sdbc::XRow > xRow( xResultSet, uno::UNO_QUERY );
if ( xResultSet.is() )
{
@ -825,7 +837,7 @@ uno::Sequence< OUString > SAL_CALL FSStorage::getElementNames()
sal_Bool SAL_CALL FSStorage::hasByName( const OUString& aName )
{
::osl::MutexGuard aGuard( m_aMutex );
std::unique_lock aGuard( m_aMutex );
if ( aName.isEmpty() )
throw lang::IllegalArgumentException();
@ -845,14 +857,14 @@ uno::Type SAL_CALL FSStorage::getElementType()
sal_Bool SAL_CALL FSStorage::hasElements()
{
::osl::MutexGuard aGuard( m_aMutex );
std::unique_lock aGuard( m_aMutex );
try
{
uno::Sequence<OUString> aProps { "TargetURL" };
uno::Reference<sdbc::XResultSet> xResultSet
= GetContent().createCursor(aProps, ::ucbhelper::INCLUDE_FOLDERS_AND_DOCUMENTS);
= m_aContent.createCursor(aProps, ::ucbhelper::INCLUDE_FOLDERS_AND_DOCUMENTS);
return ( xResultSet.is() && xResultSet->next() );
}
catch (const uno::RuntimeException&)
@ -870,33 +882,33 @@ sal_Bool SAL_CALL FSStorage::hasElements()
// XDisposable
void SAL_CALL FSStorage::dispose()
{
::osl::MutexGuard aGuard( m_aMutex );
std::unique_lock aGuard( m_aMutex );
disposeImpl(aGuard);
}
if ( m_pListenersContainer )
void FSStorage::disposeImpl(std::unique_lock<std::mutex>& rGuard)
{
if ( m_aListenersContainer.getLength(rGuard) )
{
lang::EventObject aSource( static_cast< ::cppu::OWeakObject* >(this) );
m_pListenersContainer->disposeAndClear( aSource );
m_aListenersContainer.disposeAndClear( rGuard, aSource );
}
}
void SAL_CALL FSStorage::addEventListener(
const uno::Reference< lang::XEventListener >& xListener )
{
::osl::MutexGuard aGuard( m_aMutex );
std::unique_lock aGuard( m_aMutex );
if ( !m_pListenersContainer )
m_pListenersContainer.reset(new ::comphelper::OInterfaceContainerHelper3<css::lang::XEventListener>( m_aMutex ));
m_pListenersContainer->addInterface( xListener );
m_aListenersContainer.addInterface( aGuard, xListener );
}
void SAL_CALL FSStorage::removeEventListener(
const uno::Reference< lang::XEventListener >& xListener )
{
::osl::MutexGuard aGuard( m_aMutex );
std::unique_lock aGuard( m_aMutex );
if ( m_pListenersContainer )
m_pListenersContainer->removeInterface( xListener );
m_aListenersContainer.removeInterface( aGuard, xListener );
}
// XPropertySet
@ -919,7 +931,7 @@ void SAL_CALL FSStorage::setPropertyValue( const OUString& aPropertyName, const
uno::Any SAL_CALL FSStorage::getPropertyValue( const OUString& aPropertyName )
{
::osl::MutexGuard aGuard( m_aMutex );
std::unique_lock aGuard( m_aMutex );
if ( aPropertyName == "URL" )
return uno::Any( m_aURL );
@ -964,7 +976,7 @@ void SAL_CALL FSStorage::removeVetoableChangeListener(
// XHierarchicalStorageAccess
uno::Reference< embed::XExtendedStorageStream > SAL_CALL FSStorage::openStreamElementByHierarchicalName( const OUString& sStreamPath, ::sal_Int32 nOpenMode )
{
::osl::MutexGuard aGuard( m_aMutex );
std::unique_lock aGuard( m_aMutex );
if ( sStreamPath.toChar() == '/' )
throw lang::IllegalArgumentException();
@ -1073,7 +1085,7 @@ uno::Reference< embed::XExtendedStorageStream > SAL_CALL FSStorage::openEncrypte
void SAL_CALL FSStorage::removeStreamElementByHierarchicalName( const OUString& sStreamPath )
{
::osl::MutexGuard aGuard( m_aMutex );
std::unique_lock aGuard( m_aMutex );
// TODO/LATER: may need possibility to create folder if it was removed, since the folder can not be locked
INetURLObject aBaseURL( m_aURL );

View file

@ -27,22 +27,22 @@
#include <com/sun/star/beans/XPropertySet.hpp>
#include <com/sun/star/lang/XTypeProvider.hpp>
#include <com/sun/star/uno/XComponentContext.hpp>
#include <comphelper/interfacecontainer3.hxx>
#include <comphelper/interfacecontainer4.hxx>
#include <cppuhelper/weak.hxx>
#include <ucbhelper/content.hxx>
class FSStorage : public css::lang::XTypeProvider
class FSStorage final : public css::lang::XTypeProvider
, public css::embed::XStorage
, public css::embed::XHierarchicalStorageAccess
, public css::beans::XPropertySet
, public ::cppu::OWeakObject
{
::osl::Mutex m_aMutex;
std::mutex m_aMutex;
OUString m_aURL;
::ucbhelper::Content m_aContent;
sal_Int32 m_nMode;
std::unique_ptr<::comphelper::OInterfaceContainerHelper3<css::lang::XEventListener>> m_pListenersContainer; // list of listeners
::comphelper::OInterfaceContainerHelper4<css::lang::XEventListener> m_aListenersContainer; // list of listeners
css::uno::Reference< css::uno::XComponentContext > m_xContext;
public:
@ -171,6 +171,15 @@ public:
virtual css::uno::Reference< css::embed::XExtendedStorageStream > SAL_CALL openEncryptedStreamElementByHierarchicalName( const OUString& sStreamName, ::sal_Int32 nOpenMode, const OUString& sPassword ) override;
virtual void SAL_CALL removeStreamElementByHierarchicalName( const OUString& sElementPath ) override;
private:
css::uno::Reference< css::embed::XStorage > openStorageElementImpl(
std::unique_lock<std::mutex>& rGuard,
std::u16string_view aStorName, sal_Int32 nStorageMode );
css::uno::Reference< css::io::XStream > openStreamElementImpl(
std::unique_lock<std::mutex>& rGuard,
std::u16string_view aStreamName, sal_Int32 nOpenMode );
void disposeImpl(std::unique_lock<std::mutex>& rGuard);
};
#endif