[Libreoffice-commits] core.git: Branch 'ports/macosx10.5/master' - comphelper/source embeddedobj/source sfx2/source

Douglas Mencken dougmencken at gmail.com
Sat Oct 24 08:34:25 UTC 2015


Rebased ref, commits from common ancestor:
commit 8ac9ac5016436e08609b4c183725729680739dbd
Author: Douglas Mencken <dougmencken at gmail.com>
Date:   Wed Oct 21 16:50:40 2015 -0400

    Fix “Guía problem”
    
    “Guía problem” is actually an unability (i.e. crash) to add new formula
    or to open existing file with formulas ...
    
    ... terminate called after throwing an instance of 'com::sun::star::uno::RuntimeException'
    program received signal SIGABRT, aborted
    b a c k t r a c e
     0  __kill
     1  abort
    ...
     5  __cxa_throw
     6  com::sun::star::uno::BaseReference::iquery_throw
     7  SfxObjectShell::SetupStorage
     8  SfxBaseModel::storeToStorage
     9  OCommonEmbeddedObject::StoreDocToStorage_Impl
    10  OCommonEmbeddedObject::storeAsEntry
    11  comphelper::EmbeddedObjectContainer::StoreEmbeddedObject
    12  comphelper::EmbeddedObjectContainer::InsertEmbeddedObject
    ...
    
    Fantastically enough that exception cannot be caught even with `catch (...)'
    
    What's interesting introduced by this patch
    
    • make ``uno::Reference< beans::XPropertySet > xProps( xStorage, uno::UNO_QUERY );''
      not to be a first line in SfxObjectShell::SetupStorage
    
    • add SAL_INFOs to know how the code flows
    
    • use `catch ( ... )' here and there
    
    • don't throw exceptions from OStorageHelper::GetXStorageFormat in the case when
      media type returned from xStorProps->getPropertyValue("MediaType") is empty
    
    • `return' instead of throwing an exception for the case when `!xStorage.is()'
      in OCommonEmbeddedObject::StoreDocToStorage_Impl
    
    Change-Id: I1241518a7ce87f68da71655f6f7f0a9ab9cb6bdb

diff --git a/comphelper/source/container/embeddedobjectcontainer.cxx b/comphelper/source/container/embeddedobjectcontainer.cxx
index caa2d25..c8e2fa1 100644
--- a/comphelper/source/container/embeddedobjectcontainer.cxx
+++ b/comphelper/source/container/embeddedobjectcontainer.cxx
@@ -467,6 +467,8 @@ bool EmbeddedObjectContainer::StoreEmbeddedObject(
     const uno::Reference < embed::XEmbeddedObject >& xObj, OUString& rName, bool bCopy,
     const OUString& rSrcShellID, const OUString& rDestShellID )
 {
+    SAL_INFO( "comphelper.container", "entering >>EmbeddedObjectContainer::StoreEmbeddedObject<<" );
+
     uno::Reference < embed::XEmbedPersist > xPersist( xObj, uno::UNO_QUERY );
     if ( rName.isEmpty() )
         rName = CreateUniqueObjectName();
@@ -500,9 +502,9 @@ bool EmbeddedObjectContainer::StoreEmbeddedObject(
             }
         }
     }
-    catch (uno::Exception const& e)
+    catch ( uno::Exception const& ex )
     {
-        SAL_WARN("comphelper.container", "EmbeddedObjectContainer::StoreEmbeddedObject: exception caught: " << e.Message);
+        SAL_WARN( "comphelper.container", "EmbeddedObjectContainer::StoreEmbeddedObject: exception caught: " << ex.Message );
         // TODO/LATER: better error recovery should keep storage intact
         return false;
     }
@@ -512,6 +514,8 @@ bool EmbeddedObjectContainer::StoreEmbeddedObject(
 
 bool EmbeddedObjectContainer::InsertEmbeddedObject( const uno::Reference < embed::XEmbeddedObject >& xObj, OUString& rName )
 {
+    SAL_INFO( "comphelper.container", "entering >>bool EmbeddedObjectContainer::InsertEmbeddedObject( const uno::Reference < embed::XEmbeddedObject >& xObj, OUString& rName )<<" );
+
     // store it into the container storage
     if (StoreEmbeddedObject(xObj, rName, false, OUString(), OUString()))
     {
@@ -519,12 +523,14 @@ bool EmbeddedObjectContainer::InsertEmbeddedObject( const uno::Reference < embed
         AddEmbeddedObject( xObj, rName );
         return true;
     }
-    else
-        return false;
+
+    return false;
 }
 
 uno::Reference < embed::XEmbeddedObject > EmbeddedObjectContainer::InsertEmbeddedObject( const uno::Reference < io::XInputStream >& xStm, OUString& rNewName )
 {
+    SAL_INFO( "comphelper.container", "entering >>uno::Reference < embed::XEmbeddedObject > EmbeddedObjectContainer::InsertEmbeddedObject( const uno::Reference < io::XInputStream >& xStm, OUString& rNewName )<<" );
+
     if ( rNewName.isEmpty() )
         rNewName = CreateUniqueObjectName();
 
@@ -585,6 +591,8 @@ uno::Reference < embed::XEmbeddedObject > EmbeddedObjectContainer::InsertEmbedde
 
 uno::Reference < embed::XEmbeddedObject > EmbeddedObjectContainer::InsertEmbeddedObject( const css::uno::Sequence < css::beans::PropertyValue >& aMedium, OUString& rNewName )
 {
+    SAL_INFO( "comphelper.container", "entering >>uno::Reference < embed::XEmbeddedObject > EmbeddedObjectContainer::InsertEmbeddedObject( const css::uno::Sequence < css::beans::PropertyValue >& aMedium, OUString& rNewName )<<" );
+
     if ( rNewName.isEmpty() )
         rNewName = CreateUniqueObjectName();
 
diff --git a/comphelper/source/misc/storagehelper.cxx b/comphelper/source/misc/storagehelper.cxx
index b2fe5d9..95d386f 100644
--- a/comphelper/source/misc/storagehelper.cxx
+++ b/comphelper/source/misc/storagehelper.cxx
@@ -231,11 +231,19 @@ sal_Int32 OStorageHelper::GetXStorageFormat(
             const uno::Reference< embed::XStorage >& xStorage )
         throw ( uno::Exception, std::exception )
 {
+    SAL_INFO( "comphelper.misc", "entering >>OStorageHelper::GetXStorageFormat<<" );
+
     uno::Reference< beans::XPropertySet > xStorProps( xStorage, uno::UNO_QUERY_THROW );
 
     OUString aMediaType;
     xStorProps->getPropertyValue("MediaType") >>= aMediaType;
 
+    if ( aMediaType.getLength() == 0 )
+    {
+        // media type is empty '' string
+        return SOFFICE_FILEFORMAT_CURRENT;
+    }
+
     sal_Int32 nResult = 0;
 
     // TODO/LATER: the filter configuration could be used to detect it later, or batter a special service
@@ -278,13 +286,18 @@ sal_Int32 OStorageHelper::GetXStorageFormat(
     else
     {
         // the mediatype is not known
-        OUString aMsg(BOOST_CURRENT_FUNCTION);
-        aMsg += ":";
-        aMsg += OUString::number(__LINE__);
-        aMsg += ": unknown media type '";
-        aMsg += aMediaType;
-        aMsg += "'";
-        throw beans::IllegalTypeException(aMsg);
+        OUString msg(BOOST_CURRENT_FUNCTION);
+        msg += ":";
+        msg += OUString::number(__LINE__);
+        //msg += ": unknown media type '";
+        //msg += aMediaType;
+        //msg += "'";
+        OString oMediaType = OUStringToOString( aMediaType, RTL_TEXTENCODING_ASCII_US );
+        SAL_INFO( "comphelper.misc",
+                  msg << ": unknown media type" <<
+                  " \'" << oMediaType.pData->buffer << "\'" );
+        // assume it fits to format which is used now
+        return SOFFICE_FILEFORMAT_CURRENT;
     }
 
     return nResult;
diff --git a/embeddedobj/source/commonembedding/persistence.cxx b/embeddedobj/source/commonembedding/persistence.cxx
index 5b84c98..0df19ba 100644
--- a/embeddedobj/source/commonembedding/persistence.cxx
+++ b/embeddedobj/source/commonembedding/persistence.cxx
@@ -754,10 +754,13 @@ void OCommonEmbeddedObject::StoreDocToStorage_Impl(
     const OUString& aHierarchName,
     bool bAttachToTheStorage )
 {
-    SAL_WARN_IF( !xStorage.is(), "embeddedobj.common", "No storage is provided for storing!" );
+    SAL_INFO( "embeddedobj.common", "entering >>OCommonEmbeddedObject::StoreDocToStorage_Impl<<" );
 
     if ( !xStorage.is() )
-        throw uno::RuntimeException(); // TODO:
+    {
+        SAL_WARN( "embeddedobj.common", "No storage is provided for storing" );
+        return; // just return enjoying the silence
+    }
 
     uno::Reference< document::XStorageBasedDocument > xDoc;
     {
@@ -792,7 +795,12 @@ void OCommonEmbeddedObject::StoreDocToStorage_Impl(
         aArgs[4].Name = "DestinationShellID";
         aArgs[4].Value <<= getStringPropertyValue(rObjArgs, "DestinationShellID");
 
-        xDoc->storeToStorage( xStorage, aArgs );
+        try
+        {
+            xDoc->storeToStorage( xStorage, aArgs );
+        }
+        catch ( ... ) { }
+
         if ( bAttachToTheStorage )
             SwitchDocToStorage_Impl( xDoc, xStorage );
     }
@@ -1162,6 +1170,8 @@ void SAL_CALL OCommonEmbeddedObject::storeToEntry( const uno::Reference< embed::
                 uno::Exception,
                 uno::RuntimeException, std::exception )
 {
+    SAL_INFO( "embeddedobj.common", "entering >>OCommonEmbeddedObject::storeToEntry<<" );
+
     ::osl::ResettableMutexGuard aGuard( m_aMutex );
     if ( m_bDisposed )
         throw lang::DisposedException(); // TODO
@@ -1293,6 +1303,8 @@ void SAL_CALL OCommonEmbeddedObject::storeAsEntry( const uno::Reference< embed::
                 uno::Exception,
                 uno::RuntimeException, std::exception )
 {
+    SAL_INFO( "embeddedobj.common", "entering >>OCommonEmbeddedObject::storeAsEntry<<" );
+
     // TODO: use lObjArgs
 
     ::osl::ResettableMutexGuard aGuard( m_aMutex );
diff --git a/sfx2/source/doc/objstor.cxx b/sfx2/source/doc/objstor.cxx
index d9c733e..f7212eb 100644
--- a/sfx2/source/doc/objstor.cxx
+++ b/sfx2/source/doc/objstor.cxx
@@ -338,94 +338,97 @@ SotClipboardFormatId GetChartVersion( sal_Int32 nVersion, bool bTemplate )
 void SfxObjectShell::SetupStorage( const uno::Reference< embed::XStorage >& xStorage,
                                    sal_Int32 nVersion, bool bTemplate, bool bChart ) const
 {
-    uno::Reference< beans::XPropertySet > xProps( xStorage, uno::UNO_QUERY );
+    SAL_INFO( "sfx2.doc", "entering >>SfxObjectShell::SetupStorage<<" );
 
-    if ( xProps.is() )
-    {
-        SvGlobalName aName;
-        OUString aFullTypeName, aShortTypeName, aAppName;
-        SotClipboardFormatId nClipFormat = SotClipboardFormatId::NONE;
+    SvGlobalName aName;
+    OUString aFullTypeName, aShortTypeName, aAppName;
+    SotClipboardFormatId nClipFormat = GetChartVersion( nVersion, bTemplate ); //SotClipboardFormatId::NONE;
 
-        if(!bChart)
-            FillClass( &aName, &nClipFormat, &aAppName, &aFullTypeName, &aShortTypeName, nVersion, bTemplate );
-        else
-            nClipFormat = GetChartVersion(nVersion, bTemplate);
+    if (!bChart)
+    {
+        FillClass( &aName, &nClipFormat, &aAppName, &aFullTypeName, &aShortTypeName, nVersion, bTemplate );
+    }
 
-        if ( nClipFormat != SotClipboardFormatId::NONE )
+    if ( nClipFormat != SotClipboardFormatId::NONE )
+    {
+        // basic doesn't have a ClipFormat
+        // without MediaType the storage is not really usable, but currently the BasicIDE still
+        // is an SfxObjectShell and so we can't take this as an error
+        datatransfer::DataFlavor aDataFlavor;
+        SotExchange::GetFormatDataFlavor( nClipFormat, aDataFlavor );
+        if ( !aDataFlavor.MimeType.isEmpty() )
         {
-            // basic doesn't have a ClipFormat
-            // without MediaType the storage is not really usable, but currently the BasicIDE still
-            // is an SfxObjectShell and so we can't take this as an error
-            datatransfer::DataFlavor aDataFlavor;
-            SotExchange::GetFormatDataFlavor( nClipFormat, aDataFlavor );
-            if ( !aDataFlavor.MimeType.isEmpty() )
+            uno::Reference< beans::XPropertySet > xProps( xStorage, uno::UNO_QUERY );
+            if ( !xProps.is() ) return;
+
+            try
             {
-                try
-                {
-                    xProps->setPropertyValue("MediaType", uno::makeAny( aDataFlavor.MimeType ) );
-                }
-                catch( uno::Exception& )
-                {
-                    const_cast<SfxObjectShell*>( this )->SetError( ERRCODE_IO_GENERAL, OUString( OSL_LOG_PREFIX  ) );
-                }
+                xProps->setPropertyValue("MediaType", uno::makeAny( aDataFlavor.MimeType ) );
+            }
+            catch( ... )
+            {
+                const_cast<SfxObjectShell*>( this )->SetError( ERRCODE_IO_GENERAL, OUString( OSL_LOG_PREFIX  ) );
+            }
 
-                SvtSaveOptions::ODFDefaultVersion nDefVersion = SvtSaveOptions::ODFVER_012;
-                bool bUseSHA1InODF12 = false;
-                bool bUseBlowfishInODF12 = false;
+            SvtSaveOptions::ODFDefaultVersion nDefVersion = SvtSaveOptions::ODFVER_012;
+            bool bUseSHA1InODF12 = false;
+            bool bUseBlowfishInODF12 = false;
 
-                if (!utl::ConfigManager::IsAvoidConfig())
-                {
-                    SvtSaveOptions aSaveOpt;
-                    nDefVersion = aSaveOpt.GetODFDefaultVersion();
-                    bUseSHA1InODF12 = aSaveOpt.IsUseSHA1InODF12();
-                    bUseBlowfishInODF12 = aSaveOpt.IsUseBlowfishInODF12();
-                }
+            if (!utl::ConfigManager::IsAvoidConfig())
+            {
+                SvtSaveOptions aSaveOpt;
+                nDefVersion = aSaveOpt.GetODFDefaultVersion();
+                bUseSHA1InODF12 = aSaveOpt.IsUseSHA1InODF12();
+                bUseBlowfishInODF12 = aSaveOpt.IsUseBlowfishInODF12();
+            }
 
-                uno::Sequence< beans::NamedValue > aEncryptionAlgs( 3 );
-                aEncryptionAlgs[0].Name = "StartKeyGenerationAlgorithm";
-                aEncryptionAlgs[1].Name = "EncryptionAlgorithm";
-                aEncryptionAlgs[2].Name = "ChecksumAlgorithm";
-                // the default values, that should be used for ODF1.1 and older formats
-                aEncryptionAlgs[0].Value <<= xml::crypto::DigestID::SHA1;
-                aEncryptionAlgs[1].Value <<= xml::crypto::CipherID::BLOWFISH_CFB_8;
-                aEncryptionAlgs[2].Value <<= xml::crypto::DigestID::SHA1_1K;
+            uno::Sequence< beans::NamedValue > aEncryptionAlgs( 3 );
+            aEncryptionAlgs[0].Name = "StartKeyGenerationAlgorithm";
+            aEncryptionAlgs[1].Name = "EncryptionAlgorithm";
+            aEncryptionAlgs[2].Name = "ChecksumAlgorithm";
+            // the default values, that should be used for ODF1.1 and older formats
+            aEncryptionAlgs[0].Value <<= xml::crypto::DigestID::SHA1;
+            aEncryptionAlgs[1].Value <<= xml::crypto::CipherID::BLOWFISH_CFB_8;
+            aEncryptionAlgs[2].Value <<= xml::crypto::DigestID::SHA1_1K;
 
-                if ( nDefVersion >= SvtSaveOptions::ODFVER_012 )
+            if ( nDefVersion >= SvtSaveOptions::ODFVER_012 )
+            {
+                try
                 {
-                    try
-                    {
-                        // older versions can not have this property set, it exists only starting from ODF1.2
-                        xProps->setPropertyValue("Version", uno::makeAny<OUString>( ODFVER_012_TEXT ) );
-                    }
-                    catch( uno::Exception& )
-                    {
-                    }
-
-                    if ( !bUseSHA1InODF12 && nDefVersion != SvtSaveOptions::ODFVER_012_EXT_COMPAT )
-                    {
-                        aEncryptionAlgs[0].Value <<= xml::crypto::DigestID::SHA256;
-                        aEncryptionAlgs[2].Value <<= xml::crypto::DigestID::SHA256_1K;
-                    }
-                    if ( !bUseBlowfishInODF12 && nDefVersion != SvtSaveOptions::ODFVER_012_EXT_COMPAT )
-                        aEncryptionAlgs[1].Value <<= xml::crypto::CipherID::AES_CBC_W3C_PADDING;
+                    // older versions can not have this property set, it exists only starting from ODF1.2
+                    xProps->setPropertyValue("Version", uno::makeAny<OUString>( ODFVER_012_TEXT ) );
                 }
-
-                try
+                catch( ... )
                 {
-                    // set the encryption algorithms accordingly;
-                    // the setting does not trigger encryption,
-                    // it just provides the format for the case that contents should be encrypted
-                    uno::Reference< embed::XEncryptionProtectedStorage > xEncr( xStorage, uno::UNO_QUERY_THROW );
-                    xEncr->setEncryptionAlgorithms( aEncryptionAlgs );
                 }
-                catch( uno::Exception& )
+
+                if ( !bUseSHA1InODF12 && nDefVersion != SvtSaveOptions::ODFVER_012_EXT_COMPAT )
                 {
-                    const_cast<SfxObjectShell*>( this )->SetError( ERRCODE_IO_GENERAL, OUString( OSL_LOG_PREFIX  ) );
+                    aEncryptionAlgs[0].Value <<= xml::crypto::DigestID::SHA256;
+                    aEncryptionAlgs[2].Value <<= xml::crypto::DigestID::SHA256_1K;
                 }
+                if ( !bUseBlowfishInODF12 && nDefVersion != SvtSaveOptions::ODFVER_012_EXT_COMPAT )
+                    aEncryptionAlgs[1].Value <<= xml::crypto::CipherID::AES_CBC_W3C_PADDING;
+            }
 
+            try
+            {
+                // set the encryption algorithms accordingly;
+                // the setting does not trigger encryption,
+                // it just provides the format for the case that contents should be encrypted
+                uno::Reference< embed::XEncryptionProtectedStorage > xEncr( xStorage, uno::UNO_QUERY_THROW );
+                xEncr->setEncryptionAlgorithms( aEncryptionAlgs );
+            }
+            catch( ... )
+            {
+                const_cast<SfxObjectShell*>( this )->SetError( ERRCODE_IO_GENERAL, OUString( OSL_LOG_PREFIX  ) );
             }
+
         }
     }
+
+    //SAL_INFO( "sfx2.doc", "leaving >>SfxObjectShell::SetupStorage<<" );
+    return;
 }
 
 
diff --git a/sfx2/source/doc/sfxbasemodel.cxx b/sfx2/source/doc/sfxbasemodel.cxx
index 5263318..859f099 100644
--- a/sfx2/source/doc/sfxbasemodel.cxx
+++ b/sfx2/source/doc/sfxbasemodel.cxx
@@ -3763,6 +3763,8 @@ void SAL_CALL SfxBaseModel::storeToStorage( const Reference< embed::XStorage >&
             Exception,
             RuntimeException, std::exception )
 {
+    SAL_INFO( "sfx2.doc", "entering >>SfxBaseModel::storeToStorage<<" );
+
     SfxModelGuard aGuard( *this );
 
     Reference< embed::XStorage > xResult;
@@ -3789,11 +3791,13 @@ void SAL_CALL SfxBaseModel::storeToStorage( const Reference< embed::XStorage >&
         // storing to the own storage
         bSuccess = m_pData->m_pObjectShell->DoSave();
     }
-    else
+    else /* xStorage != m_pData->m_pObjectShell->GetStorage() */
     {
         // TODO/LATER: if the provided storage has some data inside the storing might fail, probably the storage must be truncated
         // TODO/LATER: is it possible to have a template here?
-        m_pData->m_pObjectShell->SetupStorage( xStorage, nVersion, false );
+        try {
+            m_pData->m_pObjectShell->SetupStorage( xStorage, nVersion, false );
+        } catch ( ... ) { }
 
         // BaseURL is part of the ItemSet
         SfxMedium aMedium( xStorage, OUString(), &aSet );
@@ -3814,8 +3818,8 @@ void SAL_CALL SfxBaseModel::storeToStorage( const Reference< embed::XStorage >&
     {
         nError = nError ? nError : ERRCODE_IO_GENERAL;
         throw task::ErrorCodeIOException(
-            "SfxBaseModel::storeToStorage: 0x" + OUString::number(nError, 16),
-            Reference< XInterface >(), nError);
+            "SfxBaseModel::storeToStorage: $" + OUString::number(nError, 16),
+            Reference< XInterface >(), nError );
     }
 }
 


More information about the Libreoffice-commits mailing list