summaryrefslogtreecommitdiff
path: root/embeddedobj/source/commonembedding/persistence.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'embeddedobj/source/commonembedding/persistence.cxx')
-rwxr-xr-x[-rw-r--r--]embeddedobj/source/commonembedding/persistence.cxx22
1 files changed, 18 insertions, 4 deletions
diff --git a/embeddedobj/source/commonembedding/persistence.cxx b/embeddedobj/source/commonembedding/persistence.cxx
index bc62bebd0b4a..708142c679d5 100644..100755
--- a/embeddedobj/source/commonembedding/persistence.cxx
+++ b/embeddedobj/source/commonembedding/persistence.cxx
@@ -228,11 +228,11 @@ static uno::Reference< util::XCloseable > CreateDocument( const uno::Reference<
}
catch( const uno::Exception& )
{
- // some of our embedded object implementations (in particular chart) do neither support
- // the EmbeddedObject, nor the EmbeddedScriptSupport argument. Also, they do not support
- // XInitialization, which means the default factory from cppuhelper will throw an
+ // if an embedded object implementation does not support XInitialization,
+ // the default factory from cppuhelper will throw an
// IllegalArgumentException when we try to create the instance with arguments.
// Okay, so we fall back to creating the instance without any arguments.
+ OSL_ASSERT("Consider implementing interface XInitialization to avoid duplicate construction");
xDocument = _rxFactory->createInstance( _rDocumentServiceName );
}
@@ -975,7 +975,21 @@ void SAL_CALL OCommonEmbeddedObject::setPersistentEntry(
if ( m_bWaitSaveCompleted )
{
if ( nEntryConnectionMode == embed::EntryInitModes::NO_INIT )
- saveCompleted( ( m_xParentStorage != xStorage || !m_aEntryName.equals( sEntName ) ) );
+ {
+ // saveCompleted is expected, handle it accordingly
+ if ( m_xNewParentStorage == xStorage && m_aNewEntryName.equals( sEntName ) )
+ {
+ saveCompleted( sal_True );
+ return;
+ }
+
+ // if a completely different entry is provided, switch first back to the old persistence in saveCompleted
+ // and then switch to the target persistence
+ sal_Bool bSwitchFurther = ( m_xParentStorage != xStorage || !m_aEntryName.equals( sEntName ) );
+ saveCompleted( sal_False );
+ if ( !bSwitchFurther )
+ return;
+ }
else
throw embed::WrongStateException(
::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "The object waits for saveCompleted() call!\n" )),