[Libreoffice-commits] core.git: sfx2/inc sfx2/source svtools/inc uui/source

Noel Power noel.power at suse.com
Fri Mar 1 09:12:55 PST 2013


 sfx2/inc/sfx2/docmacromode.hxx   |    1 
 sfx2/source/doc/docmacromode.cxx |   29 +++++++++++++++-----
 sfx2/source/doc/guisaveas.cxx    |   55 +++++++++++++++++++++++++++++++++++++++
 svtools/inc/svtools/sfxecode.hxx |    2 -
 uui/source/iahndl.cxx            |   17 +++++++++++-
 uui/source/ids.hrc               |    2 -
 uui/source/ids.src               |    5 ++-
 7 files changed, 100 insertions(+), 11 deletions(-)

New commits:
commit ec583253c3d761847c93a77fa10c065fc334fab9
Author: Noel Power <noel.power at suse.com>
Date:   Fri Mar 1 17:07:06 2013 +0000

    raise warning when saving macro laden doc as a macro-free format bnc#791777
    
    Change-Id: Ic947ceef71c86e31fbf0bce74b064aaf91f47178

diff --git a/sfx2/inc/sfx2/docmacromode.hxx b/sfx2/inc/sfx2/docmacromode.hxx
index 86bad08..1b5857f 100644
--- a/sfx2/inc/sfx2/docmacromode.hxx
+++ b/sfx2/inc/sfx2/docmacromode.hxx
@@ -287,6 +287,7 @@ namespace sfx2
         static sal_Bool
                 storageHasMacros( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& _rxStorage );
 
+        static sal_Bool containerHasBasicMacros( const ::com::sun::star::uno::Reference< ::com::sun::star::script::XLibraryContainer >& xContainter );
         /** checks the macro execution mode while loading the document.
 
             This must be called when the loading is effectively finished, but before any macro action
diff --git a/sfx2/source/doc/docmacromode.cxx b/sfx2/source/doc/docmacromode.cxx
index 999ab20..6f10507 100644
--- a/sfx2/source/doc/docmacromode.cxx
+++ b/sfx2/source/doc/docmacromode.cxx
@@ -318,17 +318,11 @@ namespace sfx2
     }
 
     //--------------------------------------------------------------------
-    sal_Bool DocumentMacroMode::hasMacroLibrary() const
+    sal_Bool DocumentMacroMode::containerHasBasicMacros( const Reference< XLibraryContainer >& xContainer )
     {
         sal_Bool bHasMacroLib = sal_False;
-#ifndef DISABLE_SCRIPTING
         try
         {
-            Reference< XEmbeddedScripts > xScripts( m_pData->m_rDocumentAccess.getEmbeddedDocumentScripts() );
-            Reference< XLibraryContainer > xContainer;
-            if ( xScripts.is() )
-                xContainer.set( xScripts->getBasicLibraries(), UNO_QUERY_THROW );
-
             if ( xContainer.is() )
             {
                 // a library container exists; check if it's empty
@@ -368,6 +362,27 @@ namespace sfx2
         {
             DBG_UNHANDLED_EXCEPTION();
         }
+        return bHasMacroLib;
+    }
+
+    //--------------------------------------------------------------------
+    sal_Bool DocumentMacroMode::hasMacroLibrary() const
+    {
+        sal_Bool bHasMacroLib = sal_False;
+#ifndef DISABLE_SCRIPTING
+        try
+        {
+            Reference< XEmbeddedScripts > xScripts( m_pData->m_rDocumentAccess.getEmbeddedDocumentScripts() );
+            Reference< XLibraryContainer > xContainer;
+            if ( xScripts.is() )
+                xContainer.set( xScripts->getBasicLibraries(), UNO_QUERY_THROW );
+            bHasMacroLib = containerHasBasicMacros( xContainer );
+
+        }
+        catch( const Exception& )
+        {
+            DBG_UNHANDLED_EXCEPTION();
+        }
 #endif
         return bHasMacroLib;
     }
diff --git a/sfx2/source/doc/guisaveas.cxx b/sfx2/source/doc/guisaveas.cxx
index 1b40a74..f94b809 100644
--- a/sfx2/source/doc/guisaveas.cxx
+++ b/sfx2/source/doc/guisaveas.cxx
@@ -79,6 +79,13 @@
 #include <sfxtypes.hxx>
 #include "alienwarn.hxx"
 
+#include <sfx2/docmacromode.hxx>
+#include <svx/svxerr.hxx>
+#include <comphelper/interaction.hxx>
+#include <com/sun/star/task/ErrorCodeRequest.hpp>
+#include <rtl/ref.hxx>
+#include <framework/interaction.hxx>
+#include <svtools/sfxecode.hxx>
 #include "../appl/app.hrc"
 
 // flags that specify requested operation
@@ -707,6 +714,19 @@ sal_Int8 ModelData_Impl::CheckStateForSave()
     return nResult;
 }
 
+sal_Bool hasMacros( const uno::Reference< frame::XModel >& xModel  )
+{
+    sal_Bool bHasMacros = sal_False;
+    uno::Reference< script::XLibraryContainer > xContainer;
+    uno::Reference< beans::XPropertySet > xProps( xModel, uno::UNO_QUERY );
+    if ( xProps.is() )
+    {
+        xProps->getPropertyValue( "BasicLibraries" ) >>= xContainer;
+        bHasMacros = sfx2::DocumentMacroMode::containerHasBasicMacros( xContainer );
+    }
+    return bHasMacros;
+}
+
 sal_Int8 ModelData_Impl::CheckFilter( const ::rtl::OUString& aFilterName )
 {
     ::comphelper::SequenceAsHashMap aFiltPropsHM;
@@ -754,6 +774,41 @@ sal_Int8 ModelData_Impl::CheckFilter( const ::rtl::OUString& aFilterName )
                                                     ::rtl::OUString() );
         if ( !aPreusedFilterName.equals( aFilterName ) && !aUIName.equals( aDefUIName ) )
         {
+            // is it possible to get these names from somewhere and not just
+            // hardcode them?
+            OUString sXLSXFilter("Calc MS Excel 2007 XML");
+            OUString sOtherXLSXFilter("Calc Office Open XML");
+            bool bHasMacros = hasMacros( GetModel() );
+            if ( bHasMacros && (  aFilterName == sXLSXFilter  ||  aFilterName == sOtherXLSXFilter ) )
+            {
+                uno::Reference< task::XInteractionHandler > xHandler;
+                GetMediaDescr()[ OUString( "InteractionHandler" ) ] >>= xHandler;
+                bool bResult = false;
+                if ( xHandler.is() )
+                {
+                    try
+                    {
+                        task::ErrorCodeRequest aErrorCode;
+                        aErrorCode.ErrCode = ERRCODE_SFX_VBASIC_CANTSAVE_STORAGE;
+
+                        uno::Any aRequest = uno::makeAny( aErrorCode );
+                        uno::Sequence< uno::Reference< task::XInteractionContinuation > > aContinuations( 2 );
+
+                        ::rtl::Reference< ::comphelper::OInteractionApprove > pApprove( new ::comphelper::OInteractionApprove );
+                        aContinuations[ 0 ] = pApprove.get();
+
+                        ::rtl::Reference< ::comphelper::OInteractionAbort > pAbort( new ::comphelper::OInteractionAbort );
+                        aContinuations[ 1 ] = pAbort.get();
+                        xHandler->handle(::framework::InteractionRequest::CreateRequest (aRequest,aContinuations));
+                        bResult = pApprove->wasSelected();
+                    }
+                    catch( const uno::Exception& )
+                    {
+                    }
+                    if ( !bResult )
+                        return STATUS_SAVEAS;
+                }
+            }
             if ( !SfxStoringHelper::WarnUnacceptableFormat( GetModel(), aUIName, aDefUIName, sal_True ) )
                 return STATUS_SAVEAS_STANDARDNAME;
         }
diff --git a/svtools/inc/svtools/sfxecode.hxx b/svtools/inc/svtools/sfxecode.hxx
index 7b31174..e5b4026 100644
--- a/svtools/inc/svtools/sfxecode.hxx
+++ b/svtools/inc/svtools/sfxecode.hxx
@@ -77,7 +77,7 @@
 #define ERRCODE_SFX_INCOMPLETE_ENCRYPTION    (ERRCODE_WARNING_MASK | ERRCODE_AREA_SFX | ERRCODE_CLASS_NONE | 55)
 #define ERRCODE_SFX_DOCUMENT_MACRO_DISABLED_MAC (ERRCODE_WARNING_MASK | ERRCODE_AREA_SFX | ERRCODE_CLASS_NONE | 56)
 #define ERRCODE_SFX_FORMAT_ROWCOL           (ERRCODE_AREA_SFX | ERRCODE_CLASS_NONE | 57)
-
+#define ERRCODE_SFX_VBASIC_CANTSAVE_STORAGE (ERRCODE_WARNING_MASK | ERRCODE_AREA_SFX | ERRCODE_CLASS_NONE | 58)
 
 
 //Dies und das
diff --git a/uui/source/iahndl.cxx b/uui/source/iahndl.cxx
index 3ad471b..9c42f2e 100644
--- a/uui/source/iahndl.cxx
+++ b/uui/source/iahndl.cxx
@@ -784,11 +784,26 @@ UUIInteractionHelper::handleRequest_impl(
         task::ErrorCodeRequest aErrorCodeRequest;
         if (aAnyRequest >>= aErrorCodeRequest)
         {
-            handleGenericErrorRequest( aErrorCodeRequest.ErrCode,
+            // Sucky special handling for xlsx macro filter warning
+            if ( (sal_uInt32)ERRCODE_SFX_VBASIC_CANTSAVE_STORAGE == (sal_uInt32)aErrorCodeRequest.ErrCode)
+            {
+                std::vector< rtl::OUString > aArguments;
+                handleErrorHandlerRequest( task::InteractionClassification_WARNING,
+                                       ERRCODE_UUI_IO_WARN_CANTSAVE_MACROS,
+                                       aArguments,
+                                       rRequest->getContinuations(),
+                                       bObtainErrorStringOnly,
+                                       bHasErrorString,
+                                       rErrorString);
+            }
+            else
+            {
+                handleGenericErrorRequest( aErrorCodeRequest.ErrCode,
                                        rRequest->getContinuations(),
                                        bObtainErrorStringOnly,
                                        bHasErrorString,
                                        rErrorString);
+            }
             return true;
         }
 
diff --git a/uui/source/ids.hrc b/uui/source/ids.hrc
index ae175e8..00ce50c 100644
--- a/uui/source/ids.hrc
+++ b/uui/source/ids.hrc
@@ -137,7 +137,7 @@
 #define ERRCODE_UUI_LOCKING_NOT_LOCKED                          (ERRCODE_AREA_UUI + 61)
 #define ERRCODE_UUI_LOCKING_LOCK_EXPIRED                        (ERRCODE_AREA_UUI + 62)
 #define ERRCODE_UUI_CANNOT_ACTIVATE_FACTORY                     (ERRCODE_AREA_UUI + 63)
-
+#define ERRCODE_UUI_IO_WARN_CANTSAVE_MACROS                     (ERRCODE_WARNING_MASK | ( ERRCODE_AREA_UUI + 64))
 #define ERRCODE_AREA_UUI_UNKNOWNAUTH    25000
 #define SSLWARN_TYPE_DOMAINMISMATCH     10
 #define SSLWARN_TYPE_EXPIRED            20
diff --git a/uui/source/ids.src b/uui/source/ids.src
index 2446264..3f78df7 100644
--- a/uui/source/ids.src
+++ b/uui/source/ids.src
@@ -30,7 +30,6 @@ String RID_SAVE_PASSWORD
     Text [ en-US ] = "~Remember password";
 };
 
-
 String STR_WARNING_BROKENSIGNATURE_TITLE
 {
     Text [ en-US ] = "Invalid Document Signature" ;
@@ -397,5 +396,9 @@ Resource RID_UUI_ERRHDL
         Text [ en-US ] = "Component cannot be loaded, possibly broken or incomplete installation.\nFull error message:\n\n $(ARG1).";
     };
 
+    String (ERRCODE_UUI_IO_WARN_CANTSAVE_MACROS & ERRCODE_RES_MASK)
+    {
+        Text [ en-US ] = "You are saving to a macro-free document format, the macros contained in this document will not be saved.\nDo you wish to continue?";
+    };
 
 };


More information about the Libreoffice-commits mailing list