sfx2/inc/sfx2/docmacromode.hxx | 1 sfx2/source/doc/docmacromode.cxx | 33 ++++++++++++++++++----- 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, 104 insertions(+), 11 deletions(-)
New commits: commit d09fc8ef81a1a8fb1a746c415e0dd5d1331ac585 Author: Noel Power <[email protected]> Date: Fri Mar 1 17:02:49 2013 +0000 raise warning when saving macro laden doc as a macro-free format bnc#791777 Change-Id: Ic08c9ce669eb992b4dfc58fee1aa037eca6a10cc diff --git a/sfx2/inc/sfx2/docmacromode.hxx b/sfx2/inc/sfx2/docmacromode.hxx index a9f2a9d..80ece85 100644 --- a/sfx2/inc/sfx2/docmacromode.hxx +++ b/sfx2/inc/sfx2/docmacromode.hxx @@ -298,6 +298,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 3bcbf2d..04fb9b8 100644 --- a/sfx2/source/doc/docmacromode.cxx +++ b/sfx2/source/doc/docmacromode.cxx @@ -334,17 +334,12 @@ 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 ); - + // a library container exists; check if it's empty Reference< XVBACompatibility > xDocVBAMode( xContainer, UNO_QUERY ); sal_Bool bIsVBAMode = ( xDocVBAMode.is() && xDocVBAMode->getVBACompatibilityMode() ); if ( xContainer.is() ) @@ -384,6 +379,30 @@ namespace sfx2 } } } + } + catch( const Exception& ) + { + 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 ); + + Reference< XVBACompatibility > xDocVBAMode( xContainer, UNO_QUERY ); + sal_Bool bIsVBAMode = ( xDocVBAMode.is() && xDocVBAMode->getVBACompatibilityMode() ); + if ( bIsVBAMode && !bHasMacroLib && xScripts.is() ) { Reference< XLibraryContainer > xDlgContainer( xScripts->getDialogLibraries(), UNO_QUERY ); diff --git a/sfx2/source/doc/guisaveas.cxx b/sfx2/source/doc/guisaveas.cxx index 3231bde..85f3cab 100644 --- a/sfx2/source/doc/guisaveas.cxx +++ b/sfx2/source/doc/guisaveas.cxx @@ -87,6 +87,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 @@ -715,6 +722,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; @@ -762,6 +782,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? + rtl::OUString sXLSXFilter( RTL_CONSTASCII_USTRINGPARAM("Calc MS Excel 2007 XML") ); + rtl::OUString sOtherXLSXFilter( RTL_CONSTASCII_USTRINGPARAM("Calc Office Open XML") ); + bool bHasMacros = hasMacros( GetModel() ); + if ( bHasMacros && ( aFilterName == sXLSXFilter || aFilterName == sOtherXLSXFilter ) ) + { + uno::Reference< task::XInteractionHandler > xHandler; + GetMediaDescr()[ rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("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 c00572c..288a74d 100644 --- a/svtools/inc/svtools/sfxecode.hxx +++ b/svtools/inc/svtools/sfxecode.hxx @@ -85,7 +85,7 @@ #define ERRCODE_SFX_SHARED_NOPASSWORDCHANGE (ERRCODE_WARNING_MASK | ERRCODE_AREA_SFX | ERRCODE_CLASS_NONE | 54) #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_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 907b070..3f87e5f 100644 --- a/uui/source/iahndl.cxx +++ b/uui/source/iahndl.cxx @@ -833,11 +833,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 8e9d18e..8bfa058 100644 --- a/uui/source/ids.hrc +++ b/uui/source/ids.hrc @@ -161,7 +161,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 ad12f2c..7d89f20 100644 --- a/uui/source/ids.src +++ b/uui/source/ids.src @@ -41,7 +41,6 @@ String RID_SAVE_PASSWORD Text [ en-US ] = "~Remember password"; }; - String STR_WARNING_BROKENSIGNATURE_TITLE { Text [ en-US ] = "Invalid Document Signature" ; @@ -408,6 +407,10 @@ 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?"; + }; }; _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
