1d119d52dSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3d119d52dSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4d119d52dSAndrew Rist * or more contributor license agreements. See the NOTICE file 5d119d52dSAndrew Rist * distributed with this work for additional information 6d119d52dSAndrew Rist * regarding copyright ownership. The ASF licenses this file 7d119d52dSAndrew Rist * to you under the Apache License, Version 2.0 (the 8d119d52dSAndrew Rist * "License"); you may not use this file except in compliance 9d119d52dSAndrew Rist * with the License. You may obtain a copy of the License at 10d119d52dSAndrew Rist * 11d119d52dSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12d119d52dSAndrew Rist * 13d119d52dSAndrew Rist * Unless required by applicable law or agreed to in writing, 14d119d52dSAndrew Rist * software distributed under the License is distributed on an 15d119d52dSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16d119d52dSAndrew Rist * KIND, either express or implied. See the License for the 17d119d52dSAndrew Rist * specific language governing permissions and limitations 18d119d52dSAndrew Rist * under the License. 19d119d52dSAndrew Rist * 20d119d52dSAndrew Rist *************************************************************/ 21d119d52dSAndrew Rist 22cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 23cdf0e10cSrcweir #include "precompiled_sfx2.hxx" 24cdf0e10cSrcweir 25cdf0e10cSrcweir #include <vcl/wrkwin.hxx> 26cdf0e10cSrcweir #include <vcl/msgbox.hxx> 27cdf0e10cSrcweir #include <tools/urlobj.hxx> 28cdf0e10cSrcweir #include <tools/stream.hxx> 29cdf0e10cSrcweir #include <sot/formats.hxx> 30cdf0e10cSrcweir #include <svtools/filter.hxx> 31cdf0e10cSrcweir #include <sfx2/lnkbase.hxx> 32cdf0e10cSrcweir #include <sfx2/app.hxx> 33cdf0e10cSrcweir #include <sfx2/progress.hxx> 34cdf0e10cSrcweir #include <sfx2/docfilt.hxx> 35cdf0e10cSrcweir #include <sfx2/filedlghelper.hxx> 36cdf0e10cSrcweir #include <sot/exchange.hxx> 37cdf0e10cSrcweir #include <com/sun/star/uno/Any.hxx> 38cdf0e10cSrcweir #include <com/sun/star/uno/Sequence.hxx> 39cdf0e10cSrcweir #include <sfx2/docfac.hxx> 40cdf0e10cSrcweir #include <com/sun/star/document/XTypeDetection.hpp> 41cdf0e10cSrcweir #include <comphelper/mediadescriptor.hxx> 42cdf0e10cSrcweir #include <comphelper/processfactory.hxx> 43cdf0e10cSrcweir #include <sfx2/linkmgr.hxx> 44cdf0e10cSrcweir #include <sfx2/opengrf.hxx> 45cdf0e10cSrcweir #include "sfx2/sfxresid.hxx" 46cdf0e10cSrcweir #include "fileobj.hxx" 47cdf0e10cSrcweir #include "app.hrc" 48*45fd3b9aSArmin Le Grand #include <vcl/dibtools.hxx> 49cdf0e10cSrcweir 50cdf0e10cSrcweir namespace css = ::com::sun::star; 51cdf0e10cSrcweir 52cdf0e10cSrcweir #define FILETYPE_TEXT 1 53cdf0e10cSrcweir #define FILETYPE_GRF 2 54cdf0e10cSrcweir #define FILETYPE_OBJECT 3 55cdf0e10cSrcweir 56cdf0e10cSrcweir struct Impl_DownLoadData 57cdf0e10cSrcweir { 58cdf0e10cSrcweir Graphic aGrf; 59cdf0e10cSrcweir Timer aTimer; 60cdf0e10cSrcweir 61cdf0e10cSrcweir Impl_DownLoadData( const Link& rLink ) 62cdf0e10cSrcweir { 63cdf0e10cSrcweir aTimer.SetTimeout( 100 ); 64cdf0e10cSrcweir aTimer.SetTimeoutHdl( rLink ); 65cdf0e10cSrcweir aGrf.SetDefaultType(); 66cdf0e10cSrcweir } 67cdf0e10cSrcweir ~Impl_DownLoadData() 68cdf0e10cSrcweir { 69cdf0e10cSrcweir aTimer.Stop(); 70cdf0e10cSrcweir } 71cdf0e10cSrcweir }; 72cdf0e10cSrcweir 73cdf0e10cSrcweir // -------------------------------------------------------------------------- 74cdf0e10cSrcweir 75cdf0e10cSrcweir 76cdf0e10cSrcweir SvFileObject::SvFileObject() : 77cdf0e10cSrcweir pDownLoadData( NULL ), pOldParent( NULL ), nType( FILETYPE_TEXT ) 78cdf0e10cSrcweir { 79cdf0e10cSrcweir bLoadAgain = sal_True; 80cdf0e10cSrcweir bSynchron = bLoadError = bWaitForData = bDataReady = bNativFormat = 81cdf0e10cSrcweir bClearMedium = bStateChangeCalled = bInCallDownLoad = sal_False; 82cdf0e10cSrcweir } 83cdf0e10cSrcweir 84cdf0e10cSrcweir 85cdf0e10cSrcweir SvFileObject::~SvFileObject() 86cdf0e10cSrcweir { 87cdf0e10cSrcweir if ( xMed.Is() ) 88cdf0e10cSrcweir { 89cdf0e10cSrcweir xMed->SetDataAvailableLink( Link() ); 90cdf0e10cSrcweir xMed->SetDoneLink( Link() ); 91cdf0e10cSrcweir xMed.Clear(); 92cdf0e10cSrcweir } 93cdf0e10cSrcweir delete pDownLoadData; 94cdf0e10cSrcweir } 95cdf0e10cSrcweir 96cdf0e10cSrcweir 97cdf0e10cSrcweir sal_Bool SvFileObject::GetData( ::com::sun::star::uno::Any & rData, 98cdf0e10cSrcweir const String & rMimeType, 99cdf0e10cSrcweir sal_Bool bGetSynchron ) 100cdf0e10cSrcweir { 101cdf0e10cSrcweir sal_uIntPtr nFmt = SotExchange::GetFormatStringId( rMimeType ); 102cdf0e10cSrcweir switch( nType ) 103cdf0e10cSrcweir { 104cdf0e10cSrcweir case FILETYPE_TEXT: 105cdf0e10cSrcweir if( FORMAT_FILE == nFmt ) 106cdf0e10cSrcweir { 107cdf0e10cSrcweir // das Medium muss in der Applikation geoffnet werden, um die 108cdf0e10cSrcweir // relativen Datei Links aufzuloesen!!!! Wird ueber den 109cdf0e10cSrcweir // LinkManager und damit von dessen Storage erledigt. 110cdf0e10cSrcweir rData <<= rtl::OUString( sFileNm ); 111cdf0e10cSrcweir } 112cdf0e10cSrcweir break; 113cdf0e10cSrcweir 114cdf0e10cSrcweir case FILETYPE_GRF: 115cdf0e10cSrcweir if( !bLoadError ) 116cdf0e10cSrcweir { 117cdf0e10cSrcweir SfxMediumRef xTmpMed; 118cdf0e10cSrcweir 119cdf0e10cSrcweir if( FORMAT_GDIMETAFILE == nFmt || FORMAT_BITMAP == nFmt || 120cdf0e10cSrcweir SOT_FORMATSTR_ID_SVXB == nFmt ) 121cdf0e10cSrcweir { 122cdf0e10cSrcweir Graphic aGrf; 123cdf0e10cSrcweir 124cdf0e10cSrcweir //JP 15.07.98: Bug 52959 125cdf0e10cSrcweir // falls das Nativformat doch erwuenscht ist, muss am 126cdf0e10cSrcweir // Ende das Flag zurueckgesetzt werden. 127cdf0e10cSrcweir // wird einzig und allein im sw/ndgrf.cxx benutzt, wenn der Link vom 128cdf0e10cSrcweir // GraphicNode entfernt wird. 129cdf0e10cSrcweir sal_Bool bOldNativFormat = bNativFormat; 130cdf0e10cSrcweir //!!?? bNativFormat = 0 != (ASPECT_ICON & pSvData->GetAspect()); 131cdf0e10cSrcweir 132cdf0e10cSrcweir // falls gedruckt werden soll, warten wir bis die 133cdf0e10cSrcweir // Daten vorhanden sind 134cdf0e10cSrcweir if( bGetSynchron ) 135cdf0e10cSrcweir { 136cdf0e10cSrcweir // testhalber mal ein LoadFile rufen um das nach- 137cdf0e10cSrcweir // laden ueberahaupt anzustossen 138cdf0e10cSrcweir if( !xMed.Is() ) 139cdf0e10cSrcweir LoadFile_Impl(); 140cdf0e10cSrcweir 141cdf0e10cSrcweir if( !bInCallDownLoad ) 142cdf0e10cSrcweir { 143cdf0e10cSrcweir xTmpMed = xMed; 144cdf0e10cSrcweir while( bWaitForData ) 145cdf0e10cSrcweir Application::Reschedule(); 146cdf0e10cSrcweir 147cdf0e10cSrcweir xMed = xTmpMed; 148cdf0e10cSrcweir bClearMedium = sal_True; 149cdf0e10cSrcweir } 150cdf0e10cSrcweir } 151cdf0e10cSrcweir 152cdf0e10cSrcweir if( pDownLoadData || 153cdf0e10cSrcweir ( !bWaitForData && ( xMed.Is() || // wurde als URL geladen 154cdf0e10cSrcweir ( bSynchron && LoadFile_Impl() && xMed.Is() ) )) ) 155cdf0e10cSrcweir { 156cdf0e10cSrcweir // falls 157cdf0e10cSrcweir 158cdf0e10cSrcweir // falls es uebers Internet gesogen wurde, nicht 159cdf0e10cSrcweir // wieder versuchen 160cdf0e10cSrcweir if( !bGetSynchron ) 161cdf0e10cSrcweir bLoadAgain = !xMed->IsRemote(); 162cdf0e10cSrcweir bLoadError = !GetGraphic_Impl( aGrf, xMed->GetInStream() ); 163cdf0e10cSrcweir } 164cdf0e10cSrcweir else if( !LoadFile_Impl() || 165cdf0e10cSrcweir !GetGraphic_Impl( aGrf, xMed.Is() ? xMed->GetInStream() : 0 )) 166cdf0e10cSrcweir { 167cdf0e10cSrcweir if( !xMed.Is() ) 168cdf0e10cSrcweir break; 169cdf0e10cSrcweir aGrf.SetDefaultType(); 170cdf0e10cSrcweir } 171cdf0e10cSrcweir 172cdf0e10cSrcweir if( SOT_FORMATSTR_ID_SVXB != nFmt ) 173cdf0e10cSrcweir nFmt = (bLoadError || GRAPHIC_BITMAP == aGrf.GetType()) 174cdf0e10cSrcweir ? FORMAT_BITMAP 175cdf0e10cSrcweir : FORMAT_GDIMETAFILE; 176cdf0e10cSrcweir 177cdf0e10cSrcweir SvMemoryStream aMemStm( 0, 65535 ); 178cdf0e10cSrcweir switch ( nFmt ) 179cdf0e10cSrcweir { 180cdf0e10cSrcweir case SOT_FORMATSTR_ID_SVXB: 181cdf0e10cSrcweir if( GRAPHIC_NONE != aGrf.GetType() ) 182cdf0e10cSrcweir { 183cdf0e10cSrcweir aMemStm.SetVersion( SOFFICE_FILEFORMAT_50 ); 184cdf0e10cSrcweir aMemStm << aGrf; 185cdf0e10cSrcweir } 186cdf0e10cSrcweir break; 187cdf0e10cSrcweir 188cdf0e10cSrcweir case FORMAT_BITMAP: 189*45fd3b9aSArmin Le Grand { 190*45fd3b9aSArmin Le Grand const Bitmap aBitmap(aGrf.GetBitmap()); 191*45fd3b9aSArmin Le Grand 192*45fd3b9aSArmin Le Grand if(!aBitmap.IsEmpty()) 193*45fd3b9aSArmin Le Grand { 194*45fd3b9aSArmin Le Grand WriteDIB(aBitmap, aMemStm, false, true); 195*45fd3b9aSArmin Le Grand } 196*45fd3b9aSArmin Le Grand 197*45fd3b9aSArmin Le Grand break; 198*45fd3b9aSArmin Le Grand } 199cdf0e10cSrcweir 200cdf0e10cSrcweir default: 201cdf0e10cSrcweir if( aGrf.GetGDIMetaFile().GetActionCount() ) 202cdf0e10cSrcweir { 203cdf0e10cSrcweir GDIMetaFile aMeta( aGrf.GetGDIMetaFile() ); 204cdf0e10cSrcweir aMeta.Write( aMemStm ); 205cdf0e10cSrcweir } 206cdf0e10cSrcweir } 207cdf0e10cSrcweir rData <<= css::uno::Sequence< sal_Int8 >( (sal_Int8*) aMemStm.GetData(), 208cdf0e10cSrcweir aMemStm.Seek( STREAM_SEEK_TO_END ) ); 209cdf0e10cSrcweir 210cdf0e10cSrcweir bNativFormat = bOldNativFormat; 211cdf0e10cSrcweir 212cdf0e10cSrcweir // alles fertig? 213cdf0e10cSrcweir if( xMed.Is() && !bSynchron && bClearMedium ) 214cdf0e10cSrcweir { 215cdf0e10cSrcweir xMed.Clear(); 216cdf0e10cSrcweir bClearMedium = sal_False; 217cdf0e10cSrcweir } 218cdf0e10cSrcweir } 219cdf0e10cSrcweir } 220cdf0e10cSrcweir break; 221cdf0e10cSrcweir case FILETYPE_OBJECT: 222cdf0e10cSrcweir // TODO/LATER: possibility to insert a new object 223cdf0e10cSrcweir rData <<= rtl::OUString( sFileNm ); 224cdf0e10cSrcweir break; 225cdf0e10cSrcweir } 226cdf0e10cSrcweir return sal_True/*0 != aTypeList.Count()*/; 227cdf0e10cSrcweir } 228cdf0e10cSrcweir 229cdf0e10cSrcweir 230cdf0e10cSrcweir 231cdf0e10cSrcweir 232cdf0e10cSrcweir sal_Bool SvFileObject::Connect( sfx2::SvBaseLink* pLink ) 233cdf0e10cSrcweir { 234cdf0e10cSrcweir if( !pLink || !pLink->GetLinkManager() ) 235cdf0e10cSrcweir return sal_False; 236cdf0e10cSrcweir 237cdf0e10cSrcweir // teste doch mal, ob nicht ein anderer Link mit der gleichen 238cdf0e10cSrcweir // Verbindung schon existiert 239cdf0e10cSrcweir pLink->GetLinkManager()->GetDisplayNames( pLink, 0, &sFileNm, 0, &sFilter ); 240cdf0e10cSrcweir 241cdf0e10cSrcweir if( OBJECT_CLIENT_GRF == pLink->GetObjType() ) 242cdf0e10cSrcweir { 243cdf0e10cSrcweir SfxObjectShellRef pShell = pLink->GetLinkManager()->GetPersist(); 244cdf0e10cSrcweir if( pShell.Is() ) 245cdf0e10cSrcweir { 246cdf0e10cSrcweir if( pShell->IsAbortingImport() ) 247cdf0e10cSrcweir return sal_False; 248cdf0e10cSrcweir 249cdf0e10cSrcweir if( pShell->GetMedium() ) 250cdf0e10cSrcweir sReferer = pShell->GetMedium()->GetName(); 251cdf0e10cSrcweir } 252cdf0e10cSrcweir } 253cdf0e10cSrcweir 254cdf0e10cSrcweir switch( pLink->GetObjType() ) 255cdf0e10cSrcweir { 256cdf0e10cSrcweir case OBJECT_CLIENT_GRF: 257cdf0e10cSrcweir nType = FILETYPE_GRF; 258cdf0e10cSrcweir bSynchron = pLink->IsSynchron(); 259cdf0e10cSrcweir break; 260cdf0e10cSrcweir 261cdf0e10cSrcweir case OBJECT_CLIENT_FILE: 262cdf0e10cSrcweir nType = FILETYPE_TEXT; 263cdf0e10cSrcweir break; 264cdf0e10cSrcweir 265cdf0e10cSrcweir case OBJECT_CLIENT_OLE: 266cdf0e10cSrcweir nType = FILETYPE_OBJECT; 267cdf0e10cSrcweir // TODO/LATER: introduce own type to be used for exchanging 268cdf0e10cSrcweir break; 269cdf0e10cSrcweir 270cdf0e10cSrcweir default: 271cdf0e10cSrcweir return sal_False; 272cdf0e10cSrcweir } 273cdf0e10cSrcweir 274cdf0e10cSrcweir SetUpdateTimeout( 0 ); 275cdf0e10cSrcweir 276cdf0e10cSrcweir // und jetzt bei diesem oder gefundenem Pseudo-Object anmelden 277cdf0e10cSrcweir AddDataAdvise( pLink, SotExchange::GetFormatMimeType( pLink->GetContentType()), 0 ); 278cdf0e10cSrcweir return sal_True; 279cdf0e10cSrcweir } 280cdf0e10cSrcweir 281cdf0e10cSrcweir 282cdf0e10cSrcweir sal_Bool SvFileObject::LoadFile_Impl() 283cdf0e10cSrcweir { 284cdf0e10cSrcweir // wir sind noch im Laden!! 285cdf0e10cSrcweir if( bWaitForData || !bLoadAgain || xMed.Is() || pDownLoadData ) 286cdf0e10cSrcweir return sal_False; 287cdf0e10cSrcweir 288cdf0e10cSrcweir // z.Z. nur auf die aktuelle DocShell 289cdf0e10cSrcweir xMed = new SfxMedium( sFileNm, STREAM_STD_READ, sal_True ); 290cdf0e10cSrcweir SvLinkSource::StreamToLoadFrom aStreamToLoadFrom = 291cdf0e10cSrcweir getStreamToLoadFrom(); 292cdf0e10cSrcweir xMed->setStreamToLoadFrom( 293cdf0e10cSrcweir aStreamToLoadFrom.m_xInputStreamToLoadFrom, 294cdf0e10cSrcweir aStreamToLoadFrom.m_bIsReadOnly); 295cdf0e10cSrcweir // setStreamToLoadFrom(0,0); 296cdf0e10cSrcweir if( sReferer.Len() ) 297cdf0e10cSrcweir xMed->SetReferer( sReferer ); 298cdf0e10cSrcweir 299cdf0e10cSrcweir if( !bSynchron ) 300cdf0e10cSrcweir { 301cdf0e10cSrcweir bLoadAgain = bDataReady = bInNewData = sal_False; 302cdf0e10cSrcweir bWaitForData = sal_True; 303cdf0e10cSrcweir 304cdf0e10cSrcweir SfxMediumRef xTmpMed = xMed; 305cdf0e10cSrcweir xMed->SetDataAvailableLink( STATIC_LINK( this, SvFileObject, LoadGrfNewData_Impl ) ); 306cdf0e10cSrcweir bInCallDownLoad = sal_True; 307cdf0e10cSrcweir xMed->DownLoad( STATIC_LINK( this, SvFileObject, LoadGrfReady_Impl ) ); 308cdf0e10cSrcweir bInCallDownLoad = sal_False; 309cdf0e10cSrcweir 310cdf0e10cSrcweir bClearMedium = !xMed.Is(); 311cdf0e10cSrcweir if( bClearMedium ) 312cdf0e10cSrcweir xMed = xTmpMed; // falls gleich im DownLoad schon schluss ist 313cdf0e10cSrcweir return bDataReady; 314cdf0e10cSrcweir } 315cdf0e10cSrcweir 316cdf0e10cSrcweir bWaitForData = sal_True; 317cdf0e10cSrcweir bDataReady = bInNewData = sal_False; 318cdf0e10cSrcweir xMed->DownLoad(); 319cdf0e10cSrcweir bLoadAgain = !xMed->IsRemote(); 320cdf0e10cSrcweir bWaitForData = sal_False; 321cdf0e10cSrcweir 322cdf0e10cSrcweir // Grafik ist fertig, also DataChanged von der Statusaederung schicken: 323cdf0e10cSrcweir SendStateChg_Impl( xMed->GetInStream() && xMed->GetInStream()->GetError() 324cdf0e10cSrcweir ? sfx2::LinkManager::STATE_LOAD_ERROR : sfx2::LinkManager::STATE_LOAD_OK ); 325cdf0e10cSrcweir return sal_True; 326cdf0e10cSrcweir } 327cdf0e10cSrcweir 328cdf0e10cSrcweir 329cdf0e10cSrcweir sal_Bool SvFileObject::GetGraphic_Impl( Graphic& rGrf, SvStream* pStream ) 330cdf0e10cSrcweir { 331cdf0e10cSrcweir GraphicFilter* pGF = GraphicFilter::GetGraphicFilter(); 332cdf0e10cSrcweir 333cdf0e10cSrcweir const sal_uInt16 nFilter = sFilter.Len() && pGF->GetImportFormatCount() 334cdf0e10cSrcweir ? pGF->GetImportFormatNumber( sFilter ) 335cdf0e10cSrcweir : GRFILTER_FORMAT_DONTKNOW; 336cdf0e10cSrcweir 337cdf0e10cSrcweir String aEmptyStr; 338cdf0e10cSrcweir int nRes; 339cdf0e10cSrcweir 340cdf0e10cSrcweir // vermeiden, dass ein native Link angelegt wird 341cdf0e10cSrcweir if( ( !pStream || !pDownLoadData ) && !rGrf.IsLink() && 342cdf0e10cSrcweir !rGrf.GetContext() && !bNativFormat ) 343cdf0e10cSrcweir rGrf.SetLink( GfxLink() ); 344cdf0e10cSrcweir 345cdf0e10cSrcweir if( !pStream ) 346cdf0e10cSrcweir nRes = xMed.Is() ? GRFILTER_OPENERROR 347cdf0e10cSrcweir : pGF->ImportGraphic( rGrf, INetURLObject(sFileNm), 348cdf0e10cSrcweir nFilter ); 349cdf0e10cSrcweir else if( !pDownLoadData ) 350cdf0e10cSrcweir { 351cdf0e10cSrcweir pStream->Seek( STREAM_SEEK_TO_BEGIN ); 352cdf0e10cSrcweir nRes = pGF->ImportGraphic( rGrf, aEmptyStr, *pStream, nFilter ); 353cdf0e10cSrcweir } 354cdf0e10cSrcweir else 355cdf0e10cSrcweir { 356cdf0e10cSrcweir nRes = pGF->ImportGraphic( pDownLoadData->aGrf, aEmptyStr, 357cdf0e10cSrcweir *pStream, nFilter ); 358cdf0e10cSrcweir 359cdf0e10cSrcweir if( pDownLoadData ) 360cdf0e10cSrcweir { 361cdf0e10cSrcweir rGrf = pDownLoadData->aGrf; 362cdf0e10cSrcweir if( GRAPHIC_NONE == rGrf.GetType() ) 363cdf0e10cSrcweir rGrf.SetDefaultType(); 364cdf0e10cSrcweir 365cdf0e10cSrcweir 366cdf0e10cSrcweir if( !pDownLoadData->aGrf.GetContext() ) 367cdf0e10cSrcweir { 368cdf0e10cSrcweir xMed->SetDataAvailableLink( Link() ); 369cdf0e10cSrcweir // xMed->SetDoneLink( Link() ); 370cdf0e10cSrcweir delete pDownLoadData, pDownLoadData = 0; 371cdf0e10cSrcweir bDataReady = sal_True; 372cdf0e10cSrcweir bWaitForData = sal_False; 373cdf0e10cSrcweir } 374cdf0e10cSrcweir else if( sal_False ) 375cdf0e10cSrcweir { 376cdf0e10cSrcweir // Timer aufsetzen, um zurueck zukehren 377cdf0e10cSrcweir pDownLoadData->aTimer.Start(); 378cdf0e10cSrcweir } 379cdf0e10cSrcweir } 380cdf0e10cSrcweir } 381cdf0e10cSrcweir 382cdf0e10cSrcweir if( pStream && ERRCODE_IO_PENDING == pStream->GetError() ) 383cdf0e10cSrcweir pStream->ResetError(); 384cdf0e10cSrcweir 385cdf0e10cSrcweir #ifdef DBG_UTIL 386cdf0e10cSrcweir if( nRes ) 387cdf0e10cSrcweir { 388cdf0e10cSrcweir if( xMed.Is() && !pStream ) 389cdf0e10cSrcweir { 390cdf0e10cSrcweir DBG_WARNING3( "GrafikFehler [%d] - [%s] URL[%s]", 391cdf0e10cSrcweir nRes, 392cdf0e10cSrcweir xMed->GetPhysicalName().GetBuffer(), 393cdf0e10cSrcweir sFileNm.GetBuffer() ); 394cdf0e10cSrcweir } 395cdf0e10cSrcweir else 396cdf0e10cSrcweir { 397cdf0e10cSrcweir DBG_WARNING2( "GrafikFehler [%d] - [%s]", 398cdf0e10cSrcweir nRes, sFileNm.GetBuffer() ); 399cdf0e10cSrcweir } 400cdf0e10cSrcweir } 401cdf0e10cSrcweir #endif 402cdf0e10cSrcweir 403cdf0e10cSrcweir return GRFILTER_OK == nRes; 404cdf0e10cSrcweir } 405cdf0e10cSrcweir 406cdf0e10cSrcweir /** detect the filter of the given file 407cdf0e10cSrcweir 408cdf0e10cSrcweir @param _rURL 409cdf0e10cSrcweir specifies the URL of the file which filter is to detected.<br/> 410cdf0e10cSrcweir If the URL doesn't denote a valid (existent and accessible) file, the 411cdf0e10cSrcweir request is silently dropped. 412cdf0e10cSrcweir */ 413cdf0e10cSrcweir String impl_getFilter( const String& _rURL ) 414cdf0e10cSrcweir { 415cdf0e10cSrcweir String sFilter; 416cdf0e10cSrcweir if ( _rURL.Len() == 0 ) 417cdf0e10cSrcweir return sFilter; 418cdf0e10cSrcweir 419cdf0e10cSrcweir try 420cdf0e10cSrcweir { 421cdf0e10cSrcweir css::uno::Reference< ::com::sun::star::document::XTypeDetection > xTypeDetection( 422cdf0e10cSrcweir ::comphelper::getProcessServiceFactory()->createInstance( 423cdf0e10cSrcweir ::rtl::OUString::createFromAscii("com.sun.star.document.TypeDetection") ), 424cdf0e10cSrcweir css::uno::UNO_QUERY ); 425cdf0e10cSrcweir if ( xTypeDetection.is() ) 426cdf0e10cSrcweir { 427cdf0e10cSrcweir ::comphelper::MediaDescriptor aDescr; 428cdf0e10cSrcweir aDescr[ ::comphelper::MediaDescriptor::PROP_URL() ] <<= ::rtl::OUString( _rURL ); 429cdf0e10cSrcweir css::uno::Sequence< css::beans::PropertyValue > aDescrList = 430cdf0e10cSrcweir aDescr.getAsConstPropertyValueList(); 431cdf0e10cSrcweir ::rtl::OUString sType = xTypeDetection->queryTypeByDescriptor( aDescrList, sal_True ); 432cdf0e10cSrcweir if ( sType.getLength() ) 433cdf0e10cSrcweir { 434cdf0e10cSrcweir css::uno::Reference< css::container::XNameAccess > xTypeCont( xTypeDetection, 435cdf0e10cSrcweir css::uno::UNO_QUERY ); 436cdf0e10cSrcweir if ( xTypeCont.is() ) 437cdf0e10cSrcweir { 438cdf0e10cSrcweir ::comphelper::SequenceAsHashMap lTypeProps( xTypeCont->getByName( sType ) ); 439cdf0e10cSrcweir sFilter = lTypeProps.getUnpackedValueOrDefault( 440cdf0e10cSrcweir ::rtl::OUString::createFromAscii("PreferredFilter"), ::rtl::OUString() ); 441cdf0e10cSrcweir } 442cdf0e10cSrcweir } 443cdf0e10cSrcweir } 444cdf0e10cSrcweir } 445cdf0e10cSrcweir catch( const css::uno::Exception& ) 446cdf0e10cSrcweir { 447cdf0e10cSrcweir } 448cdf0e10cSrcweir 449cdf0e10cSrcweir return sFilter; 450cdf0e10cSrcweir } 451cdf0e10cSrcweir 452cdf0e10cSrcweir void SvFileObject::Edit( Window* pParent, sfx2::SvBaseLink* pLink, const Link& rEndEditHdl ) 453cdf0e10cSrcweir { 454cdf0e10cSrcweir aEndEditLink = rEndEditHdl; 455cdf0e10cSrcweir String sFile, sRange, sTmpFilter; 456cdf0e10cSrcweir if( pLink && pLink->GetLinkManager() ) 457cdf0e10cSrcweir { 458cdf0e10cSrcweir pLink->GetLinkManager()->GetDisplayNames( pLink, 0, &sFile, &sRange, &sTmpFilter ); 459cdf0e10cSrcweir 460cdf0e10cSrcweir switch( pLink->GetObjType() ) 461cdf0e10cSrcweir { 462cdf0e10cSrcweir case OBJECT_CLIENT_GRF: 463cdf0e10cSrcweir { 464cdf0e10cSrcweir nType = FILETYPE_GRF; // falls noch nicht gesetzt 465cdf0e10cSrcweir 466cdf0e10cSrcweir SvxOpenGraphicDialog aDlg(SfxResId(RID_SVXSTR_EDITGRFLINK)); 467cdf0e10cSrcweir aDlg.EnableLink(sal_False); 468cdf0e10cSrcweir aDlg.SetPath( sFile, sal_True ); 469cdf0e10cSrcweir aDlg.SetCurrentFilter( sTmpFilter ); 470cdf0e10cSrcweir 471cdf0e10cSrcweir if( !aDlg.Execute() ) 472cdf0e10cSrcweir { 473cdf0e10cSrcweir sFile = aDlg.GetPath(); 474cdf0e10cSrcweir sFile += ::sfx2::cTokenSeperator; 475cdf0e10cSrcweir sFile += ::sfx2::cTokenSeperator; 476cdf0e10cSrcweir sFile += aDlg.GetCurrentFilter(); 477cdf0e10cSrcweir 478cdf0e10cSrcweir if ( aEndEditLink.IsSet() ) 479cdf0e10cSrcweir aEndEditLink.Call( &sFile ); 480cdf0e10cSrcweir } 481cdf0e10cSrcweir else 482cdf0e10cSrcweir sFile.Erase(); 483cdf0e10cSrcweir } 484cdf0e10cSrcweir break; 485cdf0e10cSrcweir 486cdf0e10cSrcweir case OBJECT_CLIENT_OLE: 487cdf0e10cSrcweir { 488cdf0e10cSrcweir nType = FILETYPE_OBJECT; // if not set already 489cdf0e10cSrcweir pOldParent = Application::GetDefDialogParent(); 490cdf0e10cSrcweir Application::SetDefDialogParent( pParent ); 491cdf0e10cSrcweir 492cdf0e10cSrcweir ::sfx2::FileDialogHelper* pFileDlg = 493cdf0e10cSrcweir pLink->GetFileDialog( (SFXWB_INSERT | WB_3DLOOK), String() ); 494cdf0e10cSrcweir pFileDlg->StartExecuteModal( LINK( this, SvFileObject, DialogClosedHdl ) ); 495cdf0e10cSrcweir } 496cdf0e10cSrcweir break; 497cdf0e10cSrcweir 498cdf0e10cSrcweir case OBJECT_CLIENT_FILE: 499cdf0e10cSrcweir { 500cdf0e10cSrcweir nType = FILETYPE_TEXT; // if not set already 501cdf0e10cSrcweir pOldParent = Application::GetDefDialogParent(); 502cdf0e10cSrcweir Application::SetDefDialogParent( pParent ); 503cdf0e10cSrcweir 504cdf0e10cSrcweir String sFactory; 505cdf0e10cSrcweir SfxObjectShell* pShell = pLink->GetLinkManager()->GetPersist(); 506cdf0e10cSrcweir if ( pShell ) 507cdf0e10cSrcweir sFactory = pShell->GetFactory().GetFactoryName(); 508cdf0e10cSrcweir 509cdf0e10cSrcweir ::sfx2::FileDialogHelper* pFileDlg = 510cdf0e10cSrcweir pLink->GetFileDialog( (SFXWB_INSERT | WB_3DLOOK), sFactory ); 511cdf0e10cSrcweir pFileDlg->StartExecuteModal( LINK( this, SvFileObject, DialogClosedHdl ) ); 512cdf0e10cSrcweir } 513cdf0e10cSrcweir break; 514cdf0e10cSrcweir 515cdf0e10cSrcweir default: 516cdf0e10cSrcweir sFile.Erase(); 517cdf0e10cSrcweir } 518cdf0e10cSrcweir } 519cdf0e10cSrcweir } 520cdf0e10cSrcweir 521cdf0e10cSrcweir IMPL_STATIC_LINK( SvFileObject, LoadGrfReady_Impl, void*, EMPTYARG ) 522cdf0e10cSrcweir { 523cdf0e10cSrcweir // wenn wir von hier kommen, kann es kein Fehler mehr sein 524cdf0e10cSrcweir pThis->bLoadError = sal_False; 525cdf0e10cSrcweir pThis->bWaitForData = sal_False; 526cdf0e10cSrcweir pThis->bInCallDownLoad = sal_False; 527cdf0e10cSrcweir 528cdf0e10cSrcweir if( !pThis->bInNewData && !pThis->bDataReady ) 529cdf0e10cSrcweir { 530cdf0e10cSrcweir // Grafik ist fertig, also DataChanged von der Status- 531cdf0e10cSrcweir // aederung schicken: 532cdf0e10cSrcweir pThis->bDataReady = sal_True; 533cdf0e10cSrcweir pThis->SendStateChg_Impl( sfx2::LinkManager::STATE_LOAD_OK ); 534cdf0e10cSrcweir 535cdf0e10cSrcweir // und dann nochmal die Daten senden 536cdf0e10cSrcweir pThis->NotifyDataChanged(); 537cdf0e10cSrcweir } 538cdf0e10cSrcweir 539cdf0e10cSrcweir if( pThis->bDataReady ) 540cdf0e10cSrcweir { 541cdf0e10cSrcweir pThis->bLoadAgain = sal_True; 542cdf0e10cSrcweir if( pThis->xMed.Is() ) 543cdf0e10cSrcweir { 544cdf0e10cSrcweir pThis->xMed->SetDataAvailableLink( Link() ); 545cdf0e10cSrcweir pThis->xMed->SetDoneLink( Link() ); 546cdf0e10cSrcweir 547cdf0e10cSrcweir Application::PostUserEvent( 548cdf0e10cSrcweir STATIC_LINK( pThis, SvFileObject, DelMedium_Impl ), 549cdf0e10cSrcweir new SfxMediumRef( pThis->xMed )); 550cdf0e10cSrcweir pThis->xMed.Clear(); 551cdf0e10cSrcweir } 552cdf0e10cSrcweir if( pThis->pDownLoadData ) 553cdf0e10cSrcweir delete pThis->pDownLoadData, pThis->pDownLoadData = 0; 554cdf0e10cSrcweir } 555cdf0e10cSrcweir 556cdf0e10cSrcweir return 0; 557cdf0e10cSrcweir } 558cdf0e10cSrcweir 559cdf0e10cSrcweir IMPL_STATIC_LINK( SvFileObject, DelMedium_Impl, SfxMediumRef*, pDelMed ) 560cdf0e10cSrcweir { 561cdf0e10cSrcweir (void)pThis; 562cdf0e10cSrcweir delete pDelMed; 563cdf0e10cSrcweir return 0; 564cdf0e10cSrcweir } 565cdf0e10cSrcweir 566cdf0e10cSrcweir IMPL_STATIC_LINK( SvFileObject, LoadGrfNewData_Impl, void*, EMPTYARG ) 567cdf0e10cSrcweir { 568cdf0e10cSrcweir // wenn wir von hier kommen, kann es kein Fehler mehr sein 569cdf0e10cSrcweir if( pThis->bInNewData ) 570cdf0e10cSrcweir return 0; 571cdf0e10cSrcweir 572cdf0e10cSrcweir pThis->bInNewData = sal_True; 573cdf0e10cSrcweir pThis->bLoadError = sal_False; 574cdf0e10cSrcweir 575cdf0e10cSrcweir if( !pThis->pDownLoadData ) 576cdf0e10cSrcweir { 577cdf0e10cSrcweir pThis->pDownLoadData = new Impl_DownLoadData( 578cdf0e10cSrcweir STATIC_LINK( pThis, SvFileObject, LoadGrfNewData_Impl ) ); 579cdf0e10cSrcweir 580cdf0e10cSrcweir // Null-Link setzen, damit keine temporaeren Grafiken 581cdf0e10cSrcweir // rausgeswapt werden; der Filter prueft, ob schon 582cdf0e10cSrcweir // ein Link gesetzt ist => falls dies zutrifft, wird 583cdf0e10cSrcweir // _kein_ neuer Link gesetzt; der Link muss hier gesetzt werden, 584cdf0e10cSrcweir // (bevor das erste Mal gefiltert wird), um zu verhindern, 585cdf0e10cSrcweir // dass der Kontext zurueckgesetzt wird (aynchrones Laden) 586cdf0e10cSrcweir if( !pThis->bNativFormat ) 587cdf0e10cSrcweir { 588cdf0e10cSrcweir static GfxLink aDummyLink; 589cdf0e10cSrcweir pThis->pDownLoadData->aGrf.SetLink( aDummyLink ); 590cdf0e10cSrcweir } 591cdf0e10cSrcweir } 592cdf0e10cSrcweir 593cdf0e10cSrcweir pThis->NotifyDataChanged(); 594cdf0e10cSrcweir 595cdf0e10cSrcweir SvStream* pStrm = pThis->xMed.Is() ? pThis->xMed->GetInStream() : 0; 596cdf0e10cSrcweir if( pStrm && pStrm->GetError() ) 597cdf0e10cSrcweir { 598cdf0e10cSrcweir if( ERRCODE_IO_PENDING == pStrm->GetError() ) 599cdf0e10cSrcweir pStrm->ResetError(); 600cdf0e10cSrcweir 601cdf0e10cSrcweir // im DataChanged ein DataReady? 602cdf0e10cSrcweir else if( pThis->bWaitForData && pThis->pDownLoadData ) 603cdf0e10cSrcweir { 604cdf0e10cSrcweir pThis->bLoadError = sal_True; 605cdf0e10cSrcweir } 606cdf0e10cSrcweir } 607cdf0e10cSrcweir 608cdf0e10cSrcweir if( pThis->bDataReady ) 609cdf0e10cSrcweir { 610cdf0e10cSrcweir // Grafik ist fertig, also DataChanged von der Status- 611cdf0e10cSrcweir // aederung schicken: 612cdf0e10cSrcweir pThis->SendStateChg_Impl( pStrm->GetError() ? sfx2::LinkManager::STATE_LOAD_ERROR : sfx2::LinkManager::STATE_LOAD_OK ); 613cdf0e10cSrcweir } 614cdf0e10cSrcweir 615cdf0e10cSrcweir pThis->bInNewData = sal_False; 616cdf0e10cSrcweir return 0; 617cdf0e10cSrcweir } 618cdf0e10cSrcweir 619cdf0e10cSrcweir IMPL_LINK( SvFileObject, DialogClosedHdl, sfx2::FileDialogHelper*, _pFileDlg ) 620cdf0e10cSrcweir { 621cdf0e10cSrcweir String sFile; 622cdf0e10cSrcweir Application::SetDefDialogParent( pOldParent ); 623cdf0e10cSrcweir 624cdf0e10cSrcweir if ( FILETYPE_TEXT == nType || FILETYPE_OBJECT == nType ) 625cdf0e10cSrcweir { 626cdf0e10cSrcweir if ( _pFileDlg && _pFileDlg->GetError() == ERRCODE_NONE ) 627cdf0e10cSrcweir { 628cdf0e10cSrcweir String sURL( _pFileDlg->GetPath() ); 629cdf0e10cSrcweir sFile = sURL; 630cdf0e10cSrcweir sFile += ::sfx2::cTokenSeperator; 631cdf0e10cSrcweir sFile += ::sfx2::cTokenSeperator; 632cdf0e10cSrcweir sFile += impl_getFilter( sURL ); 633cdf0e10cSrcweir } 634cdf0e10cSrcweir } 635cdf0e10cSrcweir else 636cdf0e10cSrcweir { 637cdf0e10cSrcweir DBG_ERRORFILE( "SvFileObject::DialogClosedHdl(): wrong file type" ); 638cdf0e10cSrcweir } 639cdf0e10cSrcweir 640cdf0e10cSrcweir if ( aEndEditLink.IsSet() ) 641cdf0e10cSrcweir aEndEditLink.Call( &sFile ); 642cdf0e10cSrcweir return 0; 643cdf0e10cSrcweir } 644cdf0e10cSrcweir 645cdf0e10cSrcweir /* [Beschreibung] 646cdf0e10cSrcweir 647cdf0e10cSrcweir Die Methode stellt fest, ob aus einem DDE-Object die Daten gelesen 648cdf0e10cSrcweir werden kann. 649cdf0e10cSrcweir Zurueckgegeben wird: 650cdf0e10cSrcweir ERRCODE_NONE wenn sie komplett gelesen wurde 651cdf0e10cSrcweir ERRCODE_SO_PENDING wenn sie noch nicht komplett gelesen wurde 652cdf0e10cSrcweir ERRCODE_SO_FALSE sonst 653cdf0e10cSrcweir */ 654cdf0e10cSrcweir sal_Bool SvFileObject::IsPending() const 655cdf0e10cSrcweir { 656cdf0e10cSrcweir return FILETYPE_GRF == nType && !bLoadError && 657cdf0e10cSrcweir ( pDownLoadData || bWaitForData ); 658cdf0e10cSrcweir } 659cdf0e10cSrcweir sal_Bool SvFileObject::IsDataComplete() const 660cdf0e10cSrcweir { 661cdf0e10cSrcweir sal_Bool bRet = sal_False; 662cdf0e10cSrcweir if( FILETYPE_GRF != nType ) 663cdf0e10cSrcweir bRet = sal_True; 664cdf0e10cSrcweir else if( !bLoadError && ( !bWaitForData && !pDownLoadData )) 665cdf0e10cSrcweir { 666cdf0e10cSrcweir SvFileObject* pThis = (SvFileObject*)this; 667cdf0e10cSrcweir if( bDataReady || 668cdf0e10cSrcweir ( bSynchron && pThis->LoadFile_Impl() && xMed.Is() ) ) 669cdf0e10cSrcweir bRet = sal_True; 670cdf0e10cSrcweir else 671cdf0e10cSrcweir { 672cdf0e10cSrcweir INetURLObject aUrl( sFileNm ); 673cdf0e10cSrcweir if( aUrl.HasError() || 674cdf0e10cSrcweir INET_PROT_NOT_VALID == aUrl.GetProtocol() ) 675cdf0e10cSrcweir bRet = sal_True; 676cdf0e10cSrcweir } 677cdf0e10cSrcweir } 678cdf0e10cSrcweir return bRet; 679cdf0e10cSrcweir } 680cdf0e10cSrcweir 681cdf0e10cSrcweir 682cdf0e10cSrcweir 683cdf0e10cSrcweir void SvFileObject::CancelTransfers() 684cdf0e10cSrcweir { 685cdf0e10cSrcweir // und aus dem Cache austragen, wenn man mitten im Laden ist 686cdf0e10cSrcweir if( !bDataReady ) 687cdf0e10cSrcweir { 688cdf0e10cSrcweir // nicht noch mal aufsetzen 689cdf0e10cSrcweir bLoadAgain = sal_False; 690cdf0e10cSrcweir bDataReady = bLoadError = bWaitForData = sal_True; 691cdf0e10cSrcweir SendStateChg_Impl( sfx2::LinkManager::STATE_LOAD_ABORT ); 692cdf0e10cSrcweir } 693cdf0e10cSrcweir } 694cdf0e10cSrcweir 695cdf0e10cSrcweir 696cdf0e10cSrcweir void SvFileObject::SendStateChg_Impl( sfx2::LinkManager::LinkState nState ) 697cdf0e10cSrcweir { 698cdf0e10cSrcweir if( !bStateChangeCalled && HasDataLinks() ) 699cdf0e10cSrcweir { 700cdf0e10cSrcweir css::uno::Any aAny; 701cdf0e10cSrcweir aAny <<= rtl::OUString::valueOf( (sal_Int32)nState ); 702cdf0e10cSrcweir DataChanged( SotExchange::GetFormatName( 703cdf0e10cSrcweir sfx2::LinkManager::RegisterStatusInfoId()), aAny ); 704cdf0e10cSrcweir bStateChangeCalled = sal_True; 705cdf0e10cSrcweir } 706cdf0e10cSrcweir } 707cdf0e10cSrcweir 708cdf0e10cSrcweir 709