diff options
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.diff | 201 |
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; + } + |