diff options
Diffstat (limited to 'svx/source/svxlink/fileobj.cxx')
-rw-r--r-- | svx/source/svxlink/fileobj.cxx | 726 |
1 files changed, 0 insertions, 726 deletions
diff --git a/svx/source/svxlink/fileobj.cxx b/svx/source/svxlink/fileobj.cxx deleted file mode 100644 index 6e0925da2bb2..000000000000 --- a/svx/source/svxlink/fileobj.cxx +++ /dev/null @@ -1,726 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: fileobj.cxx,v $ - * $Revision: 1.24 $ - * - * 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. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svx.hxx" -#include <vcl/wrkwin.hxx> -#include <vcl/msgbox.hxx> -#include <tools/urlobj.hxx> -#include <tools/stream.hxx> -#include <sot/formats.hxx> -#include <svtools/filter.hxx> -#include <sfx2/lnkbase.hxx> -#include <sfx2/app.hxx> -#include <sfx2/progress.hxx> -#ifndef _SFX_INTERNO_HXX -//#include <sfx2/interno.hxx> -#endif -#include <sfx2/docfilt.hxx> -#include <sfx2/filedlghelper.hxx> -#include <sot/exchange.hxx> -#include <com/sun/star/uno/Any.hxx> -#include <com/sun/star/uno/Sequence.hxx> -#include <sfx2/docfac.hxx> -#include <com/sun/star/document/XTypeDetection.hpp> -#include <comphelper/mediadescriptor.hxx> -#include <comphelper/processfactory.hxx> - -#include "fileobj.hxx" -#include "linkmgr.hxx" -#include <svx/dialmgr.hxx> -#include <svx/dialogs.hrc> -#include "xoutbmp.hxx" -#include "opengrf.hxx" -#include "svx/impgrf.hxx" - -namespace css = ::com::sun::star; - -#define FILETYPE_TEXT 1 -#define FILETYPE_GRF 2 -#define FILETYPE_OBJECT 3 - -struct Impl_DownLoadData -{ - Graphic aGrf; - Timer aTimer; - - Impl_DownLoadData( const Link& rLink ) - { - aTimer.SetTimeout( 100 ); - aTimer.SetTimeoutHdl( rLink ); - aGrf.SetDefaultType(); - } - ~Impl_DownLoadData() - { - aTimer.Stop(); - } -}; - -// -------------------------------------------------------------------------- - - -SvFileObject::SvFileObject() : - pDownLoadData( NULL ), pOldParent( NULL ), nType( FILETYPE_TEXT ) -{ - bLoadAgain = TRUE; - bSynchron = bLoadError = bWaitForData = bDataReady = bNativFormat = - bClearMedium = bStateChangeCalled = bInCallDownLoad = FALSE; -} - - -SvFileObject::~SvFileObject() -{ - if ( xMed.Is() ) - { - xMed->SetDataAvailableLink( Link() ); - xMed->SetDoneLink( Link() ); - xMed.Clear(); - } - delete pDownLoadData; -} - - -BOOL SvFileObject::GetData( ::com::sun::star::uno::Any & rData, - const String & rMimeType, - BOOL bGetSynchron ) -{ - ULONG nFmt = SotExchange::GetFormatStringId( rMimeType ); - switch( nType ) - { - case FILETYPE_TEXT: - if( FORMAT_FILE == nFmt ) - { - // das Medium muss in der Applikation geoffnet werden, um die - // relativen Datei Links aufzuloesen!!!! Wird ueber den - // LinkManager und damit von dessen Storage erledigt. - rData <<= rtl::OUString( sFileNm ); - } - break; - - case FILETYPE_GRF: - if( !bLoadError ) - { - SfxMediumRef xTmpMed; - - if( FORMAT_GDIMETAFILE == nFmt || FORMAT_BITMAP == nFmt || - SOT_FORMATSTR_ID_SVXB == nFmt ) - { - Graphic aGrf; - - //JP 15.07.98: Bug 52959 - // falls das Nativformat doch erwuenscht ist, muss am - // Ende das Flag zurueckgesetzt werden. -// wird einzig und allein im sw/ndgrf.cxx benutzt, wenn der Link vom -// GraphicNode entfernt wird. - BOOL bOldNativFormat = bNativFormat; -//!!?? bNativFormat = 0 != (ASPECT_ICON & pSvData->GetAspect()); - - // falls gedruckt werden soll, warten wir bis die - // Daten vorhanden sind - if( bGetSynchron ) - { - // testhalber mal ein LoadFile rufen um das nach- - // laden ueberahaupt anzustossen - if( !xMed.Is() ) - LoadFile_Impl(); - - if( !bInCallDownLoad ) - { - xTmpMed = xMed; - while( bWaitForData ) - Application::Reschedule(); - - xMed = xTmpMed; - bClearMedium = TRUE; - } - } - - if( pDownLoadData || - ( !bWaitForData && ( xMed.Is() || // wurde als URL geladen - ( bSynchron && LoadFile_Impl() && xMed.Is() ) )) ) - { - // falls - - // falls es uebers Internet gesogen wurde, nicht - // wieder versuchen - if( !bGetSynchron ) - bLoadAgain = !xMed->IsRemote(); - bLoadError = !GetGraphic_Impl( aGrf, xMed->GetInStream() ); - } - else if( !LoadFile_Impl() || - !GetGraphic_Impl( aGrf, xMed.Is() ? xMed->GetInStream() : 0 )) - { - if( !xMed.Is() ) - break; - aGrf.SetDefaultType(); - } - - if( SOT_FORMATSTR_ID_SVXB != nFmt ) - nFmt = (bLoadError || GRAPHIC_BITMAP == aGrf.GetType()) - ? FORMAT_BITMAP - : FORMAT_GDIMETAFILE; - - SvMemoryStream aMemStm( 0, 65535 ); - switch ( nFmt ) - { - case SOT_FORMATSTR_ID_SVXB: - if( GRAPHIC_NONE != aGrf.GetType() ) - { - aMemStm.SetVersion( SOFFICE_FILEFORMAT_50 ); - aMemStm << aGrf; - } - break; - - case FORMAT_BITMAP: - if( !aGrf.GetBitmap().IsEmpty()) - aMemStm << aGrf.GetBitmap(); - break; - - default: - if( aGrf.GetGDIMetaFile().GetActionCount() ) - { - GDIMetaFile aMeta( aGrf.GetGDIMetaFile() ); - aMeta.Write( aMemStm ); - } - } - rData <<= css::uno::Sequence< sal_Int8 >( (sal_Int8*) aMemStm.GetData(), - aMemStm.Seek( STREAM_SEEK_TO_END ) ); - - bNativFormat = bOldNativFormat; - - // alles fertig? - if( xMed.Is() && !bSynchron && bClearMedium ) - { - xMed.Clear(); - bClearMedium = FALSE; - } - } - } - break; - case FILETYPE_OBJECT: - // TODO/LATER: possibility to insert a new object - rData <<= rtl::OUString( sFileNm ); - break; - } - return sal_True/*0 != aTypeList.Count()*/; -} - - - - -BOOL SvFileObject::Connect( sfx2::SvBaseLink* pLink ) -{ - if( !pLink || !pLink->GetLinkManager() ) - return FALSE; - - // teste doch mal, ob nicht ein anderer Link mit der gleichen - // Verbindung schon existiert - pLink->GetLinkManager()->GetDisplayNames( pLink, 0, &sFileNm, 0, &sFilter ); - - if( OBJECT_CLIENT_GRF == pLink->GetObjType() ) - { - SfxObjectShellRef pShell = pLink->GetLinkManager()->GetPersist(); - if( pShell.Is() ) - { - if( pShell->IsAbortingImport() ) - return FALSE; - - if( pShell->GetMedium() ) - sReferer = pShell->GetMedium()->GetName(); - } - } - - switch( pLink->GetObjType() ) - { - case OBJECT_CLIENT_GRF: - nType = FILETYPE_GRF; - bSynchron = pLink->IsSynchron(); - break; - - case OBJECT_CLIENT_FILE: - nType = FILETYPE_TEXT; - break; - - case OBJECT_CLIENT_OLE: - nType = FILETYPE_OBJECT; - // TODO/LATER: introduce own type to be used for exchanging - break; - - default: - return FALSE; - } - - SetUpdateTimeout( 0 ); - - // und jetzt bei diesem oder gefundenem Pseudo-Object anmelden - AddDataAdvise( pLink, SotExchange::GetFormatMimeType( pLink->GetContentType()), 0 ); - return TRUE; -} - - -BOOL SvFileObject::LoadFile_Impl() -{ - // wir sind noch im Laden!! - if( bWaitForData || !bLoadAgain || xMed.Is() || pDownLoadData ) - return FALSE; - - // z.Z. nur auf die aktuelle DocShell - xMed = new SfxMedium( sFileNm, STREAM_STD_READ, TRUE ); - SvLinkSource::StreamToLoadFrom aStreamToLoadFrom = - getStreamToLoadFrom(); - xMed->setStreamToLoadFrom( - aStreamToLoadFrom.m_xInputStreamToLoadFrom, - aStreamToLoadFrom.m_bIsReadOnly); - // setStreamToLoadFrom(0,0); - // Keinen Eintrag im Roter Button Menu - xMed->SetDontCreateCancellable(); - if( sReferer.Len() ) - xMed->SetReferer( sReferer ); - - if( !bSynchron ) - { - bLoadAgain = bDataReady = bInNewData = FALSE; - bWaitForData = TRUE; - - SfxMediumRef xTmpMed = xMed; - xMed->SetDataAvailableLink( STATIC_LINK( this, SvFileObject, LoadGrfNewData_Impl ) ); - bInCallDownLoad = TRUE; - xMed->DownLoad( STATIC_LINK( this, SvFileObject, LoadGrfReady_Impl ) ); - bInCallDownLoad = FALSE; - - bClearMedium = !xMed.Is(); - if( bClearMedium ) - xMed = xTmpMed; // falls gleich im DownLoad schon schluss ist - return bDataReady; - } - - bWaitForData = TRUE; - bDataReady = bInNewData = FALSE; - xMed->DownLoad(); - bLoadAgain = !xMed->IsRemote(); - bWaitForData = FALSE; - - // Grafik ist fertig, also DataChanged von der Statusaederung schicken: - SendStateChg_Impl( xMed->GetInStream() && xMed->GetInStream()->GetError() - ? STATE_LOAD_ERROR : STATE_LOAD_OK ); - - return TRUE; -} - - -BOOL SvFileObject::GetGraphic_Impl( Graphic& rGrf, SvStream* pStream ) -{ - GraphicFilter* pGF = GetGrfFilter(); - - const USHORT nFilter = sFilter.Len() && pGF->GetImportFormatCount() - ? pGF->GetImportFormatNumber( sFilter ) - : GRFILTER_FORMAT_DONTKNOW; - - String aEmptyStr; - int nRes; - - // vermeiden, dass ein native Link angelegt wird - if( ( !pStream || !pDownLoadData ) && !rGrf.IsLink() && - !rGrf.GetContext() && !bNativFormat ) - rGrf.SetLink( GfxLink() ); - - if( !pStream ) - nRes = xMed.Is() ? GRFILTER_OPENERROR - : pGF->ImportGraphic( rGrf, INetURLObject(sFileNm), - nFilter ); - else if( !pDownLoadData ) - { - pStream->Seek( STREAM_SEEK_TO_BEGIN ); - nRes = pGF->ImportGraphic( rGrf, aEmptyStr, *pStream, nFilter ); - } - else - { - nRes = pGF->ImportGraphic( pDownLoadData->aGrf, aEmptyStr, - *pStream, nFilter ); - - if( pDownLoadData ) - { - rGrf = pDownLoadData->aGrf; - if( GRAPHIC_NONE == rGrf.GetType() ) - rGrf.SetDefaultType(); - - - if( !pDownLoadData->aGrf.GetContext() ) - { - xMed->SetDataAvailableLink( Link() ); -// xMed->SetDoneLink( Link() ); - delete pDownLoadData, pDownLoadData = 0; - bDataReady = TRUE; - bWaitForData = FALSE; - } - else if( FALSE ) - { - // Timer aufsetzen, um zurueck zukehren - pDownLoadData->aTimer.Start(); - } - } - } - - if( pStream && ERRCODE_IO_PENDING == pStream->GetError() ) - pStream->ResetError(); - -#ifdef DBG_UTIL - if( nRes ) - { - if( xMed.Is() && !pStream ) - { - DBG_WARNING3( "GrafikFehler [%d] - [%s] URL[%s]", - nRes, - xMed->GetPhysicalName().GetBuffer(), - sFileNm.GetBuffer() ); - } - else - { - DBG_WARNING2( "GrafikFehler [%d] - [%s]", - nRes, sFileNm.GetBuffer() ); - } - } -#endif - - return GRFILTER_OK == nRes; -} - -/** detect the filter of the given file - - @param _rURL - specifies the URL of the file which filter is to detected.<br/> - If the URL doesn't denote a valid (existent and accessible) file, the - request is silently dropped. -*/ -String impl_getFilter( const String& _rURL ) -{ - String sFilter; - if ( _rURL.Len() == 0 ) - return sFilter; - - try - { - css::uno::Reference< ::com::sun::star::document::XTypeDetection > xTypeDetection( - ::comphelper::getProcessServiceFactory()->createInstance( - ::rtl::OUString::createFromAscii("com.sun.star.document.TypeDetection") ), - css::uno::UNO_QUERY ); - if ( xTypeDetection.is() ) - { - ::comphelper::MediaDescriptor aDescr; - aDescr[ ::comphelper::MediaDescriptor::PROP_URL() ] <<= ::rtl::OUString( _rURL ); - css::uno::Sequence< css::beans::PropertyValue > aDescrList = - aDescr.getAsConstPropertyValueList(); - ::rtl::OUString sType = xTypeDetection->queryTypeByDescriptor( aDescrList, sal_True ); - if ( sType.getLength() ) - { - css::uno::Reference< css::container::XNameAccess > xTypeCont( xTypeDetection, - css::uno::UNO_QUERY ); - if ( xTypeCont.is() ) - { - ::comphelper::SequenceAsHashMap lTypeProps( xTypeCont->getByName( sType ) ); - sFilter = lTypeProps.getUnpackedValueOrDefault( - ::rtl::OUString::createFromAscii("PreferredFilter"), ::rtl::OUString() ); - } - } - } - } - catch( const css::uno::Exception& ) - { - } - - return sFilter; -} - -void SvFileObject::Edit( Window* pParent, sfx2::SvBaseLink* pLink, const Link& rEndEditHdl ) -{ - aEndEditLink = rEndEditHdl; - String sFile, sRange, sTmpFilter; - if( pLink && pLink->GetLinkManager() ) - { - pLink->GetLinkManager()->GetDisplayNames( pLink, 0, &sFile, &sRange, &sTmpFilter ); - - switch( pLink->GetObjType() ) - { - case OBJECT_CLIENT_GRF: - { - nType = FILETYPE_GRF; // falls noch nicht gesetzt - - SvxOpenGraphicDialog aDlg(ResId(RID_SVXSTR_EDITGRFLINK, DIALOG_MGR())); - aDlg.EnableLink(sal_False); - aDlg.SetPath( sFile, sal_True ); - aDlg.SetCurrentFilter( sTmpFilter ); - - if( !aDlg.Execute() ) - { - sFile = aDlg.GetPath(); - sFile += ::sfx2::cTokenSeperator; - sFile += ::sfx2::cTokenSeperator; - sFile += aDlg.GetCurrentFilter(); - - if ( aEndEditLink.IsSet() ) - aEndEditLink.Call( &sFile ); - } - else - sFile.Erase(); - } - break; - - case OBJECT_CLIENT_OLE: - { - nType = FILETYPE_OBJECT; // if not set already - pOldParent = Application::GetDefDialogParent(); - Application::SetDefDialogParent( pParent ); - - ::sfx2::FileDialogHelper* pFileDlg = - pLink->GetFileDialog( (SFXWB_INSERT | WB_3DLOOK), String() ); - pFileDlg->StartExecuteModal( LINK( this, SvFileObject, DialogClosedHdl ) ); - } - break; - - case OBJECT_CLIENT_FILE: - { - nType = FILETYPE_TEXT; // if not set already - pOldParent = Application::GetDefDialogParent(); - Application::SetDefDialogParent( pParent ); - - String sFactory; - SfxObjectShell* pShell = pLink->GetLinkManager()->GetPersist(); - if ( pShell ) - sFactory = pShell->GetFactory().GetFactoryName(); - - ::sfx2::FileDialogHelper* pFileDlg = - pLink->GetFileDialog( (SFXWB_INSERT | WB_3DLOOK), sFactory ); - pFileDlg->StartExecuteModal( LINK( this, SvFileObject, DialogClosedHdl ) ); - } - break; - - default: - sFile.Erase(); - } - } -} - -IMPL_STATIC_LINK( SvFileObject, LoadGrfReady_Impl, void*, EMPTYARG ) -{ - // wenn wir von hier kommen, kann es kein Fehler mehr sein - pThis->bLoadError = FALSE; - pThis->bWaitForData = FALSE; - pThis->bInCallDownLoad = FALSE; - - if( !pThis->bInNewData && !pThis->bDataReady ) - { - // Grafik ist fertig, also DataChanged von der Status- - // aederung schicken: - pThis->bDataReady = TRUE; - pThis->SendStateChg_Impl( STATE_LOAD_OK ); - - // und dann nochmal die Daten senden - pThis->NotifyDataChanged(); - } - - if( pThis->bDataReady ) - { - pThis->bLoadAgain = TRUE; - if( pThis->xMed.Is() ) - { - pThis->xMed->SetDataAvailableLink( Link() ); - pThis->xMed->SetDoneLink( Link() ); - - Application::PostUserEvent( - STATIC_LINK( pThis, SvFileObject, DelMedium_Impl ), - new SfxMediumRef( pThis->xMed )); - pThis->xMed.Clear(); - } - if( pThis->pDownLoadData ) - delete pThis->pDownLoadData, pThis->pDownLoadData = 0; - } - - return 0; -} - -IMPL_STATIC_LINK( SvFileObject, DelMedium_Impl, SfxMediumRef*, pDelMed ) -{ - (void)pThis; - delete pDelMed; - return 0; -} - -IMPL_STATIC_LINK( SvFileObject, LoadGrfNewData_Impl, void*, EMPTYARG ) -{ - // wenn wir von hier kommen, kann es kein Fehler mehr sein - if( pThis->bInNewData ) - return 0; - - pThis->bInNewData = TRUE; - pThis->bLoadError = FALSE; - - if( !pThis->pDownLoadData ) - { - pThis->pDownLoadData = new Impl_DownLoadData( - STATIC_LINK( pThis, SvFileObject, LoadGrfNewData_Impl ) ); - - // Null-Link setzen, damit keine temporaeren Grafiken - // rausgeswapt werden; der Filter prueft, ob schon - // ein Link gesetzt ist => falls dies zutrifft, wird - // _kein_ neuer Link gesetzt; der Link muss hier gesetzt werden, - // (bevor das erste Mal gefiltert wird), um zu verhindern, - // dass der Kontext zurueckgesetzt wird (aynchrones Laden) - if( !pThis->bNativFormat ) - { - static GfxLink aDummyLink; - pThis->pDownLoadData->aGrf.SetLink( aDummyLink ); - } - } - - pThis->NotifyDataChanged(); - - SvStream* pStrm = pThis->xMed.Is() ? pThis->xMed->GetInStream() : 0; - if( pStrm && pStrm->GetError() ) - { - if( ERRCODE_IO_PENDING == pStrm->GetError() ) - pStrm->ResetError(); - - // im DataChanged ein DataReady? - else if( pThis->bWaitForData && pThis->pDownLoadData ) - { - pThis->bLoadError = TRUE; - } - } - - if( pThis->bDataReady ) - { - // Grafik ist fertig, also DataChanged von der Status- - // aederung schicken: - pThis->SendStateChg_Impl( pStrm->GetError() ? STATE_LOAD_ERROR - : STATE_LOAD_OK ); - } - - pThis->bInNewData = FALSE; - return 0; -} - -IMPL_LINK( SvFileObject, DialogClosedHdl, sfx2::FileDialogHelper*, _pFileDlg ) -{ - String sFile; - Application::SetDefDialogParent( pOldParent ); - - if ( FILETYPE_TEXT == nType || FILETYPE_OBJECT == nType ) - { - if ( _pFileDlg && _pFileDlg->GetError() == ERRCODE_NONE ) - { - String sURL( _pFileDlg->GetPath() ); - sFile = sURL; - sFile += ::sfx2::cTokenSeperator; - sFile += ::sfx2::cTokenSeperator; - sFile += impl_getFilter( sURL ); - } - } - else - { - DBG_ERRORFILE( "SvFileObject::DialogClosedHdl(): wrong file type" ); - } - - if ( aEndEditLink.IsSet() ) - aEndEditLink.Call( &sFile ); - return 0; -} - -/* [Beschreibung] - - Die Methode stellt fest, ob aus einem DDE-Object die Daten gelesen - werden kann. - Zurueckgegeben wird: - ERRCODE_NONE wenn sie komplett gelesen wurde - ERRCODE_SO_PENDING wenn sie noch nicht komplett gelesen wurde - ERRCODE_SO_FALSE sonst -*/ -BOOL SvFileObject::IsPending() const -{ - return FILETYPE_GRF == nType && !bLoadError && - ( pDownLoadData || bWaitForData ); -} -BOOL SvFileObject::IsDataComplete() const -{ - BOOL bRet = FALSE; - if( FILETYPE_GRF != nType ) - bRet = TRUE; - else if( !bLoadError && ( !bWaitForData && !pDownLoadData )) - { - SvFileObject* pThis = (SvFileObject*)this; - if( bDataReady || - ( bSynchron && pThis->LoadFile_Impl() && xMed.Is() ) ) - bRet = TRUE; - else - { - INetURLObject aUrl( sFileNm ); - if( aUrl.HasError() || - INET_PROT_NOT_VALID == aUrl.GetProtocol() ) - bRet = TRUE; - } - } - return bRet; -} - - - -void SvFileObject::CancelTransfers() -{ - if( xMed.Is() ) - xMed->CancelTransfers(); - - // und aus dem Cache austragen, wenn man mitten im Laden ist - if( !bDataReady ) - { - // nicht noch mal aufsetzen - bLoadAgain = FALSE; - bDataReady = bLoadError = bWaitForData = TRUE; - SendStateChg_Impl( STATE_LOAD_ABORT ); - } -} - - -void SvFileObject::SetTransferPriority( USHORT ) -{ -} - - -void SvFileObject::SendStateChg_Impl( LinkState nState ) -{ - if( !bStateChangeCalled && HasDataLinks() ) - { - css::uno::Any aAny; - aAny <<= rtl::OUString::valueOf( (sal_Int32)nState ); - DataChanged( SotExchange::GetFormatName( - SvxLinkManager::RegisterStatusInfoId()), aAny ); - bStateChangeCalled = TRUE; - } -} - - |