From 861b9d44d1ad956f621a6fa77d61f2baaa65e6e8 Mon Sep 17 00:00:00 2001 From: Noel Power Date: Fri, 1 Mar 2013 17:07:06 +0000 Subject: raise warning when saving macro laden doc as a macro-free format bnc#791777 Change-Id: Ic947ceef71c86e31fbf0bce74b064aaf91f47178 (cherry picked from commit ec583253c3d761847c93a77fa10c065fc334fab9) --- 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(-) diff --git a/sfx2/inc/sfx2/docmacromode.hxx b/sfx2/inc/sfx2/docmacromode.hxx index 86bad086ac7b..1b5857f8ae43 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 999ab2076aa5..6f105075b0a4 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 c6af31615da8..6748973d22f7 100644 --- a/sfx2/source/doc/guisaveas.cxx +++ b/sfx2/source/doc/guisaveas.cxx @@ -79,6 +79,13 @@ #include #include "alienwarn.hxx" +#include +#include +#include +#include +#include +#include +#include #include "../appl/app.hrc" // flags that specify requested operation @@ -706,6 +713,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; @@ -753,6 +773,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 7b31174bf341..e5b4026a0ec0 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 92db8392eb4c..4414ba6639f8 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 8803ffe83051..49c11559d30c 100644 --- a/uui/source/ids.hrc +++ b/uui/source/ids.hrc @@ -139,7 +139,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 244626477668..3f78df786b93 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?"; + }; }; -- cgit v1.2.3