summaryrefslogtreecommitdiff
path: root/patches/src680/sfx2-pre-and-postprocess-during-save-load.diff
diff options
context:
space:
mode:
Diffstat (limited to 'patches/src680/sfx2-pre-and-postprocess-during-save-load.diff')
-rw-r--r--patches/src680/sfx2-pre-and-postprocess-during-save-load.diff201
1 files changed, 201 insertions, 0 deletions
diff --git a/patches/src680/sfx2-pre-and-postprocess-during-save-load.diff b/patches/src680/sfx2-pre-and-postprocess-during-save-load.diff
new file mode 100644
index 000000000..80ada0299
--- /dev/null
+++ b/patches/src680/sfx2-pre-and-postprocess-during-save-load.diff
@@ -0,0 +1,201 @@
+--- sfx2/source/doc/objstor.cxx.old 2006-11-30 20:14:51.000000000 +0100
++++ sfx2/source/doc/objstor.cxx 2006-11-30 20:15:04.000000000 +0100
+@@ -39,6 +39,9 @@
+ #ifndef _SFXENUMITEM_HXX //autogen
+ #include <svtools/eitem.hxx>
+ #endif
++#ifndef _SVTOOLS_CMDPARSE_HXX
++#include <svtools/cmdparse.hxx>
++#endif
+ #ifndef _SFXSTRITEM_HXX //autogen
+ #include <svtools/stritem.hxx>
+ #endif
+@@ -200,6 +203,9 @@
+ #include <vcl/bitmapex.hxx>
+ #include <svtools/embedhlp.hxx>
+ #include <rtl/logfile.hxx>
++#include <com/sun/star/util/XMacroExpander.hpp>
++#include <osl/file.hxx>
++#include <osl/process.h>
+
+ #include "app.hxx"
+ #include "objsh.hxx"
+@@ -246,6 +252,70 @@ using namespace ::cppu;
+
+ namespace css = ::com::sun::star;
+
++
++static sal_Bool invokeExternalApp(String aAppName, ::rtl::OUString sourceParam, ::rtl::OUString targetParam)
++{
++ static const char SOURCE_WILDCARD_CONST[]="%source%";
++ static const char TARGET_WILDCARD_CONST[]="%target%";
++ // get macro expansion
++ uno::Reference< XMultiServiceFactory> xMS(::comphelper::getProcessServiceFactory(), UNO_QUERY);
++ uno::Reference< beans::XPropertySet > xProps(xMS, UNO_QUERY);
++ uno::Reference< XComponentContext > xContext(xProps->getPropertyValue(rtl::OUString::createFromAscii("DefaultContext")), UNO_QUERY);
++ uno::Reference< util::XMacroExpander > xExpander(xContext->getValueByName(::rtl::OUString::createFromAscii("/singletons/com.sun.star.util.theMacroExpander")), UNO_QUERY);
++
++ // parse preprocessing arguments
++ int c=aAppName.GetQuotedTokenCount('\"',',');
++ if (c<1) return sal_False;
++ rtl_uString **args=new rtl_uString*[c];
++ for(int i=0;i<c;i++) {
++ String aArg=aAppName.GetQuotedToken(i,'\"',',');
++ static const char EXPAND_WILDCARD_CONST[] ="vnd.sun.star.expand:";
++ if (aArg.EqualsIgnoreCaseAscii(EXPAND_WILDCARD_CONST, 0, strlen(EXPAND_WILDCARD_CONST))) {
++ rtl::OUString argStr(aArg.GetBuffer()+20);
++ aArg=xExpander->expandMacros(argStr);
++ } else if (aArg.EqualsIgnoreCaseAscii(SOURCE_WILDCARD_CONST, 0, strlen(SOURCE_WILDCARD_CONST))) {
++ aArg=sourceParam;
++ } else if (aArg.EqualsIgnoreCaseAscii(TARGET_WILDCARD_CONST, 0, strlen(TARGET_WILDCARD_CONST))) {
++ aArg=targetParam;
++ }
++ rtl::OUString s(aArg);
++ args[i]=rtl::OUString(aArg).pData;
++ rtl_uString_acquire(args[i]);
++ }
++
++ sal_Bool bOk=sal_True;
++
++ // invoke processing step
++ oslProcess pProcess=NULL;
++ oslProcessError error=osl_executeProcess(
++ args[0],
++ args+1,
++ c-1,
++ /*osl_Process_NORMAL*/ osl_Process_HIDDEN,
++ 0,
++ NULL,
++ NULL,
++ 0,
++ &pProcess
++ );
++ bOk &= error==osl_Process_E_None;
++ error = osl_joinProcess( pProcess );
++ bOk &= error==osl_Process_E_None;
++ oslProcessInfo aProcessInfo;
++ aProcessInfo.Size= sizeof(aProcessInfo);
++ error = osl_getProcessInfo( pProcess, osl_Process_EXITCODE, &aProcessInfo );
++ bOk &= error==osl_Process_E_None;
++ osl_freeProcessHandle(pProcess);
++
++ for(int i=0;i<c;i++) {
++ rtl_uString_release(args[i]);
++ }
++ delete[] args;
++
++ return bOk;
++}
++
++
+ //=========================================================================
+ void impl_addToModelCollection(const css::uno::Reference< css::frame::XModel >& xModel)
+ {
+@@ -833,7 +903,50 @@ sal_Bool SfxObjectShell::DoLoad( SfxMedi
+ {
+ pImp->nLoadedFlags = 0;
+ pImp->bModelInitialized = sal_False;
+- bOk = xStorage.is() && LoadOwnFormat( *pMed );
++ String aUserData=pFilter->GetUserData();
++ // check whether a prepocessing step is requested in the configuration
++ static const char PREPROCESS_CONST[]="Preprocess=<";
++ int pos=aUserData.Search(::rtl::OUString::createFromAscii(PREPROCESS_CONST).getStr(), 0);
++ int end=aUserData.Search( '>', pos+strlen(PREPROCESS_CONST));
++ if (pos!=STRING_NOTFOUND && end!=STRING_NOTFOUND) {
++ String aAppName(aUserData, pos+strlen(PREPROCESS_CONST), end-(pos+strlen(PREPROCESS_CONST)));
++
++ // setup status bar
++ SfxItemSet *pSet = pMed->GetItemSet();
++ const SfxUnoAnyItem *pItem=NULL;
++ SfxItemState ret=pSet->GetItemState( SID_PROGRESS_STATUSBAR_CONTROL, TRUE, (const SfxPoolItem**)&pItem);
++ Reference< ::com::sun::star::task::XStatusIndicator > xStatusIndicator;
++ if (ret==SFX_ITEM_SET && pItem!=NULL)
++ {
++ pItem->GetValue() >>= xStatusIndicator;
++ if (xStatusIndicator.is()) {
++ xStatusIndicator->start(::rtl::OUString::createFromAscii("Preprocessing ")+rtl::OUString(aAppName), 1);
++ xStatusIndicator->setValue(1);
++ }
++ }
++ // create a copy
++ SfxMedium myMed(*pMed, sal_True);
++
++ // get macro expansion
++ uno::Reference< XMultiServiceFactory> xMS(::comphelper::getProcessServiceFactory(), UNO_QUERY);
++ uno::Reference< beans::XPropertySet > xProps(xMS, UNO_QUERY);
++ uno::Reference< XComponentContext > xContext(xProps->getPropertyValue(rtl::OUString::createFromAscii("DefaultContext")), UNO_QUERY);
++ uno::Reference< util::XMacroExpander > xExpander(xContext->getValueByName(::rtl::OUString::createFromAscii("/singletons/com.sun.star.util.theMacroExpander")), UNO_QUERY);
++
++ bOk = invokeExternalApp(aAppName, ::rtl::OUString(pMed->GetPhysicalName()), ::rtl::OUString(myMed.GetPhysicalName()));
++
++ // clear status bar
++ if (xStatusIndicator.is()) {
++ xStatusIndicator->end();
++ }
++
++ // load from copy
++ if (bOk) {
++ bOk = xStorage.is() && LoadOwnFormat( myMed );
++ }
++ } else {
++ bOk = xStorage.is() && LoadOwnFormat( *pMed );
++ }
+ if ( bOk )
+ {
+ SfxDocumentInfo& rDocInfo = GetDocInfo();
+@@ -1213,6 +1326,7 @@ void Lock_Impl( SfxObjectShell* pDoc, BO
+
+ }
+
++
+ //-------------------------------------------------------------------------
+
+ sal_Bool SfxObjectShell::SaveTo_Impl
+@@ -1778,6 +1892,47 @@ sal_Bool SfxObjectShell::SaveTo_Impl
+ }
+ }
+
++ if (bOk) {
++ String aUserData=pFilter->GetUserData();
++ // check whether a postprocessing step is requested in the configuration
++ static const char POSTPROCESS_CONST[]="Postprocess=<";
++ int pos=aUserData.Search(::rtl::OUString::createFromAscii(POSTPROCESS_CONST).getStr(), 0);
++ int end=aUserData.Search( '>', pos+strlen(POSTPROCESS_CONST));
++ if (pos!=STRING_NOTFOUND && end!=STRING_NOTFOUND) {
++ String aAppName(aUserData, pos+strlen(POSTPROCESS_CONST), end-(pos+strlen(POSTPROCESS_CONST)));
++
++ // setup status bar
++ SfxItemSet *pSet = rMedium.GetItemSet();
++ const SfxUnoAnyItem *pItem=NULL;
++ SfxItemState ret=pSet->GetItemState( SID_PROGRESS_STATUSBAR_CONTROL, TRUE, (const SfxPoolItem**)&pItem);
++ Reference< ::com::sun::star::task::XStatusIndicator > xStatusIndicator;
++ if (ret==SFX_ITEM_SET && pItem!=NULL)
++ {
++ pItem->GetValue() >>= xStatusIndicator;
++ if (xStatusIndicator.is()) {
++ xStatusIndicator->start(::rtl::OUString::createFromAscii("Postprocessing ")+rtl::OUString(aAppName), 1);
++ xStatusIndicator->setValue(1);
++ }
++ }
++
++ // create copy
++ ::rtl::OUString aTmpVersionURL = CreateTempCopyOfStorage_Impl( rMedium.GetStorage() );
++ rMedium.Close();
++
++ rtl::OUString sourceParam;
++ osl::FileBase::getSystemPathFromFileURL(aTmpVersionURL, sourceParam);
++ bOk &=invokeExternalApp(aAppName, sourceParam, ::rtl::OUString(rMedium.GetPhysicalName()));
++
++ rMedium.ReOpen();
++ ::utl::UCBContentHelper::Kill( aTmpVersionURL );
++
++ // clear status bar
++ if (xStatusIndicator.is()) {
++ xStatusIndicator->end();
++ }
++
++ }
++ }
+ return bOk;
+ }
+