[Libreoffice-commits] core.git: 2 commits - comphelper/source unotools/source
Noel Grandin (via logerrit)
logerrit at kemper.freedesktop.org
Mon Apr 8 06:51:28 UTC 2019
comphelper/source/container/embeddedobjectcontainer.cxx | 91 +++++------
unotools/source/ucbhelper/XTempFile.hxx | 28 ++-
unotools/source/ucbhelper/xtempfile.cxx | 129 ++++++++++++----
3 files changed, 170 insertions(+), 78 deletions(-)
New commits:
commit a1bba53d6fbc56537da0296c27db5cc443c8bca7
Author: Noel Grandin <noel.grandin at collabora.co.uk>
AuthorDate: Fri Apr 5 15:37:50 2019 +0200
Commit: Noel Grandin <noel.grandin at collabora.co.uk>
CommitDate: Mon Apr 8 08:51:13 2019 +0200
tdf#117066 Saving ODT document with ~1500 bookmarks is slow, part 2
Individually, these don't make much difference, but they add up
to a halving the time to save on my machine.
OTempFileService was spending a lot of time in PropertySetMixin doing
UNO reflection.
Re-implement the required property interfaces directly..
Change-Id: I9b6ef439d4c56eb40c1f5d636e3e5cb888d5d4ff
Reviewed-on: https://gerrit.libreoffice.org/70310
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>
diff --git a/unotools/source/ucbhelper/XTempFile.hxx b/unotools/source/ucbhelper/XTempFile.hxx
index 43150b675f07..8a3d9fd0be41 100644
--- a/unotools/source/ucbhelper/XTempFile.hxx
+++ b/unotools/source/ucbhelper/XTempFile.hxx
@@ -39,10 +39,12 @@ namespace utl { class TempFile; }
typedef ::cppu::WeakImplHelper< css::io::XTempFile
, css::io::XInputStream
, css::io::XOutputStream
- , css::io::XTruncate > OTempFileBase;
+ , css::io::XTruncate
+ , css::beans::XPropertySet
+ , css::beans::XFastPropertySet
+ , css::beans::XPropertyAccess > OTempFileBase;
class OTempFileService : public OTempFileBase
- , public ::cppu::PropertySetMixin< css::io::XTempFile >
{
protected:
std::unique_ptr<utl::TempFile> mpTempFile;
@@ -62,12 +64,6 @@ public:
explicit OTempFileService (css::uno::Reference< css::uno::XComponentContext > const & context);
//Methods
- // XInterface
- virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type& aType ) override;
- virtual void SAL_CALL acquire( )
- throw () override;
- virtual void SAL_CALL release( )
- throw () override;
// XTypeProvider
virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes( ) override;
@@ -97,6 +93,22 @@ public:
// XTruncate
virtual void SAL_CALL truncate() override;
+ // XPropertySet
+ virtual ::css::uno::Reference< ::css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo() override;
+ virtual void SAL_CALL setPropertyValue( const ::rtl::OUString& aPropertyName, const ::css::uno::Any& aValue ) override;
+ virtual ::css::uno::Any SAL_CALL getPropertyValue( const ::rtl::OUString& PropertyName ) override;
+ virtual void SAL_CALL addPropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::css::uno::Reference< ::css::beans::XPropertyChangeListener >& xListener ) override;
+ virtual void SAL_CALL removePropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::css::uno::Reference< ::css::beans::XPropertyChangeListener >& aListener ) override;
+ virtual void SAL_CALL addVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::css::uno::Reference< ::css::beans::XVetoableChangeListener >& aListener ) override;
+ virtual void SAL_CALL removeVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::css::uno::Reference< ::css::beans::XVetoableChangeListener >& aListener ) override;
+ // XFastPropertySet
+ virtual void SAL_CALL setFastPropertyValue( ::sal_Int32 nHandle, const ::css::uno::Any& aValue ) override;
+ virtual ::css::uno::Any SAL_CALL getFastPropertyValue( ::sal_Int32 nHandle ) override;
+ // XPropertyAccess
+ virtual ::css::uno::Sequence< ::css::beans::PropertyValue > SAL_CALL getPropertyValues() override;
+ virtual void SAL_CALL setPropertyValues( const ::css::uno::Sequence< ::css::beans::PropertyValue >& aProps ) override;
+
+
virtual ~OTempFileService () override;
};
#endif
diff --git a/unotools/source/ucbhelper/xtempfile.cxx b/unotools/source/ucbhelper/xtempfile.cxx
index a8e0771cbea9..dc05e4194237 100644
--- a/unotools/source/ucbhelper/xtempfile.cxx
+++ b/unotools/source/ucbhelper/xtempfile.cxx
@@ -21,6 +21,7 @@
#include <unotoolsservices.hxx>
#include <com/sun/star/io/BufferSizeExceededException.hpp>
#include <com/sun/star/io/NotConnectedException.hpp>
+#include <com/sun/star/beans/PropertyAttribute.hpp>
#include <cppuhelper/factory.hxx>
#include <cppuhelper/supportsservice.hxx>
#include <cppuhelper/typeprovider.hxx>
@@ -28,13 +29,10 @@
#include <osl/file.hxx>
#include <unotools/configmgr.hxx>
#include <unotools/tempfile.hxx>
+#include <cppuhelper/propshlp.hxx>
-OTempFileService::OTempFileService(css::uno::Reference< css::uno::XComponentContext > const & context)
-: ::cppu::PropertySetMixin< css::io::XTempFile >(
- context
- , static_cast< Implements >( IMPLEMENTS_PROPERTY_SET | IMPLEMENTS_FAST_PROPERTY_SET | IMPLEMENTS_PROPERTY_ACCESS )
- , css::uno::Sequence< OUString >() )
-, mpStream( nullptr )
+OTempFileService::OTempFileService(css::uno::Reference< css::uno::XComponentContext > const &)
+: mpStream( nullptr )
, mbRemoveFile( true )
, mbInClosed( false )
, mbOutClosed( false )
@@ -50,26 +48,6 @@ OTempFileService::~OTempFileService ()
{
}
-// XInterface
-
-css::uno::Any SAL_CALL OTempFileService::queryInterface( css::uno::Type const & aType )
-{
- css::uno::Any aResult( OTempFileBase::queryInterface( aType ) );
- if (!aResult.hasValue())
- aResult = cppu::PropertySetMixin< css::io::XTempFile >::queryInterface( aType );
- return aResult;
-};
-void SAL_CALL OTempFileService::acquire( )
-throw ()
-{
- OTempFileBase::acquire();
-}
-void SAL_CALL OTempFileService::release( )
-throw ()
-{
- OTempFileBase::release();
-}
-
// XTypeProvider
css::uno::Sequence< css::uno::Type > SAL_CALL OTempFileService::getTypes( )
@@ -365,6 +343,105 @@ void SAL_CALL OTempFileService::truncate()
checkError();
}
+#define PROPERTY_HANDLE_URI 1
+#define PROPERTY_HANDLE_REMOVE_FILE 2
+#define PROPERTY_HANDLE_RESOURCE_NAME 3
+
+// XPropertySet
+::css::uno::Reference< ::css::beans::XPropertySetInfo > OTempFileService::getPropertySetInfo()
+{
+ // Create a table that map names to index values.
+ // attention: properties need to be sorted by name!
+ static cppu::OPropertyArrayHelper ourPropertyInfo(
+ {
+ css::beans::Property( "Uri", PROPERTY_HANDLE_URI, cppu::UnoType<OUString>::get(),
+ css::beans::PropertyAttribute::READONLY ),
+ css::beans::Property( "RemoveFile", PROPERTY_HANDLE_REMOVE_FILE, cppu::UnoType<bool>::get(),
+ 0 ),
+ css::beans::Property( "ResourceName", PROPERTY_HANDLE_RESOURCE_NAME, cppu::UnoType<OUString>::get(),
+ css::beans::PropertyAttribute::READONLY )
+ },
+ true );
+ static css::uno::Reference< css::beans::XPropertySetInfo > xInfo(
+ ::cppu::OPropertySetHelper::createPropertySetInfo( ourPropertyInfo ) );
+ return xInfo;
+}
+void OTempFileService::setPropertyValue( const ::rtl::OUString& aPropertyName, const ::css::uno::Any& aValue )
+{
+ if ( aPropertyName == "RemoveFile" )
+ setRemoveFile( aValue.get<bool>() );
+ else
+ {
+ assert(false);
+ throw css::beans::UnknownPropertyException(aPropertyName);
+ }
+}
+::css::uno::Any OTempFileService::getPropertyValue( const ::rtl::OUString& aPropertyName )
+{
+ if ( aPropertyName == "RemoveFile" )
+ return css::uno::Any(getRemoveFile());
+ else if ( aPropertyName == "ResourceName" )
+ return css::uno::Any(getResourceName());
+ else if ( aPropertyName == "Uri" )
+ return css::uno::Any(getUri());
+ else
+ {
+ assert(false);
+ throw css::beans::UnknownPropertyException(aPropertyName);
+ }
+}
+void OTempFileService::addPropertyChangeListener( const ::rtl::OUString& /*aPropertyName*/, const ::css::uno::Reference< ::css::beans::XPropertyChangeListener >& /*xListener*/ )
+{
+ assert(false);
+}
+void OTempFileService::removePropertyChangeListener( const ::rtl::OUString& /*aPropertyName*/, const ::css::uno::Reference< ::css::beans::XPropertyChangeListener >& /*xListener*/ )
+{
+ assert(false);
+}
+void OTempFileService::addVetoableChangeListener( const ::rtl::OUString& /*aPropertyName*/, const ::css::uno::Reference< ::css::beans::XVetoableChangeListener >& /*xListener*/ )
+{
+ assert(false);
+}
+void OTempFileService::removeVetoableChangeListener( const ::rtl::OUString& /*aPropertyName*/, const ::css::uno::Reference< ::css::beans::XVetoableChangeListener >& /*xListener*/ )
+{
+ assert(false);
+}
+// XFastPropertySet
+void OTempFileService::setFastPropertyValue( ::sal_Int32 nHandle, const ::css::uno::Any& aValue )
+{
+ switch (nHandle)
+ {
+ case PROPERTY_HANDLE_REMOVE_FILE: setRemoveFile( aValue.get<bool>() ); return;
+ }
+ assert(false);
+ throw css::beans::UnknownPropertyException(OUString::number(nHandle));
+}
+::css::uno::Any OTempFileService::getFastPropertyValue( ::sal_Int32 nHandle )
+{
+ switch (nHandle)
+ {
+ case PROPERTY_HANDLE_REMOVE_FILE: return css::uno::Any(getRemoveFile());
+ case PROPERTY_HANDLE_RESOURCE_NAME: return css::uno::Any(getResourceName());
+ case PROPERTY_HANDLE_URI: return css::uno::Any(getUri());
+ }
+ assert(false);
+ throw css::beans::UnknownPropertyException(OUString::number(nHandle));
+}
+// XPropertyAccess
+::css::uno::Sequence< ::css::beans::PropertyValue > OTempFileService::getPropertyValues()
+{
+ return {
+ css::beans::PropertyValue("Uri", PROPERTY_HANDLE_URI, css::uno::Any(getUri()), css::beans::PropertyState_DEFAULT_VALUE),
+ css::beans::PropertyValue("RemoveFile", PROPERTY_HANDLE_REMOVE_FILE, css::uno::Any(getRemoveFile()), css::beans::PropertyState_DEFAULT_VALUE),
+ css::beans::PropertyValue("ResourceName", PROPERTY_HANDLE_RESOURCE_NAME, css::uno::Any(getResourceName()), css::beans::PropertyState_DEFAULT_VALUE)
+ };
+}
+void OTempFileService::setPropertyValues( const ::css::uno::Sequence< ::css::beans::PropertyValue >& aProps )
+{
+ for ( auto const & rPropVal : aProps )
+ setPropertyValue( rPropVal.Name, rPropVal.Value );
+}
+
namespace sdecl = ::comphelper::service_decl;
sdecl::class_< OTempFileService> const OTempFileServiceImpl;
const sdecl::ServiceDecl OTempFileServiceDecl(
commit eb7c9bcda2a4324a682114a1f38e4761c665cbdc
Author: Noel Grandin <noel.grandin at collabora.co.uk>
AuthorDate: Fri Apr 5 15:37:21 2019 +0200
Commit: Noel Grandin <noel.grandin at collabora.co.uk>
CommitDate: Mon Apr 8 08:51:07 2019 +0200
tdf#117066 Saving ODT document with ~1500 bookmarks is slow, part 1
Individually, these don't make much difference, but they add up
to a halving the time to save on my machine.
EmbeddedObjectContainer shows a lot of work in HasEmbeddedObject and
GetEmbeddedObjectName, so add a reverse map there.
Change-Id: Ib758668dbb045e6ceb2611bd86aa2af4fbfb9917
Reviewed-on: https://gerrit.libreoffice.org/70309
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>
diff --git a/comphelper/source/container/embeddedobjectcontainer.cxx b/comphelper/source/container/embeddedobjectcontainer.cxx
index ffa22966a53b..ff0ec3a2dce5 100644
--- a/comphelper/source/container/embeddedobjectcontainer.cxx
+++ b/comphelper/source/container/embeddedobjectcontainer.cxx
@@ -55,19 +55,22 @@ using namespace ::com::sun::star;
namespace comphelper {
-typedef std::unordered_map<OUString, uno::Reference <embed::XEmbeddedObject>>
-EmbeddedObjectContainerNameMap;
-
+typedef std::unordered_map<OUString, uno::Reference<embed::XEmbeddedObject>> EmbeddedObjectContainerNameMap;
struct EmbedImpl
{
+ struct XEmbeddedObjectRefHash
+ {
+ size_t operator()(const uno::Reference<embed::XEmbeddedObject>& rObject) const
+ { return reinterpret_cast<size_t>(rObject.get()); }
+ };
// TODO/LATER: remove objects from temp. Container storage when object is disposed
- EmbeddedObjectContainerNameMap maObjectContainer;
+ EmbeddedObjectContainerNameMap maNameToObjectMap;
+ // to speed up lookup by Reference
+ std::unordered_map<uno::Reference<embed::XEmbeddedObject>, OUString, XEmbeddedObjectRefHash> maObjectToNameMap;
uno::Reference < embed::XStorage > mxStorage;
EmbeddedObjectContainer* mpTempObjectContainer;
uno::Reference < embed::XStorage > mxImageStorage;
uno::WeakReference < uno::XInterface > m_xModel;
- //EmbeddedObjectContainerNameMap maTempObjectContainer;
- //uno::Reference < embed::XStorage > mxTempStorage;
bool mbOwnsStorage : 1;
bool mbUserAllowsLinkUpdate : 1;
@@ -197,7 +200,7 @@ EmbeddedObjectContainer::~EmbeddedObjectContainer()
void EmbeddedObjectContainer::CloseEmbeddedObjects()
{
- for( const auto& rObj : pImpl->maObjectContainer )
+ for( const auto& rObj : pImpl->maNameToObjectMap )
{
uno::Reference < util::XCloseable > xClose( rObj.second, uno::UNO_QUERY );
if( xClose.is() )
@@ -229,18 +232,18 @@ OUString EmbeddedObjectContainer::CreateUniqueObjectName()
uno::Sequence < OUString > EmbeddedObjectContainer::GetObjectNames() const
{
- return comphelper::mapKeysToSequence(pImpl->maObjectContainer);
+ return comphelper::mapKeysToSequence(pImpl->maNameToObjectMap);
}
bool EmbeddedObjectContainer::HasEmbeddedObjects() const
{
- return !pImpl->maObjectContainer.empty();
+ return !pImpl->maNameToObjectMap.empty();
}
bool EmbeddedObjectContainer::HasEmbeddedObject( const OUString& rName )
{
- EmbeddedObjectContainerNameMap::iterator aIt = pImpl->maObjectContainer.find( rName );
- if (aIt != pImpl->maObjectContainer.end())
+ auto aIt = pImpl->maNameToObjectMap.find( rName );
+ if (aIt != pImpl->maNameToObjectMap.end())
return true;
uno::Reference <container::XNameAccess> xAccess(pImpl->mxStorage, uno::UNO_QUERY);
if (!xAccess.is())
@@ -250,12 +253,7 @@ bool EmbeddedObjectContainer::HasEmbeddedObject( const OUString& rName )
bool EmbeddedObjectContainer::HasEmbeddedObject( const uno::Reference < embed::XEmbeddedObject >& xObj ) const
{
- for( const auto& rObj : pImpl->maObjectContainer )
- {
- if( rObj.second == xObj )
- return true;
- }
- return false;
+ return pImpl->maObjectToNameMap.find(xObj) != pImpl->maObjectToNameMap.end();
}
bool EmbeddedObjectContainer::HasInstantiatedEmbeddedObject( const OUString& rName )
@@ -263,19 +261,19 @@ bool EmbeddedObjectContainer::HasInstantiatedEmbeddedObject( const OUString& rNa
// allows to detect whether the object was already instantiated
// currently the filter instantiate it on loading, so this method allows
// to avoid objects pointing to the same persistence
- EmbeddedObjectContainerNameMap::iterator aIt = pImpl->maObjectContainer.find( rName );
- return ( aIt != pImpl->maObjectContainer.end() );
+ auto aIt = pImpl->maNameToObjectMap.find( rName );
+ return ( aIt != pImpl->maNameToObjectMap.end() );
}
OUString EmbeddedObjectContainer::GetEmbeddedObjectName( const css::uno::Reference < css::embed::XEmbeddedObject >& xObj ) const
{
- for( const auto& rObj : pImpl->maObjectContainer )
+ auto it = pImpl->maObjectToNameMap.find(xObj);
+ if (it == pImpl->maObjectToNameMap.end())
{
- if( rObj.second == xObj )
- return rObj.first;
+ SAL_WARN( "comphelper.container", "Unknown object!" );
+ return OUString();
}
- SAL_WARN( "comphelper.container", "Unknown object!" );
- return OUString();
+ return it->second;
}
uno::Reference< embed::XEmbeddedObject>
@@ -285,7 +283,7 @@ EmbeddedObjectContainer::GetEmbeddedObject(
SAL_WARN_IF( rName.isEmpty(), "comphelper.container", "Empty object name!");
uno::Reference < embed::XEmbeddedObject > xObj;
- EmbeddedObjectContainerNameMap::iterator aIt = pImpl->maObjectContainer.find( rName );
+ auto aIt = pImpl->maNameToObjectMap.find( rName );
#if OSL_DEBUG_LEVEL > 1
uno::Reference < container::XNameAccess > xAccess( pImpl->mxStorage, uno::UNO_QUERY );
@@ -296,11 +294,11 @@ EmbeddedObjectContainer::GetEmbeddedObject(
{
(void)*pIter;
}
- OSL_ENSURE( aIt != pImpl->maObjectContainer.end() || xAccess->hasByName(rName), "Could not return object!" );
+ OSL_ENSURE( aIt != pImpl->maNameToObjectMap.end() || xAccess->hasByName(rName), "Could not return object!" );
#endif
// check if object was already created
- if ( aIt != pImpl->maObjectContainer.end() )
+ if ( aIt != pImpl->maNameToObjectMap.end() )
xObj = (*aIt).second;
else
xObj = Get_Impl(rName, uno::Reference<embed::XEmbeddedObject>(), pBaseURL);
@@ -424,9 +422,10 @@ void EmbeddedObjectContainer::AddEmbeddedObject( const css::uno::Reference < css
#endif
// remember object - it needs to be in storage already
- EmbeddedObjectContainerNameMap::iterator aIt = pImpl->maObjectContainer.find( rName );
- OSL_ENSURE( aIt == pImpl->maObjectContainer.end(), "Element already inserted!" );
- pImpl->maObjectContainer[ rName ] = xObj;
+ auto aIt = pImpl->maNameToObjectMap.find( rName );
+ OSL_ENSURE( aIt == pImpl->maNameToObjectMap.end(), "Element already inserted!" );
+ pImpl->maNameToObjectMap[ rName ] = xObj;
+ pImpl->maObjectToNameMap[ xObj ] = rName;
uno::Reference < container::XChild > xChild( xObj, uno::UNO_QUERY );
if ( xChild.is() && xChild->getParent() != pImpl->m_xModel.get() )
xChild->setParent( pImpl->m_xModel.get() );
@@ -434,7 +433,7 @@ void EmbeddedObjectContainer::AddEmbeddedObject( const css::uno::Reference < css
// look for object in temporary container
if ( pImpl->mpTempObjectContainer )
{
- auto& rObjectContainer = pImpl->mpTempObjectContainer->pImpl->maObjectContainer;
+ auto& rObjectContainer = pImpl->mpTempObjectContainer->pImpl->maNameToObjectMap;
auto aIter = std::find_if(rObjectContainer.begin(), rObjectContainer.end(),
[&xObj](const EmbeddedObjectContainerNameMap::value_type& rEntry) { return rEntry.second == xObj; });
if (aIter != rObjectContainer.end())
@@ -464,7 +463,8 @@ void EmbeddedObjectContainer::AddEmbeddedObject( const css::uno::Reference < css
}
// temp. container needs to forget the object
- pImpl->mpTempObjectContainer->pImpl->maObjectContainer.erase( aIter );
+ pImpl->mpTempObjectContainer->pImpl->maObjectToNameMap.erase( aIter->second );
+ pImpl->mpTempObjectContainer->pImpl->maNameToObjectMap.erase( aIter );
}
}
}
@@ -841,15 +841,15 @@ void EmbeddedObjectContainer::RemoveEmbeddedObject( const OUString& rName, bool
bool EmbeddedObjectContainer::MoveEmbeddedObject( const OUString& rName, EmbeddedObjectContainer& rCnt )
{
// find object entry
- EmbeddedObjectContainerNameMap::iterator aIt2 = rCnt.pImpl->maObjectContainer.find( rName );
- OSL_ENSURE( aIt2 == rCnt.pImpl->maObjectContainer.end(), "Object does already exist in target container!" );
+ auto aIt2 = rCnt.pImpl->maNameToObjectMap.find( rName );
+ OSL_ENSURE( aIt2 == rCnt.pImpl->maNameToObjectMap.end(), "Object does already exist in target container!" );
- if ( aIt2 != rCnt.pImpl->maObjectContainer.end() )
+ if ( aIt2 != rCnt.pImpl->maNameToObjectMap.end() )
return false;
uno::Reference < embed::XEmbeddedObject > xObj;
- EmbeddedObjectContainerNameMap::iterator aIt = pImpl->maObjectContainer.find( rName );
- if ( aIt != pImpl->maObjectContainer.end() )
+ auto aIt = pImpl->maNameToObjectMap.find( rName );
+ if ( aIt != pImpl->maNameToObjectMap.end() )
{
xObj = (*aIt).second;
try
@@ -859,7 +859,8 @@ bool EmbeddedObjectContainer::MoveEmbeddedObject( const OUString& rName, Embedde
// move object
OUString aName( rName );
rCnt.InsertEmbeddedObject( xObj, aName );
- pImpl->maObjectContainer.erase( aIt );
+ pImpl->maObjectToNameMap.erase( aIt->second );
+ pImpl->maNameToObjectMap.erase( aIt );
uno::Reference < embed::XEmbedPersist > xPersist( xObj, uno::UNO_QUERY );
if ( xPersist.is() )
pImpl->mxStorage->removeElement( rName );
@@ -956,11 +957,12 @@ bool EmbeddedObjectContainer::RemoveEmbeddedObject( const uno::Reference < embed
return false;
}
- auto aIter = std::find_if(pImpl->maObjectContainer.begin(), pImpl->maObjectContainer.end(),
+ auto aIter = std::find_if(pImpl->maNameToObjectMap.begin(), pImpl->maNameToObjectMap.end(),
[&xObj](const EmbeddedObjectContainerNameMap::value_type& rEntry) { return rEntry.second == xObj; });
- if (aIter != pImpl->maObjectContainer.end())
+ if (aIter != pImpl->maNameToObjectMap.end())
{
- pImpl->maObjectContainer.erase( aIter );
+ pImpl->maObjectToNameMap.erase( aIter->second );
+ pImpl->maNameToObjectMap.erase( aIter );
uno::Reference < container::XChild > xChild( xObj, uno::UNO_QUERY );
if ( xChild.is() )
xChild->setParent( uno::Reference < uno::XInterface >() );
@@ -997,11 +999,12 @@ void EmbeddedObjectContainer::CloseEmbeddedObject( const uno::Reference < embed:
{
// disconnect the object from the container and close it if possible
- auto aIter = std::find_if(pImpl->maObjectContainer.begin(), pImpl->maObjectContainer.end(),
+ auto aIter = std::find_if(pImpl->maNameToObjectMap.begin(), pImpl->maNameToObjectMap.end(),
[&xObj](const EmbeddedObjectContainerNameMap::value_type& rEntry) { return rEntry.second == xObj; });
- if (aIter != pImpl->maObjectContainer.end())
+ if (aIter != pImpl->maNameToObjectMap.end())
{
- pImpl->maObjectContainer.erase( aIter );
+ pImpl->maObjectToNameMap.erase( aIter->second );
+ pImpl->maNameToObjectMap.erase( aIter );
uno::Reference < ::util::XCloseable > xClose( xObj, uno::UNO_QUERY );
try
More information about the Libreoffice-commits
mailing list