diff options
Diffstat (limited to 'binfilter/bf_sfx2/source/doc/sfx2_objstor.cxx')
-rw-r--r-- | binfilter/bf_sfx2/source/doc/sfx2_objstor.cxx | 1751 |
1 files changed, 1751 insertions, 0 deletions
diff --git a/binfilter/bf_sfx2/source/doc/sfx2_objstor.cxx b/binfilter/bf_sfx2/source/doc/sfx2_objstor.cxx new file mode 100644 index 000000000000..dfba43054cbb --- /dev/null +++ b/binfilter/bf_sfx2/source/doc/sfx2_objstor.cxx @@ -0,0 +1,1751 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include <bf_svtools/eitem.hxx> +#include <bf_svtools/stritem.hxx> +#include <bf_so3/svstor.hxx> +#include <tools/zcodec.hxx> +#include <com/sun/star/frame/XStorable.hpp> +#include <com/sun/star/frame/XModel.hpp> +#include <com/sun/star/frame/XFrame.hpp> + +#include <com/sun/star/document/XFilter.hpp> +#include <com/sun/star/document/XImporter.hpp> +#include <com/sun/star/document/XExporter.hpp> +#include <com/sun/star/document/FilterOptionsRequest.hpp> +#include <com/sun/star/document/XInteractionFilterOptions.hpp> +#include <com/sun/star/task/XInteractionHandler.hpp> + +#include <com/sun/star/lang/XInitialization.hpp> + +#include <com/sun/star/document/MacroExecMode.hpp> +#include <com/sun/star/beans/XPropertySetInfo.hpp> + +#include <com/sun/star/lang/XMultiServiceFactory.hpp> + +#include <com/sun/star/beans/XPropertyAccess.hpp> + +#include <com/sun/star/beans/PropertyValue.hpp> + +#include <com/sun/star/container/XNameAccess.hpp> + +#include <comphelper/processfactory.hxx> + +#ifdef _MSC_VER +#pragma hdrstop +#endif +#include <bf_svtools/itemset.hxx> + +#include <bf_svtools/sfxecode.hxx> + +#include <cppuhelper/weak.hxx> +#include <comphelper/processfactory.hxx> + +#include <comphelper/classids.hxx> +#include <tools/cachestr.hxx> +#include <bf_svtools/addxmltostorageoptions.hxx> +#include <unotools/streamwrap.hxx> + +#include <bf_svtools/saveopt.hxx> +#include <bf_svtools/useroptions.hxx> +#include <bf_svtools/pathoptions.hxx> +#include <tools/urlobj.hxx> +#include <unotools/localfilehelper.hxx> +#include <unotools/ucbhelper.hxx> +#include <unotools/tempfile.hxx> +#include <ucbhelper/content.hxx> +#include <sot/storinfo.hxx> + +#include "objsh.hxx" +#include "request.hxx" +#include "docfile.hxx" +#include "fltfnc.hxx" +#include "docfilt.hxx" +#include "docinf.hxx" +#include "docfac.hxx" +#include "cfgmgr.hxx" +#include "objshimp.hxx" +#include "sfxtypes.hxx" +#include "appdata.hxx" +#include "sfxsids.hrc" +#include "interno.hxx" +#include "module.hxx" +#include "app.hxx" +#include "openflag.hxx" +#include "helper.hxx" +#include "dlgcont.hxx" +#include "appuno.hxx" + +#include "bf_basic/basmgr.hxx" + +#include "scriptcont.hxx" +#include "event.hxx" +#include "fltoptint.hxx" + +#include <legacysmgr/legacy_binfilters_smgr.hxx> //STRIP002 +#include "bf_so3/staticbaseurl.hxx" +namespace binfilter { + +#define S2BS(s) ByteString( s, RTL_TEXTENCODING_MS_1252 ) + + +extern sal_uInt32 CheckPasswd_Impl( SfxObjectShell*, SfxItemPool&, SfxMedium* ); + + +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::lang; +//using namespace ::com::sun::star::ui::dialogs; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::ucb; +using namespace ::com::sun::star::task; +using namespace ::com::sun::star::document; +using namespace ::rtl; +using namespace ::cppu; + +//========================================================================= + +/*N*/ sal_Bool ShallSetBaseURL_Impl( SfxMedium &rMed ) +/*N*/ { +/*N*/ SvtSaveOptions aOpt; +/*N*/ sal_Bool bIsRemote = rMed.IsRemote(); +/*N*/ return aOpt.IsSaveRelINet() && bIsRemote || aOpt.IsSaveRelFSys() && !bIsRemote; +/*N*/ } + +//========================================================================= + +/*N*/ sal_Bool SfxObjectShell::Save() +/*N*/ { +/*N*/ if( SOFFICE_FILEFORMAT_60 <= GetStorage()->GetVersion() ) +/*N*/ return sal_True; +/*N*/ else +/*N*/ return SaveInfoAndConfig_Impl( GetMedium()->GetStorage() ); +/*N*/ } + +//-------------------------------------------------------------------------- + +/*N*/ sal_Bool SfxObjectShell::SaveAs( SvStorage* pNewStg ) +/*N*/ { +/*N*/ if( SOFFICE_FILEFORMAT_60 <= pNewStg->GetVersion() ) +/*N*/ return sal_True; +/*N*/ else +/*N*/ return SaveInfoAndConfig_Impl( pNewStg ); +/*N*/ } + +//------------------------------------------------------------------------- + +/*N*/ sal_Bool GetPasswd_Impl( const SfxItemSet* pSet, String& rPasswd ) +/*N*/ { +/*N*/ const SfxPoolItem* pItem = NULL; +/*N*/ if ( pSet && SFX_ITEM_SET == pSet->GetItemState( SID_PASSWORD, sal_True, &pItem ) ) +/*N*/ { +/*?*/ DBG_ASSERT( pItem->IsA( TYPE(SfxStringItem) ), "wrong item type" ); +/*?*/ rPasswd = ( (const SfxStringItem*)pItem )->GetValue(); +/*?*/ return sal_True; +/*N*/ } +/*N*/ return sal_False; +/*N*/ } + +//------------------------------------------------------------------------- + +/*N*/ sal_Bool SfxObjectShell::DoInitNew( SvStorage * pStor ) + +/* [Beschreibung] + + Diese von SvPersist geerbte virtuelle Methode wird gerufen, um + die SfxObjectShell-Instanz aus einem Storage (pStor != 0) bzw. + (pStor == 0) ganz neu zu initialisieren. + + Wie alle Do...-Methoden liegt hier eine Steuerung vor, die eigentliche + Implementierung erfolgt, indem die ebenfalls virtuellen Methode + InitNew(SvStorate*) von der SfxObjectShell-Subclass implementiert wird. + + F"ur pStor == 0 wird ein die SfxObjectShell-Instanz mit einem leeren + SfxMedium verbunden, sonst mit einem SfxMedium, welches auf den + als Parameter "ubergeben SvStorage verweist. + + Erst nach InitNew() oder Load() ist das Objekt korrekt initialisiert. + + [R"uckgabewert] + sal_True Das Objekt wurde initialisiert. + sal_False Das Objekt konnte nicht initialisiert werden +*/ + +/*N*/ { +/*N*/ ModifyBlocker_Impl aBlock( this ); +/*N*/ if ( pStor ) +/*N*/ pMedium = new SfxMedium( pStor ); +/*N*/ else +/*N*/ { +/*N*/ bIsTmp = sal_True; +/*N*/ pMedium = new SfxMedium; +/*N*/ } +/*N*/ +/*N*/ if ( InitNew( pStor ) ) +/*N*/ { +/*N*/ // empty documents always get their macros from the user, so there is no reason to restrict access +/*N*/ pImp->nMacroMode = MacroExecMode::ALWAYS_EXECUTE_NO_WARN; +/*N*/ +/*N*/ ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel > xModel ( GetModel(), ::com::sun::star::uno::UNO_QUERY ); +/*N*/ if ( xModel.is() ) +/*N*/ { +/*N*/ SfxItemSet *pSet = GetMedium()->GetItemSet(); +/*N*/ pSet->Put( SfxStringItem( SID_FILTER_NAME, GetFactory().GetFilter(0)->GetFilterName() ) ); +/*N*/ ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > aArgs; +/*N*/ TransformItems( SID_OPENDOC, *pSet, aArgs ); +/*N*/ sal_Int32 nLength = aArgs.getLength(); +/*N*/ aArgs.realloc( nLength + 1 ); +/*N*/ aArgs[nLength].Name = DEFINE_CONST_UNICODE("Title"); +/*N*/ aArgs[nLength].Value <<= ::rtl::OUString( GetTitle( SFX_TITLE_DETECT ) ); +/*N*/ xModel->attachResource( ::rtl::OUString(), aArgs ); +/*N*/ } +/*N*/ +/*N*/ SetActivateEvent_Impl( SFX_EVENT_CREATEDOC ); +/*N*/ return sal_True; +/*N*/ } +/*N*/ return sal_False; +/*N*/ } + +//------------------------------------------------------------------------- + +void SfxObjectShell::DoHandsOffNoMediumClose() +/*N*/ { +/*N*/ const SfxFilter *pFilter = pMedium->GetFilter(); +/*N*/ if( !pFilter || pFilter->IsOwnFormat() || ( pFilter->GetFilterFlags() & SFX_FILTER_PACKED ) ) +/*N*/ HandsOff(); +/*N*/ +/*N*/ // Force document library containers to release storage +/*N*/ SotStorageRef xDummyStorage; +/*N*/ SfxDialogLibraryContainer* pDialogCont = pImp->pDialogLibContainer; +/*N*/ if( pDialogCont ) +/*N*/ pDialogCont->setStorage( xDummyStorage ); +/*N*/ +/*N*/ SfxScriptLibraryContainer* pBasicCont = pImp->pBasicLibContainer; +/*N*/ if( pBasicCont ) +/*N*/ pBasicCont->setStorage( xDummyStorage ); +/*N*/ } + +//------------------------------------------------------------------------- + +/*N*/ void SfxObjectShell::DoHandsOff() + +/* [Beschreibung] + + Diese von SvPersist geerbte virtuelle Methode wird gerufen, um + das Objekt aufzufordern, den ihm zugeteilten SvStorage freizugeben, + insbesondere Substorages und Streams zu schlie"sen. + + Als Do...-Methode liegt hier nur die Steuerung. Der Implementierer + von Subclasses kann die ebenfalls virtuelle Methode HandsOff() + implementieren, um seine Substorages und Streams zu schlie"sen. + + Nach dem Aufruf dieser Methode, ist dem Objekt kein SfxMedium mehr + zugeordnet, bis SaveCompleted() durchlaufen ist. +*/ + +/*N*/ { +/*N*/ DoHandsOffNoMediumClose(); +/*N*/ pMedium->Close(); +/*N*/ // DELETEZ( pMedium ); +/*N*/ } + +//------------------------------------------------------------------------- + +/*?*/ sal_Bool SfxObjectShell::DoLoad( +/*?*/ const String& rFileName, StreamMode nStreamMode, StorageMode nStorageMode) +/*?*/ {DBG_BF_ASSERT(0, "STRIP"); //STRIP001 +/*?*/ return sal_False; +/*?*/ } + + +//------------------------------------------------------------------------- + +/*N*/ sal_Bool SfxObjectShell::DoLoad( SvStorage * pStor ) + +/* [Beschreibung] + + Diese von SvPersist geerbte virtuelle Methode steuert das Laden + des Objektes aus einem Storage. Dabei wird der SvStorage zun"achst + in einem SfxMedium verpackt und SfxObjectShell::DoLoad(SfxMedium*) + mit diesem gerufen. + + [R"uckgabewert] + sal_True Das Objekt wurde initialisiert. + sal_False Das Objekt konnte nicht initialisiert werden +*/ + +/*N*/ { +/*N*/ pMedium = new SfxMedium( pStor ); +/*N*/ if ( DoLoad(pMedium) ) +/*N*/ { +/*N*/ if ( SFX_CREATE_MODE_EMBEDDED == eCreateMode ) +/*N*/ { +/*N*/ ModifyBlocker_Impl aBlock( this ); +/*N*/ // bei Embedded Objekten setzt sonst keiner den Namen +/*N*/ // DBG_ASSERT( pStor->GetName().Len(), +/*N*/ // "StorageName hat Laenge Null" ); +/*N*/ SetTitle( pStor->GetName() ); +/*N*/ } +/*N*/ return sal_True; +/*N*/ } +/*N*/ +/*N*/ return sal_False; +/*N*/ } + +//------------------------------------------------------------------------- + +/*N*/ sal_Bool SfxObjectShell::DoLoad( SfxMedium *pMed ) + +/* [Beschreibung] + + Diese Methode steuert das Laden des Objektes aus dem von dem + "ubergebenen SfxMedium beschriebenen Medium. Hinterher ist das Objekt + mit diesem SfxMedium verbunden. + + Handelt es sich bei dem SfxMedium um einen Storage im eigenen Format, + wird die virtuelle Methode SvPersit::Load(SvStorage*) gerufen, welche + die Implementierer von Subclasses "uberladen m"ussen, um das Objekt + aus einem eigenen Storage zu laden (=> Swapping m"oeglich). + + Handelt es sich bei dem SfxMedium um einen Storage in einem fremden + Format, oder um ein Flat-File, dann wird die virtuelle Methode + <SfxObjectShell::ConvertFrom(SfxMedium*)> gerufen, welche die + Implementierer von Subclasses "uberladen m"ussen, um das Objekt + aus dem SfxMedium zu konvertieren. W"ahrend der Bearbeitung ist + das Objekt dann mit einem tempor"aren SvStorage verbunden. + + Erst nach InitNew() oder Load() ist das Objekt korrekt + initialisiert. + + [R"uckgabewert] + sal_True Das Objekt wurde geladen. + sal_False Das Objekt konnte nicht geladen werden +*/ + +/*N*/ { +/*N*/ SfxApplication *pSfxApp = SFX_APP(); +/*N*/ ModifyBlocker_Impl aBlock( this ); +/*N*/ +/*N*/ pMedium = pMed; +/*N*/ sal_Bool bOk = sal_False; +/*N*/ const SfxFilter* pFilter = pMed->GetFilter(); +/*N*/ SfxItemSet* pSet = pMedium->GetItemSet(); +/*N*/ if( !pImp->nEventId ) +/*N*/ { +/*N*/ SFX_ITEMSET_ARG( +/*N*/ pSet, pTemplateItem, SfxBoolItem, +/*N*/ SID_TEMPLATE, sal_False); +/*N*/ SetActivateEvent_Impl( +/*N*/ ( pTemplateItem && pTemplateItem->GetValue() ) +/*N*/ ? SFX_EVENT_CREATEDOC : SFX_EVENT_OPENDOC ); +/*N*/ } +/*N*/ +/*N*/ +/*N*/ SFX_ITEMSET_ARG( pSet, pBaseItem, SfxStringItem, +/*N*/ SID_BASEURL, sal_False); +/*N*/ String aBaseURL; +/*N*/ SFX_ITEMSET_ARG( pMedium->GetItemSet(), pSalvageItem, SfxStringItem, SID_DOC_SALVAGE, sal_False); +/*N*/ if( pBaseItem ) +/*N*/ aBaseURL = pBaseItem->GetValue(); +/*N*/ else +/*N*/ { +/*N*/ if( GetCreateMode() == SFX_CREATE_MODE_EMBEDDED ) +/*N*/ { +/*N*/ aBaseURL = ::binfilter::StaticBaseUrl::GetBaseURL(); +/*N*/ SetBaseURL( aBaseURL ); +/*N*/ } +/*N*/ else if ( pSalvageItem ) +/*N*/ { +/*N*/ String aName( pMed->GetPhysicalName() ); +/*N*/ ::utl::LocalFileHelper::ConvertPhysicalNameToURL( aName, aBaseURL ); +/*N*/ } +/*N*/ else +/*N*/ aBaseURL = pMed->GetBaseURL(); +/*N*/ } +/*N*/ +/*N*/ SfxApplication* pApp = SFX_APP(); +/*N*/ pImp->nLoadedFlags = 0; +/*N*/ sal_Bool bHasStorage = !pFilter || ( pFilter->IsOwnFormat() && pFilter->UsesStorage() ); +/*N*/ if ( !bHasStorage && pFilter && ( pFilter->GetFilterFlags() & SFX_FILTER_PACKED ) ) +/*N*/ { +/*N*/ bHasStorage = pMed->TryStorage(); +/*N*/ if ( bHasStorage ) +/*N*/ { +/*N*/ String aName( pMed->GetPhysicalName() ); +/*N*/ ::utl::LocalFileHelper::ConvertPhysicalNameToURL( aName, aBaseURL ); +/*N*/ } +/*N*/ } +/*N*/ +/*N*/ if ( pMedium->GetFilter() ) +/*N*/ { +/*N*/ sal_uInt32 nError = HandleFilter( pMedium, this ); +/*N*/ if ( nError != ERRCODE_NONE ) +/*N*/ SetError( nError ); +/*N*/ } +/*N*/ +/*N*/ if ( GetError() == ERRCODE_NONE && pMed->IsStorage() ) // STRIP003 && bHasStorage && ( !pFilter || !( pFilter->GetFilterFlags() & SFX_FILTER_STARONEFILTER ) ) ) +/*N*/ { +/*N*/ SvStorageRef xStor( pMed->GetStorage() ); +/*N*/ if( pMed->GetLastStorageCreationState() == ERRCODE_NONE ) +/*N*/ { +/*N*/ DBG_ASSERT( pFilter, "No filter for storage found!" ); +/*N*/ if( xStor.Is() && !xStor->GetError() && pMed->GetFilter() && pMed->GetFilter()->GetVersion() < SOFFICE_FILEFORMAT_60 ) +/*N*/ { +/*N*/ // Undoobjekte aufraeumen, muss vor dem eigentlichen Laden erfolgen +/*N*/ SvEmbeddedObjectRef xThis = this; +/*N*/ SvPersistRef xPer; +/*N*/ if ( xThis.Is() ) +/*N*/ xPer = new SvEmbeddedObject; +/*N*/ else +/*?*/ xPer = new SvPersist; +/*N*/ +/*N*/ xPer->DoOwnerLoad(xStor); +/*N*/ xPer->CleanUp(); +/*N*/ xPer->DoSave(); +/*N*/ xPer->DoSaveCompleted( 0 ); +/*N*/ } +/*N*/ +/*N*/ if ( xStor.Is() ) +/*N*/ { +/*N*/ SvStorageInfoList aList; +/*N*/ xStor->FillInfoList( &aList ); +/*N*/ if ( !aList.Count() && !xStor->IsOLEStorage() ) +/*?*/ SetError( ERRCODE_IO_BROKENPACKAGE ); +/*N*/ else +/*N*/ { +/*N*/ BOOL bHasMacros = FALSE; +/*N*/ if ( xStor->IsOLEStorage() ) +/*N*/ bHasMacros = BasicManager::HasBasicWithModules( + *xStor, + ::binfilter::StaticBaseUrl::GetBaseURL( + INetURLObject::NO_DECODE) ); +/*N*/ else +/*?*/ bHasMacros = xStor->IsStorage( String::CreateFromAscii("Basic") ); +/*N*/ +/*N*/ if ( bHasMacros ) +/*N*/ AdjustMacroMode( String() ); +/*N*/ else +/*N*/ { +/*N*/ // if macros will be added by the user later, the security check is obsolete +/*N*/ pImp->nMacroMode = MacroExecMode::ALWAYS_EXECUTE_NO_WARN; +/*N*/ } +/*N*/ } +/*N*/ } +/*N*/ +/*N*/ // Load +/*N*/ if ( !GetError() ) +/*N*/ { +/*N*/ const String aOldURL( ::binfilter::StaticBaseUrl::GetBaseURL() ); +/*N*/ if( aBaseURL.Len() ) ::binfilter::StaticBaseUrl::SetBaseURL( aBaseURL ); +/*N*/ pImp->nLoadedFlags = 0; +/*N*/ bOk = xStor.Is() && LoadOwnFormat( *pMed ); +/*N*/ ::binfilter::StaticBaseUrl::SetBaseURL( aOldURL ); +/*N*/ if ( bOk ) +/*N*/ { +/*N*/ GetDocInfo().Load(xStor); +/*N*/ bHasName = sal_True; +/*N*/ } +/*N*/ else +/*?*/ SetError( ERRCODE_ABORT ); +/*N*/ } +/*N*/ } +/*N*/ else +/*?*/ SetError( pMed->GetLastStorageCreationState() ); +/*N*/ } + else if ( GetError() == ERRCODE_NONE && InitNew(0) ) +/*?*/ { +/*?*/ // Name vor ConvertFrom setzen, damit GetSbxObject() schon funktioniert +/*?*/ bHasName = sal_True; +/*?*/ +/*?*/ // Importieren +/*?*/ const String aOldURL( ::binfilter::StaticBaseUrl::GetBaseURL() ); +/*?*/ if( aBaseURL.Len() ) ::binfilter::StaticBaseUrl::SetBaseURL( aBaseURL ); +/*?*/ if( !pMedium->GetFilter()->UsesStorage() ) +/*?*/ pMedium->GetInStream(); +/*?*/ else +/*?*/ pMedium->GetStorage(); +/*?*/ +/*?*/ pImp->nLoadedFlags = 0; +/*?*/ bOk = ConvertFrom(*pMedium); +/*?*/ +/*?*/ ::binfilter::StaticBaseUrl::SetBaseURL( aOldURL ); +/*?*/ +/*?*/ if( bOk && pMedium->GetOpenMode() & STREAM_WRITE ) +/*?*/ //Medium offen halten um andere Zugriffe zu verhindern +/*?*/ { +/*?*/ if(pMedium->GetFilter() && pMedium->GetFilter()->UsesStorage()) +/*?*/ { +/*?*/ pMedium->GetStorage(); +/*?*/ if( pMedium->GetLastStorageCreationState() != ERRCODE_NONE ) +/*?*/ pMedium->SetError( pMedium->GetLastStorageCreationState() ); +/*?*/ } +/*?*/ else +/*?*/ pMedium->GetInStream(); +/*?*/ if(pMedium->GetError()) +/*?*/ bOk = sal_False; +/*?*/ } +/*?*/ } +/*N*/ +/*N*/ if ( bOk ) +/*N*/ { +/*N*/ try +/*?*/ /*N*/ { +/*?*/ ::ucbhelper::Content aContent( pMedium->GetName(), ::com::sun::star::uno::Reference < XCommandEnvironment >() ); +/*?*/ ::com::sun::star::uno::Reference < XPropertySetInfo > xProps = aContent.getProperties(); +/*?*/ if ( xProps.is() ) +/*?*/ { +/*?*/ ::rtl::OUString aAuthor( RTL_CONSTASCII_USTRINGPARAM("Author") ); +/*?*/ ::rtl::OUString aKeywords( RTL_CONSTASCII_USTRINGPARAM("Keywords") ); +/*?*/ ::rtl::OUString aSubject( RTL_CONSTASCII_USTRINGPARAM("Subject") ); +/*?*/ Any aAny; +/*?*/ ::rtl::OUString aValue; +/*?*/ SfxDocumentInfo& rInfo = GetDocInfo(); +/*?*/ if ( xProps->hasPropertyByName( aAuthor ) ) +/*?*/ { +/*?*/ aAny = aContent.getPropertyValue( aAuthor ); +/*?*/ if ( ( aAny >>= aValue ) ) +/*?*/ rInfo.SetCreated( SfxStamp( String( aValue ) ) ); +/*?*/ } +/*?*/ if ( xProps->hasPropertyByName( aKeywords ) ) +/*?*/ { +/*?*/ aAny = aContent.getPropertyValue( aKeywords ); +/*?*/ if ( ( aAny >>= aValue ) ) +/*?*/ rInfo.SetKeywords( aValue ); +/*?*/ } +/*?*/ if ( xProps->hasPropertyByName( aSubject ) ) +/*?*/ { +/*?*/ aAny = aContent.getPropertyValue( aSubject ); +/*?*/ if ( ( aAny >>= aValue ) ) +/*?*/ rInfo.SetTheme( aValue ); +/*?*/ } +/*?*/ } +/*?*/ } +/*N*/ catch( Exception& ) +/*N*/ { +/*N*/ } +/*N*/ +/*N*/ ::rtl::OUString aTitle = GetTitle( SFX_TITLE_DETECT ); +/*N*/ +/*N*/ // Falls nicht asynchron geladen wird selbst FinishedLoading aufrufen +/*N*/ if ( !( pImp->nLoadedFlags & SFX_LOADED_MAINDOCUMENT ) && +/*N*/ ( !pMedium->GetFilter() || +/*N*/ pMedium->GetFilter()->UsesStorage() || +/*N*/ !( pMedium->GetFilter()->GetFilterFlags() & SFX_FILTER_ASYNC ) ) ) +/*N*/ FinishedLoading( SFX_LOADED_MAINDOCUMENT ); +/*N*/ +/*N*/ if ( pSalvageItem ) +/*N*/ { +/*?*/ pImp->aTempName = pMedium->GetPhysicalName(); +/*?*/ pMedium->GetItemSet()->ClearItem( SID_DOC_SALVAGE ); +/*?*/ pMedium->GetItemSet()->ClearItem( SID_FILE_NAME ); +/*N*/ } +/*N*/ else +/*N*/ { +/*N*/ pMedium->GetItemSet()->ClearItem( SID_PROGRESS_STATUSBAR_CONTROL ); +/*N*/ pMedium->GetItemSet()->ClearItem( SID_DOCUMENT ); +/*N*/ } +/*N*/ +/*N*/ pMedium->GetItemSet()->ClearItem( SID_REFERER ); +/*N*/ ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel > xModel ( GetModel(), ::com::sun::star::uno::UNO_QUERY ); +/*N*/ if ( xModel.is() ) +/*N*/ { +/*N*/ ::rtl::OUString aURL = GetMedium()->GetOrigURL(); +/*N*/ SfxItemSet *pSet = GetMedium()->GetItemSet(); +/*N*/ if ( !GetMedium()->IsReadOnly() ) +/*N*/ pSet->ClearItem( SID_INPUTSTREAM ); +/*N*/ ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > aArgs; +/*N*/ TransformItems( SID_OPENDOC, *pSet, aArgs ); +/*N*/ xModel->attachResource( aURL, aArgs ); +/*N*/ } +/*N*/ +/*N*/ if( IsOwnStorageFormat_Impl(*pMed) && pMed->GetFilter() ) +/*N*/ { +/*N*/ //???? dv DirEntry aDirEntry( pMed->GetPhysicalName() ); +/*N*/ //???? dv SetFileName( aDirEntry.GetFull() ); +/*N*/ } +/*N*/ Broadcast( SfxSimpleHint(SFX_HINT_NAMECHANGED) ); +/*N*/ } +/*N*/ +/*N*/ if ( SFX_CREATE_MODE_EMBEDDED != eCreateMode ) +/*N*/ { +/*N*/ GetpApp()->HideStatusText(); +/*N*/ } +/*N*/ +/*N*/ return bOk; +/*N*/ } + +/*N*/ sal_uInt32 SfxObjectShell::HandleFilter( SfxMedium* pMedium, SfxObjectShell* pDoc ) +/*N*/ { +/*N*/ sal_uInt32 nError = ERRCODE_NONE; +/*N*/ SfxItemSet* pSet = pMedium->GetItemSet(); +/*N*/ SFX_ITEMSET_ARG( pSet, pOptions, SfxStringItem, SID_FILE_FILTEROPTIONS, sal_False ); +/*N*/ SFX_ITEMSET_ARG( pSet, pData, SfxUsrAnyItem, SID_FILTER_DATA, sal_False ); +/*N*/ if ( !pData && !pOptions ) +/*N*/ { +/*N*/ ::com::sun::star::uno::Reference< XMultiServiceFactory > xServiceManager = ::legacy_binfilters::getLegacyProcessServiceFactory(); +/*N*/ ::com::sun::star::uno::Reference< XNameAccess > xFilterCFG; +/*N*/ if( xServiceManager.is() ) +/*N*/ { +/*N*/ xFilterCFG = ::com::sun::star::uno::Reference< XNameAccess >( +/*N*/ xServiceManager->createInstance( ::rtl::OUString::createFromAscii( "com.sun.star.document.FilterFactory" ) ), +/*N*/ UNO_QUERY ); +/*N*/ } +/*N*/ +/*N*/ if( xFilterCFG.is() ) +/*N*/ { +/*N*/ BOOL bAbort = FALSE; +/*N*/ try { +/*N*/ const SfxFilter* pFilter = pMedium->GetFilter(); +/*N*/ Sequence < PropertyValue > aProps; +/*N*/ Any aAny = xFilterCFG->getByName( pFilter->GetName() ); +/*N*/ if ( aAny >>= aProps ) +/*N*/ { +/*N*/ ::rtl::OUString aServiceName; +/*N*/ sal_Int32 nPropertyCount = aProps.getLength(); +/*N*/ for( sal_Int32 nProperty=0; nProperty < nPropertyCount; ++nProperty ) +/*N*/ if( aProps[nProperty].Name.equals( ::rtl::OUString::createFromAscii("UIComponent")) ) +/*N*/ { +/*N*/ ::rtl::OUString aServiceName; +/*N*/ aProps[nProperty].Value >>= aServiceName; +/*N*/ if( aServiceName.getLength() ) +/*?*/ { +/*?*/ ::com::sun::star::uno::Reference< XInteractionHandler > rHandler = pMedium->GetInteractionHandler(); +/*?*/ if( rHandler.is() ) +/*?*/ { +/*?*/ // we need some properties in the media descriptor, so we have to make sure that they are in +/*?*/ Any aAny; +/*?*/ aAny <<= pMedium->GetInputStream(); +/*?*/ if ( pSet->GetItemState( SID_INPUTSTREAM ) < SFX_ITEM_SET ) +/*?*/ pSet->Put( SfxUsrAnyItem( SID_INPUTSTREAM, aAny ) ); +/*?*/ if ( pSet->GetItemState( SID_FILE_NAME ) < SFX_ITEM_SET ) +/*?*/ pSet->Put( SfxStringItem( SID_FILE_NAME, pMedium->GetName() ) ); +/*?*/ if ( pSet->GetItemState( SID_FILTER_NAME ) < SFX_ITEM_SET ) +/*?*/ pSet->Put( SfxStringItem( SID_FILTER_NAME, pFilter->GetName() ) ); +/*?*/ +/*?*/ Sequence< PropertyValue > rProperties; +/*?*/ TransformItems( SID_OPENDOC, *pSet, rProperties ); +/*?*/ RequestFilterOptions* pFORequest = new RequestFilterOptions( pDoc->GetModel(), rProperties ); +/*?*/ +/*?*/ ::com::sun::star::uno::Reference< XInteractionRequest > rRequest( pFORequest ); +/*?*/ rHandler->handle( rRequest ); +/*?*/ +/*?*/ if ( !pFORequest->isAbort() ) +/*?*/ { +/*?*/ SfxAllItemSet aNewParams( pDoc->GetPool() ); +/*?*/ TransformParameters( SID_OPENDOC, +/*?*/ pFORequest->getFilterOptions(), +/*?*/ aNewParams ); +/*?*/ +/*?*/ SFX_ITEMSET_ARG( &aNewParams, +/*?*/ pOptions, +/*?*/ SfxStringItem, +/*?*/ SID_FILE_FILTEROPTIONS, +/*?*/ sal_False ); +/*?*/ if ( pOptions ) +/*?*/ pSet->Put( *pOptions ); +/*?*/ +/*?*/ SFX_ITEMSET_ARG( &aNewParams, +/*?*/ pData, +/*?*/ SfxUsrAnyItem, +/*?*/ SID_FILTER_DATA, +/*?*/ sal_False ); +/*?*/ if ( pData ) +/*?*/ pSet->Put( *pData ); +/*?*/ } +/*?*/ else +/*?*/ bAbort = TRUE; +/*?*/ } +/*?*/ } +/*N*/ +/*N*/ break; +/*N*/ } +/*N*/ } +/*N*/ +/*N*/ if( bAbort ) +/*N*/ { +/*N*/ // filter options were not entered +/*N*/ nError = ERRCODE_ABORT; +/*N*/ } +/*N*/ } +/*N*/ catch( NoSuchElementException& ) +/*N*/ { +/*N*/ // the filter name is unknown +/*N*/ nError = ERRCODE_IO_INVALIDPARAMETER; +/*N*/ } +/*N*/ catch( Exception& ) +/*N*/ { +/*N*/ nError = ERRCODE_ABORT; +/*N*/ } +/*N*/ } +/*N*/ } +/*N*/ +/*N*/ return nError; +/*N*/ } + +//------------------------------------------------------------------------- + +/*N*/ sal_Bool SfxObjectShell::IsOwnStorageFormat_Impl(const SfxMedium &rMedium) const +/*N*/ { +/*N*/ return !rMedium.GetFilter() || // Embedded +/*N*/ ( rMedium.GetFilter()->IsOwnFormat() && +/*N*/ rMedium.GetFilter()->UsesStorage() ); +/*N*/ } + +//------------------------------------------------------------------------- + +/*N*/ sal_Bool SfxObjectShell::DoSave() +// DoSave wird nur noch ueber OLE aufgerufen. Sichern eigener Dokumente im SFX +// laeuft uber DoSave_Impl, um das Anlegen von Backups zu ermoeglichen. +// Save in eigenes Format jetzt auch wieder Hierueber +/*N*/ { +/*N*/ sal_Bool bOk = sal_False ; +/*N*/ { +/*N*/ ModifyBlocker_Impl aBlock( this ); +/*N*/ SfxForceLinkTimer_Impl aFLT( this ); +/*N*/ pImp->bIsSaving = sal_True; +/*N*/ String aPasswd; +/*N*/ if ( IsOwnStorageFormat_Impl( *GetMedium() ) && +/*N*/ GetPasswd_Impl( GetMedium()->GetItemSet(), aPasswd ) ) +/*N*/ GetMedium()->GetStorage()->SetKey( S2BS( aPasswd ) ); //!!! (pb) needs new implementation +/*N*/ GetStorage()->SetVersion( GetMedium()->GetFilter()->GetVersion() ); +/*N*/ bOk = Save(); +/*N*/ } + +//#88046 +// if ( bOk ) +// SetModified( sal_False ); +/*N*/ return bOk; +/*N*/ } + +/*N*/ void Lock_Impl( SfxObjectShell* pDoc, BOOL bLock ) +/*N*/ { +/*N*/ } + +//------------------------------------------------------------------------- + +/*N*/ sal_Bool SfxObjectShell::SaveTo_Impl +/*N*/ ( +/*N*/ SfxMedium &rMedium, // Medium, in das gespeichert werden soll +/*N*/ const SfxItemSet* pSet, +/*N*/ BOOL bPrepareForDirectAccess +/*N*/ ) + +/* [Beschreibung] + + Schreibt den aktuellen Inhalt in das Medium rMedium. + Ist das Zielmedium kein Storage, so wird ueber ein temporaeres + Medium gespeichert, sonst direkt, da das Medium transacted + geschaltet ist, wenn wir es selbst geoeffnet haben und falls wir + Server sind entweder der Container einen transacted Storage zur + Verfuegung stellt oder selbst einen temporaeren Storage erzeugt hat. +*/ + +/*N*/ { +/*N*/ SfxForceLinkTimer_Impl aFLT( this ); +/*N*/ EnableSetModified( FALSE ); +/*N*/ +/*N*/ const SfxFilter *pFilter = rMedium.GetFilter(); +/*N*/ if ( !pFilter ) +/*N*/ { +/*N*/ // if no filter was set, use the default filter +/*N*/ // this should be changed in the feature, it should be an error! +/*?*/ pFilter = GetFactory().GetFilter(0); +/*?*/ rMedium.SetFilter(pFilter); +/*N*/ } +/*N*/ +/*N*/ if( pFilter->UsesStorage() ) +/*N*/ // create an output storage in the correct format +/*N*/ rMedium.GetOutputStorage( SOFFICE_FILEFORMAT_60 <= pFilter->GetVersion() ); +/*N*/ else +/*?*/ rMedium.GetOutStream(); +/*N*/ +/*N*/ if( rMedium.GetErrorCode() ) +/*N*/ return sal_False; +/*N*/ +/*N*/ sal_Bool bOldStat = pImp->bForbidReload; +/*N*/ pImp->bForbidReload = sal_True; +/*N*/ +/*N*/ // lock user interface while saving the document +/*N*/ Lock_Impl( this, sal_True ); +/*N*/ +/*N*/ sal_Bool bOk = sal_False; +/*N*/ if( sal_True ) // STRIP003 IsOwnStorageFormat_Impl(rMedium) && !(pFilter->GetFilterFlags() & SFX_FILTER_STARONEFILTER)) +/*N*/ { +/*N*/ SvStorageRef aMedRef = rMedium.GetStorage(); +/*N*/ if ( !aMedRef.Is() ) +/*N*/ { +/*?*/ // no saving without storage, unlock UI and return +/*?*/ Lock_Impl( this, sal_False ); +/*?*/ return sal_False; +/*N*/ } +/*N*/ +/*N*/ // transfer password from the parameters to the storage +/*N*/ String aPasswd; +/*N*/ if ( GetPasswd_Impl( rMedium.GetItemSet(), aPasswd ) ) +/*N*/ aMedRef->SetKey( S2BS( aPasswd ) ); //!!! (pb) needs new implementation +/*N*/ +/*N*/ const SfxFilter* pFilter = rMedium.GetFilter(); +/*N*/ if( ((SvStorage *)aMedRef) == ((SvStorage *)GetStorage() ) ) +/*N*/ { +/*N*/ // target storage and object storage are identical, should never happen here +/*?*/ DBG_ERROR( "Saving storage without copy!"); +/*?*/ aMedRef->SetVersion( pFilter->GetVersion() ); +/*?*/ bOk = Save(); +/*N*/ } +/*N*/ else +/*N*/ // save to target +/*N*/ bOk = SaveAsOwnFormat( rMedium ); +/*N*/ +/*N*/ // look for a "version" parameter +/*N*/ const SfxStringItem *pVersionItem = pSet ? (const SfxStringItem*) +/*N*/ SfxRequest::GetItem( pSet, SID_DOCINFO_COMMENTS, sal_False, TYPE(SfxStringItem) ) : NULL; +/*N*/ +/*N*/ if ( pVersionItem ) +/*N*/ {DBG_BF_ASSERT(0, "STRIP"); //STRIP001 +/*N*/ } +/*N*/ else if ( pImp->bIsSaving ) +/*N*/ {DBG_BF_ASSERT(0, "STRIP"); //STRIP001 +/*N*/ } +/*N*/ } +//STRIP003/*N*/ else +//STRIP003/*N*/ { +//STRIP003/*?*/ // it's a "SaveAs" in an alien format +//STRIP003/*?*/ if ( rMedium.GetFilter() && ( rMedium.GetFilter()->GetFilterFlags() & SFX_FILTER_STARONEFILTER ) ) +//STRIP003/*?*/ bOk = ExportTo( rMedium ); +//STRIP003/*?*/ else +//STRIP003/*?*/ bOk = ConvertTo( rMedium ); +//STRIP003/*?*/ +//STRIP003/*?*/ // after saving the document, the temporary object storage must be updated +//STRIP003/*?*/ // if the old object storage was not a temporary one, it will be updated also, because it will be used +//STRIP003/*?*/ // as a source for copying the objects into the new temporary storage that will be created below +//STRIP003/*?*/ // updating means: all child objects must be stored into it +//STRIP003/*?*/ // ( same as on loading, where these objects are copied to the temporary storage ) +//STRIP003/*?*/ // but don't commit these changes, because in the case when the old object storage is not a temporary one, +//STRIP003/*?*/ // all changes will be written into the original file ! +//STRIP003/*?*/ if( bOk ) +//STRIP003/*?*/ bOk = SaveChilds() && SaveCompletedChilds( NULL ); +//STRIP003/*N*/ } + + // SetModified must be enabled when SaveCompleted is called, otherwise the modified flag of child objects will not be cleared +/*N*/ EnableSetModified( sal_True ); +/*N*/ +/*N*/ sal_Bool bCopyTo = sal_False; +/*N*/ SfxItemSet *pMedSet = rMedium.GetItemSet(); +/*N*/ if( pMedSet ) +/*N*/ { +/*N*/ SFX_ITEMSET_ARG( pMedSet, pSaveToItem, SfxBoolItem, SID_SAVETO, sal_False ); +/*N*/ bCopyTo = GetCreateMode() == SFX_CREATE_MODE_EMBEDDED || +/*N*/ pSaveToItem && pSaveToItem->GetValue(); +/*N*/ } +/*N*/ +/*N*/ if( bOk ) +/*N*/ { +/*N*/ // remember new object storage, if it is a temporary one, because we will need it for a "SaveCompleted" later +/*N*/ SvStorageRef xNewTempRef; +/*N*/ if ( bOk && bPrepareForDirectAccess ) +/*N*/ { +/*N*/ // if the target medium is an alien format and the "old" medium was an own format, the object storage +/*N*/ // must be exchanged, because now we need a new temporary storage as object storage +/*N*/ BOOL bNeedsStorage = !bCopyTo && IsOwnStorageFormat_Impl(*pMedium) && !IsOwnStorageFormat_Impl(rMedium); +/*N*/ if ( bNeedsStorage ) +/*N*/ { +/*?*/ if( !pMedium->GetName().Len() ) +/*?*/ // if the old object storage was a temporary one too, we can continue with it +/*?*/ xNewTempRef = GetStorage(); +/*?*/ else +/*?*/ { +/*?*/ // copy storage of old medium to new temporary storage and take this over +/*?*/ if( ConnectTmpStorage_Impl( pMedium->GetStorage() ) ) +/*?*/ xNewTempRef = GetStorage(); +/*?*/ else +/*?*/ bOk = sal_False; +/*?*/ } +/*N*/ } +/*N*/ +/*N*/ // When the new medium ( rMedium ) has the same name as the current one, +/*N*/ // we need to call DoHandsOff() so Commit() can overwrite the old version +/*N*/ if ( bOk && pMedium && ( rMedium.GetName().EqualsIgnoreCaseAscii( pMedium->GetName() ) ) +/*N*/ && rMedium.GetName().CompareIgnoreCaseToAscii( "private:stream", 14 ) != COMPARE_EQUAL ) +/*?*/ DoHandsOff(); +/*N*/ } +/*N*/ +/*N*/ if ( bOk && pMedium && ( rMedium.GetName() == pMedium->GetName() ) ) +/*N*/ { +/*N*/ // before we overwrite the original file, we will make a backup if there is a demand for that +/*N*/ const sal_Bool bDoBackup = SvtSaveOptions().IsBackup(); +/*N*/ if ( bDoBackup ) +/*N*/ {{DBG_BF_ASSERT(0, "STRIP");}//STRIP001 +/*N*/ } +/*N*/ } +/*N*/ +/*N*/ if ( bOk ) +/*N*/ { +/*N*/ // transfer data to its destinated location +/*N*/ EnableSetModified( sal_False ); +/*N*/ RegisterTransfer( rMedium ); +/*N*/ bOk = rMedium.Commit(); +/*N*/ EnableSetModified( sal_True ); +/*N*/ +/*N*/ if ( bOk ) +/*N*/ { +/*N*/ // watch: if the document was successfully saved into an own format, no "SaveCompleted" was called, +/*N*/ // this must be done by the caller ( because they want to do different calls ) +/*N*/ if( xNewTempRef.Is() && xNewTempRef != GetStorage() ) +/*N*/ // if the new object storage is a temporary one, because the target format is an alien format +/*?*/ SaveCompleted( xNewTempRef ); +/*N*/ } +/*N*/ else +/*N*/ { +/*?*/ // if the storing process fails on medium commit step it means that +/*?*/ // the new medium should contain successfully written temporary representation +/*?*/ // of the document, so the docshell can just switch to new medium. +/*?*/ // it is reasonable in case an open document suddenly became unavailable. +/*?*/ +/*?*/ OUString aOrigName = pMedium ? OUString(pMedium->GetName()) : OUString(); +/*?*/ if ( aOrigName.getLength() && aOrigName.compareToAscii( "private:", 8 ) != COMPARE_EQUAL +/*?*/ && !::utl::UCBContentHelper::Exists( aOrigName ) ) +/*?*/ {DBG_BF_ASSERT(0, "STRIP");//STRIP001 +/*?*/ } +/*N*/ } +/*N*/ } +/*N*/ } +/*N*/ +/*N*/ // unlock user interface +/*N*/ Lock_Impl( this, sal_False ); +/*N*/ pImp->bForbidReload = bOldStat; +/*N*/ +/*N*/ if ( bOk ) +/*N*/ { +/*N*/ DBG_ASSERT( pFilter, "No filter after successful save?!" ); +/*N*/ if( pFilter ) +/*N*/ if( !bCopyTo && pFilter->IsAlienFormat() ) +/*N*/ // set flag, that the user will be warned for possible data loss on closing this document +/*N*/ pImp->bDidDangerousSave=sal_True; +/*N*/ else +/*?*/ pImp->bDidDangerousSave=sal_False; +/*N*/ +/*N*/ +/*N*/ try +/*N*/ { +/*?*/ ::ucbhelper::Content aContent( rMedium.GetName(), ::com::sun::star::uno::Reference < XCommandEnvironment >() ); +/*?*/ ::com::sun::star::uno::Reference < XPropertySetInfo > xProps = aContent.getProperties(); +/*?*/ if ( xProps.is() ) +/*?*/ { +/*?*/ ::rtl::OUString aAuthor( RTL_CONSTASCII_USTRINGPARAM("Author") ); +/*?*/ ::rtl::OUString aKeywords( RTL_CONSTASCII_USTRINGPARAM("Keywords") ); +/*?*/ ::rtl::OUString aSubject( RTL_CONSTASCII_USTRINGPARAM("Subject") ); +/*?*/ Any aAny; +/*?*/ if ( xProps->hasPropertyByName( aAuthor ) ) +/*?*/ { +/*?*/ aAny <<= ::rtl::OUString( GetDocInfo().GetCreated().GetName() ); +/*?*/ aContent.setPropertyValue( aAuthor, aAny ); +/*?*/ } +/*?*/ if ( xProps->hasPropertyByName( aKeywords ) ) +/*?*/ { +/*?*/ aAny <<= ::rtl::OUString( GetDocInfo().GetKeywords() ); +/*?*/ aContent.setPropertyValue( aKeywords, aAny ); +/*?*/ } +/*?*/ if ( xProps->hasPropertyByName( aSubject ) ) +/*?*/ { +/*?*/ aAny <<= ::rtl::OUString( GetDocInfo().GetTheme() ); +/*?*/ aContent.setPropertyValue( aSubject, aAny ); +/*?*/ } +/*?*/ } +/*N*/ } +/*N*/ catch( Exception& ) +/*N*/ { +/*N*/ } +/*N*/ } +/*N*/ +/*N*/ return bOk; +/*N*/ } + +//------------------------------------------------------------------------ + +/*?*/ sal_Bool SfxObjectShell::ConnectTmpStorage_Impl( SvStorage* pStg) + +/* [Beschreibung] + + Arbeitet die Applikation auf einem temporaeren Storage, + so darf der temporaere Storage nicht aus dem SaveCompleted + genommen werden. Daher wird in diesem Fall schon hier an + den neuen Storage connected. SaveCompleted tut dann nichts. + + */ + +/*?*/ { +/*?*/ // wenn es kein temp. Storage ist, einen anlegen +/*?*/ SvStorageRef aTmpMed = new SvStorage( (pStg->GetVersion() >= SOFFICE_FILEFORMAT_60), String() ); +/*?*/ +/*?*/ // nach HandsOff muss der alte Storage wieder eingesetzt werden +/*?*/ if ( !pStg->CopyTo(aTmpMed) ) +/*?*/ { +/*?*/ SetError(aTmpMed->GetErrorCode()); +/*?*/ aTmpMed.Clear(); +/*?*/ return sal_False; +/*?*/ } +/*?*/ +/*?*/ SetError(GetMedium()->GetErrorCode()); +/*?*/ SaveCompleted(aTmpMed); // neuer temp. Storage; gibt alten frei +/*?*/ return sal_True; +/*?*/ } + + +//------------------------------------------------------------------------- + +/*N*/ sal_Bool SfxObjectShell::DoSaveAs( SvStorage * pNewStor ) +/*N*/ { +/*N*/ // DoSaveAs wird nur noch ueber OLE aufgerufen +/*N*/ sal_Bool bOk; +/*N*/ { +/*N*/ SfxForceLinkTimer_Impl aFLT( this ); +/*N*/ ModifyBlocker_Impl aBlock( this ); +/*N*/ //Abwehr gegen feindlich gesinnte Applikationen. +/*N*/ if ( !pNewStor->GetFormat() ) +/*N*/ SetupStorage( pNewStor ); +/*N*/ +/*N*/ pImp->bIsSaving = sal_False; +/*N*/ SfxMedium* pNewMed = new SfxMedium( pNewStor ); +/*N*/ const String aOldURL( ::binfilter::StaticBaseUrl::GetBaseURL() ); +/*N*/ +/*N*/ bOk = SaveAsOwnFormat( *pNewMed ); +/*N*/ ::binfilter::StaticBaseUrl::SetBaseURL( aOldURL ); +/*N*/ delete pNewMed; +/*N*/ } +/*N*/ return bOk; +/*N*/ } + +//------------------------------------------------------------------------- + +/*N*/ sal_Bool SfxObjectShell::DoSaveCompleted( SfxMedium * pNewMed ) +/*N*/ { + sal_Bool bOk = sal_True; + sal_Bool bMedChanged = pNewMed && pNewMed!=pMedium; +/* sal_Bool bCreatedTempStor = pNewMed && pMedium && + IsOwnStorageFormat_Impl(*pMedium) && + !IsOwnStorageFormat_Impl(*pNewMed) && + pMedium->GetName().Len(); +*/ +/*N*/ DBG_ASSERT( !pNewMed || pNewMed->GetError() == ERRCODE_NONE, "DoSaveCompleted: Medium has error!" ); +/*N*/ if ( bMedChanged ) +/*N*/ { +/*N*/ delete pMedium; +/*N*/ pMedium = pNewMed; +/*N*/ //MI? DELETEZ(pImp->pDocInfo); +/*N*/ } +/*N*/ +/*N*/ const SfxFilter *pFilter = pMedium ? pMedium->GetFilter() : 0; +/*N*/ if ( pNewMed ) +/*N*/ { +/*N*/ if( bMedChanged ) +/*N*/ { +/*N*/ if( pNewMed->GetName().Len() ) +/*N*/ bHasName = sal_True; +/*N*/ String aBase = GetBaseURL(); +/*N*/ if( Current() == this && aBase.Len() ) +/*N*/ ::binfilter::StaticBaseUrl::SetBaseURL( aBase ); +/*N*/ Broadcast( SfxSimpleHint(SFX_HINT_NAMECHANGED) ); +/*N*/ } +/*N*/ +/*N*/ SvStorage *pStorage=NULL; +/*N*/ if ( !pFilter||sal_True ) //STRIP007 if ( !pFilter || pFilter->IsOwnFormat() ) +/*N*/ { +/*N*/ pStorage = pMedium->GetStorage(); +/*N*/ bOk = SaveCompleted( pStorage ); +/*N*/ } +/*N*/ else +/*N*/ { +/*?*/ pStorage = GetStorage(); +/*?*/ if( pFilter->UsesStorage() ) +/*?*/ pMedium->GetStorage(); +/*?*/ else if( pMedium->GetOpenMode() & STREAM_WRITE ) +/*?*/ pMedium->GetInStream(); +/*N*/ } +/*N*/ +/*N*/ // Set storage in document library containers +/*N*/ SfxDialogLibraryContainer* pDialogCont = pImp->pDialogLibContainer; +/*N*/ if( pDialogCont ) +/*N*/ pDialogCont->setStorage( pStorage ); +/*N*/ +/*N*/ SfxScriptLibraryContainer* pBasicCont = pImp->pBasicLibContainer; +/*N*/ if( pBasicCont ) +/*N*/ pBasicCont->setStorage( pStorage ); +/*N*/ } +/*N*/ else +/*N*/ { +/*N*/ if( pMedium ) +/*N*/ { +/*N*/ const SfxFilter* pFilter = pMedium->GetFilter(); +/*N*/ if( pFilter && !pFilter->IsOwnFormat() && +/*N*/ (pMedium->GetOpenMode() & STREAM_WRITE )) +/*N*/ pMedium->ReOpen(); +/*N*/ else +/*N*/ SaveCompleted( 0 ); +/*N*/ } +/*N*/ // entweder Save oder ConvertTo +/*N*/ else +/*?*/ bOk = SaveCompleted( NULL ); +/*N*/ } +/*N*/ +/*N*/ if ( bOk && pNewMed ) +/*N*/ { +/*N*/ if( bMedChanged ) +/*N*/ { +/*N*/ // Titel neu setzen +/*N*/ if ( pNewMed->GetName().Len() && +/*N*/ SFX_CREATE_MODE_EMBEDDED != eCreateMode ) +/*N*/ InvalidateName(); +/*N*/ SetModified(sal_False); // nur bei gesetztem Medium zur"ucksetzen +/*N*/ Broadcast( SfxSimpleHint(SFX_HINT_MODECHANGED) ); +/*N*/ } +/*N*/ } +/*N*/ +/*N*/ return bOk; +/*N*/ } + +//------------------------------------------------------------------------- + +/*N*/ sal_Bool SfxObjectShell::DoSaveCompleted( SvStorage * pNewStor ) +/*N*/ { +/*N*/ return DoSaveCompleted(pNewStor? new SfxMedium( pNewStor ): 0); +/*N*/ } + +//------------------------------------------------------------------------- + +/*?*/ sal_Bool SfxObjectShell::ConvertFrom +/*?*/ ( +/*?*/ SfxMedium& rMedium /* <SfxMedium>, welches die Quell-Datei beschreibt + (z.B. Dateiname, <SfxFilter>, Open-Modi etc.) */ +/*?*/ ) + +/* [Beschreibung] + + Diese Methode wird zum Laden von Dokumenten "uber alle Filter gerufen, + die nicht SFX_FILTER_OWN sind oder f"ur die kein Clipboard-Format + registriert wurde (also kein Storage-Format benutzen). Mit anderen Worten: + mit dieser Methode wird importiert. + + Das hier zu "offende File sollte "uber 'rMedium' ge"offnet werden, + um die richtigen Open-Modi zu gew"ahrleisten. Insbesondere wenn das + Format beibehalten wird (nur m"oglich bei SFX_FILTER_SIMULATE oder + SFX_FILTER_ONW) mu\s die Datei STREAM_SHARE_DENYWRITE ge"offnet werden. + + + [R"uckgabewert] + + sal_Bool sal_True + Das Dokument konnte geladen werden. + + sal_False + Das Dokument konnte nicht geladen werden, ein + Fehlercode ist mit <SvMedium::GetError()const> zu + erhalten. + + + [Beispiel] + + sal_Bool DocSh::ConvertFrom( SfxMedium &rMedium ) + { + SvStreamRef xStream = rMedium.GetInStream(); + if( xStream.is() ) + { + xStream->SetBufferSize(4096); + *xStream >> ...; + + // NICHT 'rMedium.CloseInStream()' rufen! File gelockt halten! + return SVSTREAM_OK == rMedium.GetError(); + } + + return sal_False; + } + + + [Querverweise] + + <SfxObjectShell::ConvertTo(SfxMedium&)> + <SFX_FILTER_REGISTRATION> +*/ +/*?*/ { +/*?*/ return sal_False; +/*?*/ } + +//------------------------------------------------------------------------- + +/*?*/ sal_Bool SfxObjectShell::ConvertTo +/*?*/ ( +/*?*/ SfxMedium& rMedium /* <SfxMedium>, welches die Ziel-Datei beschreibt + (z.B. Dateiname, <SfxFilter>, Open-Modi etc.) */ +/*?*/ ) + +/* [Beschreibung] + + Diese Methode wird zum Speichern von Dokumenten "uber alle Filter gerufen, + die nicht SFX_FILTER_OWN sind oder f"ur die kein Clipboard-Format + registriert wurde (also kein Storage-Format benutzen). Mit anderen Worten: + mit dieser Methode wird exportiert. + + Das hier zu "offende File sollte "uber 'rMedium' ge"offnet werden, + um die richtigen Open-Modi zu gew"ahrleisten. Insbesondere wenn das + Format beibehalten wird (nur m"oglich bei SFX_FILTER_SIMULATE oder + SFX_FILTER_ONW) mu\s die Datei auch nach dem Speichern im Modus + STREAM_SHARE_DENYWRITE ge"offnet bleiben. + + + [R"uckgabewert] + + sal_Bool sal_True + Das Dokument konnte gespeichert werden. + + sal_False + Das Dokument konnte nicht gespeichert werden, ein + Fehlercode ist mit <SvMedium::GetError()const> zu + erhalten. + + + [Beispiel] + + sal_Bool DocSh::ConvertTo( SfxMedium &rMedium ) + { + SvStreamRef xStream = rMedium.GetOutStream(); + if ( xStream.is() ) + { + xStream->SetBufferSize(4096); + *xStream << ...; + + rMedium.CloseOutStream(); // "offnet automatisch wieder den InStream + return SVSTREAM_OK == rMedium.GetError(); + } + return sal_False ; + } + + + [Querverweise] + + <SfxObjectShell::ConvertFrom(SfxMedium&)> + <SFX_FILTER_REGISTRATION> +*/ + +/*?*/ { +/*?*/ return sal_False; +/*?*/ } + +//------------------------------------------------------------------------- + + +/*?*/ sal_Bool SfxObjectShell::DoSave_Impl( const SfxItemSet* pArgs ) +/*?*/ {DBG_BF_ASSERT(0, "STRIP"); return sal_False; //STRIP001 +/*?*/ } + +//------------------------------------------------------------------------- + +/*?*/ sal_Bool SfxObjectShell::Save_Impl( const SfxItemSet* pSet ) +/*?*/ {DBG_BF_ASSERT(0, "STRIP"); return sal_False;//STRIP001 +/*?*/ } + +//------------------------------------------------------------------------- + +/*N*/ sal_Bool SfxObjectShell::CommonSaveAs_Impl +/*N*/ ( +/*N*/ const INetURLObject& aURL, +/*N*/ const String& aFilterName, +/*N*/ SfxItemSet* aParams +/*N*/ ) +/*N*/ { +/*N*/ SFX_APP()->NotifyEvent(SfxEventHint(SFX_EVENT_SAVEASDOC,this)); +/*N*/ BOOL bWasReadonly = IsReadOnly(); +/*N*/ +/*N*/ if( aURL.HasError() ) +/*N*/ { +/*N*/ SetError( ERRCODE_IO_INVALIDPARAMETER ); +/*N*/ return sal_False; +/*N*/ } +/*N*/ +/*N*/ DBG_ASSERT( aURL.GetProtocol() != INET_PROT_NOT_VALID, "Illegal URL!" ); +/*N*/ DBG_ASSERT( aParams->Count() != 0, "fehlerhafte Parameter"); +/*N*/ +/*N*/ SFX_ITEMSET_ARG( aParams, pSaveToItem, SfxBoolItem, SID_SAVETO, sal_False ); +/*N*/ sal_Bool bSaveTo = pSaveToItem ? pSaveToItem->GetValue() : sal_False; +/*N*/ +/*N*/ const SfxFilter* pFilter = GetFactory().GetFilterContainer()->GetFilter( aFilterName ); +/*N*/ if ( !pFilter +/*N*/ || !pFilter->CanExport() +/*N*/ || !bSaveTo && !pFilter->CanImport() ) +/*N*/ { +/*N*/ SetError( ERRCODE_IO_INVALIDPARAMETER ); +/*N*/ return sal_False; +/*N*/ } +/*N*/ +/*N*/ pImp->bPasswd = aParams && SFX_ITEM_SET == aParams->GetItemState(SID_PASSWORD); +/*N*/ +/*N*/ SfxMedium *pActMed = GetMedium(); +/*N*/ const INetURLObject aActName(pActMed->GetName()); +/*N*/ +/*N*/ if ( aURL == aActName +/*N*/ && aURL != INetURLObject( OUString::createFromAscii( "private:stream" ) ) ) +/*N*/ { +/*?*/ if ( IsReadOnly() ) +/*?*/ { +/*?*/ SetError(ERRCODE_SFX_DOCUMENTREADONLY); +/*?*/ return sal_False; +/*?*/ } +/*?*/ // gleicher Filter? -> Save() +/*?*/ const SfxFilter *pFilter = pActMed->GetFilter(); +/*?*/ if ( pFilter && pFilter->GetFilterName() == aFilterName ) +/*?*/ { +/*?*/ pImp->bIsSaving=sal_False; +/*?*/ if ( aParams ) +/*?*/ { +/*?*/ SfxItemSet* pSet = pMedium->GetItemSet(); +/*?*/ pSet->ClearItem( SID_PASSWORD ); +/*?*/ pSet->Put( *aParams ); +/*?*/ } +/*?*/ return DoSave_Impl(); +/*?*/ } +/*N*/ } + +/*N*/ if( SFX_ITEM_SET != aParams->GetItemState(SID_UNPACK) && SvtSaveOptions().IsSaveUnpacked() ) +/*N*/ aParams->Put( SfxBoolItem( SID_UNPACK, sal_False ) ); +/*N*/ +/*N*/ if ( PreDoSaveAs_Impl(aURL.GetMainURL( INetURLObject::NO_DECODE ),aFilterName,aParams)) +/*N*/ { +/*N*/ pImp->bWaitingForPicklist = sal_True; +/*N*/ if (!pImp->bSetStandardName) +/*N*/ pImp->bDidWarnFormat=sal_False; +/*N*/ +/*N*/ // Daten am Medium updaten +/*N*/ SfxItemSet *pSet = GetMedium()->GetItemSet(); +/*N*/ pSet->ClearItem( SID_INTERACTIONHANDLER ); +/*N*/ +/*N*/ if ( !bSaveTo ) +/*N*/ { +/*N*/ pSet->ClearItem( SID_REFERER ); +/*N*/ pSet->ClearItem( SID_POSTDATA ); +/*N*/ pSet->ClearItem( SID_TEMPLATE ); +/*N*/ pSet->ClearItem( SID_DOC_READONLY ); +/*N*/ pSet->ClearItem( SID_CONTENTTYPE ); +/*N*/ pSet->ClearItem( SID_CHARSET ); +/*N*/ pSet->ClearItem( SID_FILTER_NAME ); +/*N*/ pSet->ClearItem( SID_OPTIONS ); +/*N*/ //pSet->ClearItem( SID_FILE_FILTEROPTIONS ); +/*N*/ pSet->ClearItem( SID_VERSION ); +/*N*/ //pSet->ClearItem( SID_USE_FILTEROPTIONS ); +/*N*/ pSet->ClearItem( SID_EDITDOC ); +/*N*/ +/*N*/ SFX_ITEMSET_GET( (*aParams), pFilterItem, SfxStringItem, SID_FILTER_NAME, sal_False ); +/*N*/ if ( pFilterItem ) +/*N*/ pSet->Put( *pFilterItem ); +/*N*/ +/*N*/ SFX_ITEMSET_GET( (*aParams), pOptionsItem, SfxStringItem, SID_OPTIONS, sal_False ); +/*N*/ if ( pOptionsItem ) +/*N*/ pSet->Put( *pOptionsItem ); +/*N*/ +/*N*/ SFX_ITEMSET_GET( (*aParams), pFilterOptItem, SfxStringItem, SID_FILE_FILTEROPTIONS, sal_False ); +/*N*/ if ( pFilterOptItem ) +/*N*/ pSet->Put( *pFilterOptItem ); +/*N*/ } +/*N*/ +/*N*/ SFX_APP()->NotifyEvent(SfxEventHint(SFX_EVENT_SAVEASDOCDONE,this)); +/*N*/ +/*N*/ if ( bWasReadonly && !bSaveTo ) +/*N*/ Broadcast( SfxSimpleHint(SFX_HINT_MODECHANGED) ); +/*N*/ +/*N*/ return sal_True; +/*N*/ } +/*N*/ else +/*N*/ return sal_False; +/*N*/ } + +//------------------------------------------------------------------------- + +/*N*/ sal_Bool SfxObjectShell::PreDoSaveAs_Impl +/*N*/ ( +/*N*/ const String& rFileName, +/*N*/ const String& aFilterName, +/*N*/ SfxItemSet* pParams +/*N*/ ) +/*N*/ { +/*N*/ // copy all items stored in the itemset of the current medium +/*N*/ SfxAllItemSet* pMergedParams = new SfxAllItemSet( *pMedium->GetItemSet() ); +/*N*/ +/*N*/ // in "SaveAs" title and password will be cleared ( maybe the new itemset contains new values, otherwise they will be empty ) +/*N*/ pMergedParams->ClearItem( SID_PASSWORD ); +/*N*/ pMergedParams->ClearItem( SID_DOCINFO_TITLE ); +/*N*/ +/*N*/ pMergedParams->ClearItem( SID_INPUTSTREAM ); +/*N*/ pMergedParams->ClearItem( SID_CONTENT ); +/*N*/ +/*N*/ pMergedParams->ClearItem( SID_REPAIRPACKAGE ); +/*N*/ +/*N*/ // "SaveAs" will never store any version information - it's a complete new file ! +/*N*/ pMergedParams->ClearItem( SID_VERSION ); +/*N*/ +/*N*/ // merge the new parameters into the copy +/*N*/ // all values present in both itemsets will be overwritten by the new parameters +/*N*/ if( pParams ) +/*N*/ pMergedParams->Put( *pParams ); +/*N*/ //DELETEZ( pParams ); +/*N*/ +/*N*/ #ifdef DBG_UTIL +/*N*/ if ( pMergedParams->GetItemState( SID_DOC_SALVAGE) >= SFX_ITEM_SET ) +/*N*/ DBG_ERROR("Salvage item present in Itemset, check the parameters!"); +/*N*/ #endif +/*N*/ +/*N*/ // should be unneccessary - too hot to handle! +/*N*/ pMergedParams->ClearItem( SID_DOC_SALVAGE ); +/*N*/ +/*N*/ // take over the new merged itemset +/*N*/ pParams = pMergedParams; +/*N*/ +/*N*/ // create a medium for the target URL +/*N*/ SfxMedium *pNewFile = new SfxMedium( rFileName, STREAM_READWRITE | STREAM_SHARE_DENYWRITE, sal_False, 0, pParams ); +/*N*/ +/*N*/ // set filter; if no filter is given, take the default filter of the factory +/*N*/ if ( aFilterName.Len() ) +/*N*/ pNewFile->SetFilter( GetFactory(), aFilterName ); +/*N*/ else +/*N*/ pNewFile->SetFilter( GetFactory().GetFilterContainer()->GetFilter(0) ); +/*N*/ +/*N*/ // saving is alway done using a temporary file +/*N*/ pNewFile->CreateTempFileNoCopy(); +/*N*/ if ( pNewFile->GetErrorCode() != ERRCODE_NONE ) +/*N*/ { +/*N*/ // creating temporary file failed ( f.e. floppy disk not inserted! ) +/*N*/ SetError( pNewFile->GetError() ); +/*N*/ delete pNewFile; +/*N*/ return sal_False; +/*N*/ } +/*N*/ +/*N*/ // check if a "SaveTo" is wanted, no "SaveAs" +/*N*/ SFX_ITEMSET_ARG( pParams, pSaveToItem, SfxBoolItem, SID_SAVETO, sal_False ); +/*N*/ sal_Bool bCopyTo = GetCreateMode() == SFX_CREATE_MODE_EMBEDDED || pSaveToItem && pSaveToItem->GetValue(); +/*N*/ +/*N*/ // some base URL stuff ( awful, but not avoidable ... ) +/*N*/ const String aOldURL( ::binfilter::StaticBaseUrl::GetBaseURL() ); +/*N*/ if( GetCreateMode() != SFX_CREATE_MODE_EMBEDDED ) +/*N*/ if ( ShallSetBaseURL_Impl(*pNewFile) ) +/*N*/ ::binfilter::StaticBaseUrl::SetBaseURL( pNewFile->GetBaseURL() ); +/*N*/ else +/*N*/ ::binfilter::StaticBaseUrl::SetBaseURL( String() ); +/*N*/ +/*N*/ // distinguish between "Save" and "SaveAs" +/*N*/ pImp-> bIsSaving = sal_False; +/*N*/ +/*N*/ sal_Bool bToOwnFormat = sal_True;//STRIP007 IsOwnStorageFormat_Impl(*pNewFile); +/*N*/ if ( bToOwnFormat ) +/*N*/ { +/*N*/ // If the filter is a "cross export" filter ( f.e. a filter for exporting an impress document from +/*N*/ // a draw document ), the ClassId of the destination storage is different from the ClassId of this +/*N*/ // document. It can be retrieved from the default filter for the desired target format +/*N*/ long nFormat = pNewFile->GetFilter()->GetFormat(); +/*N*/ SfxFilterMatcher& rMatcher = SFX_APP()->GetFilterMatcher(); +/*N*/ const SfxFilter *pFilt = rMatcher.GetFilter4ClipBoardId( nFormat ); +/*N*/ if ( pFilt ) +/*N*/ { +/*N*/ if ( pFilt->GetFilterContainer() != pNewFile->GetFilter()->GetFilterContainer() ) +/*N*/ pNewFile->GetStorage()->SetClass( SvFactory::GetServerName( nFormat ), nFormat, pFilt->GetTypeName() ); +/*N*/ } +/*N*/ } +/*N*/ +/*N*/ if ( GetMedium()->GetFilter() && ( GetMedium()->GetFilter()->GetFilterFlags() & SFX_FILTER_PACKED ) ) +/*N*/ {DBG_BF_ASSERT(0, "STRIP"); //STRIP001 +/*N*/ } +/*N*/ +/*N*/ // Save the document ( first as temporary file, then transfer to the target URL by committing the medium ) +/*N*/ sal_Bool bOk = sal_False; +/*N*/ if ( !pNewFile->GetErrorCode() && SaveTo_Impl( *pNewFile, NULL, sal_True ) ) +/*N*/ { +/*N*/ bOk = sal_True; +/*N*/ +/*N*/ // restore old BaseURL +/*N*/ ::binfilter::StaticBaseUrl::SetBaseURL( aOldURL ); +/*N*/ +/*N*/ // transfer a possible error from the medium to the document +/*N*/ SetError( pNewFile->GetErrorCode() ); +/*N*/ +/*N*/ // notify the document that saving was done successfully +/*N*/ if ( bCopyTo ) +/*N*/ { +/*N*/ if ( IsHandsOff() ) +/*N*/ bOk = DoSaveCompleted( pMedium ); +/*N*/ } +/*N*/ else +/*N*/ { +/*N*/ // Muss !!! +/*N*/ if ( bToOwnFormat ) +/*N*/ SetFileName( pNewFile->GetPhysicalName() ); +/*N*/ +/*N*/ bOk = DoSaveCompleted( pNewFile ); +/*N*/ } +/*N*/ +/*N*/ if( bOk ) +/*N*/ { +/*N*/ if( !bCopyTo ) +/*N*/ SetModified( sal_False ); +/*N*/ } +/*N*/ else +/*N*/ { +/*N*/ DBG_ASSERT( !bCopyTo, "Error while reconnecting to medium, can't be handled!"); +/*N*/ SetError( pNewFile->GetErrorCode() ); +/*N*/ +/*N*/ if ( !bCopyTo ) +/*N*/ { +/*N*/ // reconnect to the old medium +/*?*/ BOOL bRet = DoSaveCompleted( pMedium ); +/*?*/ DBG_ASSERT( bRet, "Error in DoSaveCompleted, can't be handled!"); +/*N*/ } +/*N*/ +/*N*/ DELETEZ( pNewFile ); +/*N*/ } +/*N*/ +/*N*/ String aPasswd; +/*N*/ if ( IsOwnStorageFormat_Impl( *GetMedium() ) && GetPasswd_Impl( GetMedium()->GetItemSet(), aPasswd ) ) +/*?*/ GetMedium()->GetStorage()->SetKey( S2BS( aPasswd ) ); //!!! (pb) needs new implementation +/*N*/ } +/*N*/ else +/*N*/ { +/*?*/ ::binfilter::StaticBaseUrl::SetBaseURL( aOldURL ); +/*?*/ SetError( pNewFile->GetErrorCode() ); +/*?*/ +/*?*/ // reconnect to the old storage +/*?*/ if ( IsHandsOff() ) +/*?*/ DoSaveCompleted( pMedium ); +/*?*/ else +/*?*/ DoSaveCompleted( (SvStorage*)0 ); +/*?*/ +/*?*/ DELETEZ( pNewFile ); +/*N*/ } +/*N*/ +/*N*/ if( !bOk ) +/*?*/ SetModified( sal_True ); +/*N*/ +/*N*/ if ( bCopyTo ) +/*N*/ DELETEZ( pNewFile ); +/*N*/ +/*N*/ return bOk; +/*N*/ } + +//------------------------------------------------------------------------ + +/*?*/ sal_Bool SfxObjectShell::LoadFrom( SvStorage *pStor ) +/*?*/ { +/*?*/ GetConfigManager(); +/*?*/ GetDocInfo().Load(pStor); +/*?*/ return sal_True; +/*?*/ } + +//------------------------------------------------------------------------- + +/*N*/ sal_Bool SfxObjectShell::IsInformationLost() +/*N*/ { +/*N*/ const SfxFilter *pFilt = GetMedium()->GetFilter(); +/*N*/ if ( pFilt == GetFactory().GetFilterContainer()->GetFilter(0) ) +/*N*/ return sal_False; +/*N*/ return pFilt && pFilt->IsAlienFormat() && pImp->bDidDangerousSave && !(pFilt->GetFilterFlags() & SFX_FILTER_SILENTEXPORT); +/*N*/ } + +/*N*/ sal_Bool SfxObjectShell::LoadOwnFormat( SfxMedium& rMedium ) +/*N*/ { +/*N*/ SvStorageRef xStor = rMedium.GetStorage(); +/*N*/ if ( xStor.Is() ) +/*N*/ { +/*N*/ if ( rMedium.GetFileVersion() ) +/*N*/ xStor->SetVersion( rMedium.GetFileVersion() ); +/*N*/ +/*N*/ // Password +/*N*/ SFX_ITEMSET_ARG( rMedium.GetItemSet(), pPasswdItem, SfxStringItem, SID_PASSWORD, sal_False ); +/*N*/ if ( pPasswdItem || ERRCODE_IO_ABORT != CheckPasswd_Impl( this, SFX_APP()->GetPool(), pMedium ) ) +/*N*/ { +/*N*/ String aPasswd; +/*N*/ if ( GetPasswd_Impl(pMedium->GetItemSet(), aPasswd) ) +/*N*/ xStor->SetKey( S2BS( aPasswd ) ); //!!! (pb) needs new implementation +/*N*/ +/*N*/ // load document + sal_Bool bRet = Load( xStor ); + if ( bRet ) + GetConfigManager( TRUE ); + return bRet; +/*N*/ } +/*N*/ return sal_False; +/*N*/ } +/*N*/ else +/*N*/ return sal_False; +/*N*/ } + +/*N*/ sal_Bool SfxObjectShell::SaveAsOwnFormat( SfxMedium& rMedium ) +/*N*/ { +/*N*/ SvStorageRef xStor = rMedium.GetStorage(); +/*N*/ if( xStor.Is() ) +/*N*/ { +/*N*/ ULONG nVersion = rMedium.GetFilter()->GetVersion(); +/*N*/ xStor->SetVersion( nVersion ); +/*N*/ +/*N*/ // Initialize Basic +/*N*/ GetBasicManager(); +/*N*/ +/*N*/ // Save dialog container +/*N*/ if( nVersion >= 6200 ) +/*N*/ { +/*N*/ SfxDialogLibraryContainer* pDialogCont = pImp->pDialogLibContainer; +/*N*/ if( pDialogCont ) +/*N*/ pDialogCont->storeLibrariesToStorage( (SotStorage*)(SvStorage*)xStor ); +/*N*/ +/*N*/ SfxScriptLibraryContainer* pBasicCont = pImp->pBasicLibContainer; +/*N*/ if( pBasicCont ) +/*N*/ pBasicCont->storeLibrariesToStorage( (SotStorage*)(SvStorage*)xStor ); +/*N*/ +/*N*/ // Konfiguration schreiben +/*N*/ if ( GetConfigManager() ) +/*N*/ { +/* //!MBA + if ( rDocInfo.HasTemplateConfig() ) + { + const String aTemplFileName( rDocInfo.GetTemplateFileName() ); + if ( aTemplFileName.Len() ) + { + INetURLObject aURL( aTemplFileName ); + DBG_ASSERT( aURL.GetProtocol() != INET_PROT_NOT_VALID, "Illegal URL !" ); + + SvStorageRef aStor = new SvStorage( aURL.GetMainURL( INetURLObject::NO_DECODE ) ); + if ( SVSTREAM_OK == aStor->GetError() ) + { + GetConfigManager()->StoreConfiguration(aStor); + if (aRef->IsStream(SfxConfigManager::GetStreamName())) + aRef->Remove(SfxConfigManager::GetStreamName()); + } + } + } + else + */ +/*N*/ { +//! MBA GetConfigManager()->SetModified( sal_True ); +/*N*/ SotStorageRef xCfgStor = pImp->pCfgMgr->GetConfigurationStorage( xStor ); +/*N*/ if ( pImp->pCfgMgr->StoreConfiguration( xCfgStor ) ) +/*N*/ xCfgStor->Commit(); +/*N*/ } +/*N*/ } +/*N*/ +/*N*/ } +/*N*/ +/*N*/ const SfxFilter* pFilter = rMedium.GetFilter(); +/*N*/ return SaveAs( xStor ); +/*N*/ } +/*N*/ else return sal_False; +/*N*/ } + + +/*N*/ void SfxObjectShell::AddXMLAsZipToTheStorage( SvStorage& rRoot ) +/*N*/ { +/*N*/ static struct _ObjExpType { +/*N*/ sal_Bool (SvtAddXMLToStorageOptions:: *fnIsAdd)() const; +/*N*/ const sal_Char* pModuleNm; +/*N*/ // GlobalNameId +/*N*/ UINT32 n1; +/*N*/ USHORT n2, n3; +/*N*/ BYTE b8, b9, b10, b11, b12, b13, b14, b15; +/*N*/ } aArr[] = { +/*N*/ { &SvtAddXMLToStorageOptions::IsWriter_Add_XML_to_Storage, +/*N*/ "Writer", BF_SO3_SW_CLASSID_50 }, +/*N*/ { &SvtAddXMLToStorageOptions::IsCalc_Add_XML_to_Storage, +/*N*/ "Calc", BF_SO3_SC_CLASSID_50 }, +/*N*/ { &SvtAddXMLToStorageOptions::IsImpress_Add_XML_to_Storage, +/*N*/ "Impress", BF_SO3_SIMPRESS_CLASSID_50 }, +/*N*/ { &SvtAddXMLToStorageOptions::IsDraw_Add_XML_to_Storage, +/*N*/ "Draw", BF_SO3_SDRAW_CLASSID_50 }, +/*N*/ { 0 } +/*N*/ }; +/*N*/ +/*N*/ for( const _ObjExpType* pArr = aArr; pArr->fnIsAdd; ++pArr ) +/*N*/ { +/*N*/ SvGlobalName aGlbNm( pArr->n1, pArr->n2, pArr->n3, +/*N*/ pArr->b8, pArr->b9, pArr->b10, pArr->b11, +/*N*/ pArr->b12, pArr->b13, pArr->b14, pArr->b15 ); +/*N*/ if( *GetSvFactory() == aGlbNm ) +/*N*/ { +/*?*/ // 1. check if the option is set and unequal 0 or is not set +/*?*/ SvtAddXMLToStorageOptions aOpt; +/*?*/ if( (aOpt.*pArr->fnIsAdd)() ) +/*?*/ { +/*?*/ // the flag is set +/*?*/ String sStr; +/*?*/ sStr.AssignAscii( "StarOffice XML (" ); +/*?*/ sStr.AppendAscii( pArr->pModuleNm ); +/*?*/ sStr += ')'; +/*?*/ // 2. exist the XML filter? "StarOffice XML (<Application>)"? +/*?*/ const SfxFilter* pFilter = GetFactory().GetFilterContainer()-> +/*?*/ GetFilter4FilterName( sStr ); +/*?*/ if( pFilter ) +/*?*/ { +/*?*/ ::utl::TempFile aTempFile; +/*?*/ SfxMedium aTmpMed( aTempFile.GetURL(), STREAM_READ | STREAM_WRITE, sal_True ); +/*?*/ +/*?*/ aTmpMed.SetFilter( pFilter ); +/*?*/ +/*?*/ if( ConvertTo( aTmpMed ) ) +/*?*/ { +/*?*/ SvStorage* pXMLStor = aTmpMed.GetStorage(); +/*?*/ +/*?*/ if( pXMLStor ) +/*?*/ { +/*?*/ const String aContent( String::CreateFromAscii( "Content" ) ); +/*?*/ const String aContentXML( String::CreateFromAscii( "Content.xml" ) ); +/*?*/ const String aXMLFormatName( String::CreateFromAscii( "XMLFormat2" ) ); +/*?*/ String aContentName; +/*?*/ +/*?*/ if( pXMLStor->IsContained( aContentXML ) ) +/*?*/ aContentName = aContentXML; +/*?*/ else if( pXMLStor->IsContained( aContent ) ) +/*?*/ aContentName = aContent; +/*?*/ +/*?*/ if( aContentName.Len() ) +/*?*/ { +/*?*/ SvStorageStreamRef xOStm( rRoot.OpenStream( aXMLFormatName, STREAM_WRITE | STREAM_TRUNC ) ); +/*?*/ SvStorageStreamRef xIStm( pXMLStor->OpenStream( aContentName, STREAM_READ | STREAM_NOCREATE ) ); +/*?*/ +/*?*/ if( xOStm.Is() && xIStm.Is() ) +/*?*/ { +/*?*/ ZCodec aCodec; +/*?*/ +/*?*/ xIStm->Seek( 0 ); +/*?*/ aCodec.BeginCompression( ZCODEC_BEST_COMPRESSION ); +/*?*/ aCodec.Compress( *xIStm, *xOStm ); +/*?*/ aCodec.EndCompression(); +/*?*/ xOStm->Commit(); +/*?*/ } +/*?*/ } +/*?*/ } +/*?*/ } +/*?*/ } +/*?*/ } +/*?*/ // that's all +/*?*/ break; +/*N*/ } +/*N*/ } +/*N*/ } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |