[Libreoffice-commits] core.git: Branch 'distro/suse/suse-3.6' - sfx2/inc sfx2/source svtools/inc uui/source
Noel Power
noel.power at suse.com
Fri Mar 1 09:03:19 PST 2013
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 <noel.power at suse.com>
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?";
+ };
};
More information about the Libreoffice-commits
mailing list