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 10cdf0e10cSrcweir * 11d119d52dSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 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. 19cdf0e10cSrcweir * 20d119d52dSAndrew Rist *************************************************************/ 21d119d52dSAndrew Rist 22d119d52dSAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_sfx2.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir #if defined(WNT) 28cdf0e10cSrcweir #include <tools/svwin.h> 29cdf0e10cSrcweir #endif 30cdf0e10cSrcweir 31cdf0e10cSrcweir #include "impldde.hxx" 32cdf0e10cSrcweir 33cdf0e10cSrcweir #include <vcl/svapp.hxx> 34cdf0e10cSrcweir #include <vcl/fixed.hxx> 35cdf0e10cSrcweir #include <vcl/edit.hxx> 36cdf0e10cSrcweir #include <vcl/button.hxx> 37cdf0e10cSrcweir #include <vcl/msgbox.hxx> 38cdf0e10cSrcweir #include <sot/exchange.hxx> 39cdf0e10cSrcweir #include <rtl/ustring.hxx> 40cdf0e10cSrcweir 41cdf0e10cSrcweir #include "dde.hrc" 42cdf0e10cSrcweir #include <sfx2/lnkbase.hxx> 43cdf0e10cSrcweir #include <sfx2/linkmgr.hxx> 44cdf0e10cSrcweir #include "sfx2/sfxresid.hxx" 45cdf0e10cSrcweir 46cdf0e10cSrcweir #include <com/sun/star/uno/Any.hxx> 47cdf0e10cSrcweir #include <com/sun/star/uno/Sequence.hxx> 48cdf0e10cSrcweir 49cdf0e10cSrcweir #include <svl/svdde.hxx> 50cdf0e10cSrcweir #include <sot/formats.hxx> 51cdf0e10cSrcweir 522b099e56SHerbert Dürr #include <unotools/securityoptions.hxx> 532b099e56SHerbert Dürr 54cdf0e10cSrcweir #define DDELINK_COLD 0 55cdf0e10cSrcweir #define DDELINK_HOT 1 56cdf0e10cSrcweir 57cdf0e10cSrcweir #define DDELINK_ERROR_APP 1 58cdf0e10cSrcweir #define DDELINK_ERROR_DATA 2 59cdf0e10cSrcweir #define DDELINK_ERROR_LINK 3 60cdf0e10cSrcweir 61cdf0e10cSrcweir using namespace ::com::sun::star::uno; 62cdf0e10cSrcweir 63cdf0e10cSrcweir namespace sfx2 64cdf0e10cSrcweir { 65cdf0e10cSrcweir 66cdf0e10cSrcweir class SvDDELinkEditDialog : public ModalDialog 67cdf0e10cSrcweir { 68cdf0e10cSrcweir FixedText aFtDdeApp; 69cdf0e10cSrcweir Edit aEdDdeApp; 70cdf0e10cSrcweir FixedText aFtDdeTopic; 71cdf0e10cSrcweir Edit aEdDdeTopic; 72cdf0e10cSrcweir FixedText aFtDdeItem; 73cdf0e10cSrcweir Edit aEdDdeItem; 74cdf0e10cSrcweir FixedLine aGroupDdeChg; 75cdf0e10cSrcweir OKButton aOKButton1; 76cdf0e10cSrcweir CancelButton aCancelButton1; 77cdf0e10cSrcweir 78cdf0e10cSrcweir DECL_STATIC_LINK( SvDDELinkEditDialog, EditHdl_Impl, Edit* ); 79cdf0e10cSrcweir public: 80cdf0e10cSrcweir SvDDELinkEditDialog( Window* pParent, SvBaseLink* ); 81cdf0e10cSrcweir String GetCmd() const; 82cdf0e10cSrcweir }; 83cdf0e10cSrcweir 84cdf0e10cSrcweir SvDDELinkEditDialog::SvDDELinkEditDialog( Window* pParent, SvBaseLink* pLink ) 85cdf0e10cSrcweir : ModalDialog( pParent, SfxResId( MD_DDE_LINKEDIT ) ), 86cdf0e10cSrcweir aFtDdeApp( this, SfxResId( FT_DDE_APP ) ), 87cdf0e10cSrcweir aEdDdeApp( this, SfxResId( ED_DDE_APP ) ), 88cdf0e10cSrcweir aFtDdeTopic( this, SfxResId( FT_DDE_TOPIC ) ), 89cdf0e10cSrcweir aEdDdeTopic( this, SfxResId( ED_DDE_TOPIC ) ), 90cdf0e10cSrcweir aFtDdeItem( this, SfxResId( FT_DDE_ITEM ) ), 91cdf0e10cSrcweir aEdDdeItem( this, SfxResId( ED_DDE_ITEM ) ), 92cdf0e10cSrcweir aGroupDdeChg( this, SfxResId( GROUP_DDE_CHG ) ), 93cdf0e10cSrcweir aOKButton1( this, SfxResId( 1 ) ), 94cdf0e10cSrcweir aCancelButton1( this, SfxResId( 1 ) ) 95cdf0e10cSrcweir { 96cdf0e10cSrcweir FreeResource(); 97cdf0e10cSrcweir 98cdf0e10cSrcweir String sServer, sTopic, sItem; 99cdf0e10cSrcweir pLink->GetLinkManager()->GetDisplayNames( pLink, &sServer, &sTopic, &sItem ); 100cdf0e10cSrcweir 101cdf0e10cSrcweir aEdDdeApp.SetText( sServer ); 102cdf0e10cSrcweir aEdDdeTopic.SetText( sTopic ); 103cdf0e10cSrcweir aEdDdeItem.SetText( sItem ); 104cdf0e10cSrcweir 105cdf0e10cSrcweir aEdDdeApp.SetModifyHdl( STATIC_LINK( this, SvDDELinkEditDialog, EditHdl_Impl)); 106cdf0e10cSrcweir aEdDdeTopic.SetModifyHdl( STATIC_LINK( this, SvDDELinkEditDialog, EditHdl_Impl)); 107cdf0e10cSrcweir aEdDdeItem.SetModifyHdl( STATIC_LINK( this, SvDDELinkEditDialog, EditHdl_Impl)); 108cdf0e10cSrcweir 109cdf0e10cSrcweir aOKButton1.Enable( sServer.Len() && sTopic.Len() && sItem.Len() ); 110cdf0e10cSrcweir } 111cdf0e10cSrcweir 112cdf0e10cSrcweir String SvDDELinkEditDialog::GetCmd() const 113cdf0e10cSrcweir { 114cdf0e10cSrcweir String sCmd( aEdDdeApp.GetText() ), sRet; 115cdf0e10cSrcweir ::sfx2::MakeLnkName( sRet, &sCmd, aEdDdeTopic.GetText(), aEdDdeItem.GetText() ); 116cdf0e10cSrcweir return sRet; 117cdf0e10cSrcweir } 118cdf0e10cSrcweir 119cdf0e10cSrcweir IMPL_STATIC_LINK( SvDDELinkEditDialog, EditHdl_Impl, Edit *, pEdit ) 120cdf0e10cSrcweir { 121cdf0e10cSrcweir (void)pEdit; // unused variable 122cdf0e10cSrcweir pThis->aOKButton1.Enable( pThis->aEdDdeApp.GetText().Len() && 123cdf0e10cSrcweir pThis->aEdDdeTopic.GetText().Len() && 124cdf0e10cSrcweir pThis->aEdDdeItem.GetText().Len() ); 125cdf0e10cSrcweir return 0; 126cdf0e10cSrcweir } 127cdf0e10cSrcweir 128cdf0e10cSrcweir /* */ 129cdf0e10cSrcweir 130cdf0e10cSrcweir 131cdf0e10cSrcweir SvDDEObject::SvDDEObject() 132cdf0e10cSrcweir : pConnection( 0 ), pLink( 0 ), pRequest( 0 ), pGetData( 0 ), nError( 0 ) 133cdf0e10cSrcweir { 134cdf0e10cSrcweir SetUpdateTimeout( 100 ); 135cdf0e10cSrcweir bWaitForData = sal_False; 136cdf0e10cSrcweir } 137cdf0e10cSrcweir 138cdf0e10cSrcweir SvDDEObject::~SvDDEObject() 139cdf0e10cSrcweir { 140cdf0e10cSrcweir delete pLink; 141cdf0e10cSrcweir delete pRequest; 142cdf0e10cSrcweir delete pConnection; 143cdf0e10cSrcweir } 144cdf0e10cSrcweir 145cdf0e10cSrcweir sal_Bool SvDDEObject::GetData( ::com::sun::star::uno::Any & rData /*out param*/, 146cdf0e10cSrcweir const String & rMimeType, 147cdf0e10cSrcweir sal_Bool bSynchron ) 148cdf0e10cSrcweir { 149cdf0e10cSrcweir if( !pConnection ) 150cdf0e10cSrcweir return sal_False; 151cdf0e10cSrcweir 152cdf0e10cSrcweir if( pConnection->GetError() ) // dann versuchen wir es nochmal 153cdf0e10cSrcweir { 154cdf0e10cSrcweir String sServer( pConnection->GetServiceName() ); 155cdf0e10cSrcweir String sTopic( pConnection->GetTopicName() ); 156cdf0e10cSrcweir 157cdf0e10cSrcweir delete pConnection; 158cdf0e10cSrcweir pConnection = new DdeConnection( sServer, sTopic ); 159cdf0e10cSrcweir if( pConnection->GetError() ) 160cdf0e10cSrcweir nError = DDELINK_ERROR_APP; 161cdf0e10cSrcweir } 162cdf0e10cSrcweir 163cdf0e10cSrcweir if( bWaitForData ) // wir sind rekursiv drin, wieder raus 164cdf0e10cSrcweir return sal_False; 165cdf0e10cSrcweir 166cdf0e10cSrcweir // Verriegeln gegen Reentrance 167cdf0e10cSrcweir bWaitForData = sal_True; 168cdf0e10cSrcweir 169cdf0e10cSrcweir // falls gedruckt werden soll, warten wir bis die Daten vorhanden sind 170cdf0e10cSrcweir if( bSynchron ) 171cdf0e10cSrcweir { 172cdf0e10cSrcweir DdeRequest aReq( *pConnection, sItem, 5000 ); 173cdf0e10cSrcweir aReq.SetDataHdl( LINK( this, SvDDEObject, ImplGetDDEData ) ); 174cdf0e10cSrcweir aReq.SetFormat( SotExchange::GetFormatIdFromMimeType( rMimeType )); 175cdf0e10cSrcweir 176cdf0e10cSrcweir pGetData = &rData; 177cdf0e10cSrcweir 178cdf0e10cSrcweir do { 179cdf0e10cSrcweir aReq.Execute(); 180cdf0e10cSrcweir } while( aReq.GetError() && ImplHasOtherFormat( aReq ) ); 181cdf0e10cSrcweir 182cdf0e10cSrcweir if( pConnection->GetError() ) 183cdf0e10cSrcweir nError = DDELINK_ERROR_DATA; 184cdf0e10cSrcweir 185cdf0e10cSrcweir bWaitForData = sal_False; 186cdf0e10cSrcweir } 187cdf0e10cSrcweir else 188cdf0e10cSrcweir { 189cdf0e10cSrcweir // ansonsten wird es asynchron ausgefuehrt 190cdf0e10cSrcweir // if( !pLink || !pLink->IsBusy() ) 191cdf0e10cSrcweir { 192cdf0e10cSrcweir if( pRequest ) 193cdf0e10cSrcweir delete pRequest; 194cdf0e10cSrcweir 195cdf0e10cSrcweir pRequest = new DdeRequest( *pConnection, sItem ); 196cdf0e10cSrcweir pRequest->SetDataHdl( LINK( this, SvDDEObject, ImplGetDDEData ) ); 197cdf0e10cSrcweir pRequest->SetDoneHdl( LINK( this, SvDDEObject, ImplDoneDDEData ) ); 198cdf0e10cSrcweir pRequest->SetFormat( SotExchange::GetFormatIdFromMimeType( 199cdf0e10cSrcweir rMimeType ) ); 200cdf0e10cSrcweir pRequest->Execute(); 201cdf0e10cSrcweir } 202cdf0e10cSrcweir 203cdf0e10cSrcweir ::rtl::OUString aEmptyStr; 204cdf0e10cSrcweir rData <<= aEmptyStr; 205cdf0e10cSrcweir } 206cdf0e10cSrcweir return 0 == pConnection->GetError(); 207cdf0e10cSrcweir } 208cdf0e10cSrcweir 209cdf0e10cSrcweir 210cdf0e10cSrcweir sal_Bool SvDDEObject::Connect( SvBaseLink * pSvLink ) 211cdf0e10cSrcweir { 212cdf0e10cSrcweir sal_uInt16 nLinkType = pSvLink->GetUpdateMode(); 213cdf0e10cSrcweir if( pConnection ) // Verbindung steht ja schon 214cdf0e10cSrcweir { 215cdf0e10cSrcweir // tja, dann nur noch als Abhaengig eintragen 216cdf0e10cSrcweir AddDataAdvise( pSvLink, 217cdf0e10cSrcweir SotExchange::GetFormatMimeType( pSvLink->GetContentType()), 218cdf0e10cSrcweir LINKUPDATE_ONCALL == nLinkType 219cdf0e10cSrcweir ? ADVISEMODE_ONLYONCE 220cdf0e10cSrcweir : 0 ); 221cdf0e10cSrcweir AddConnectAdvise( pSvLink ); 222cdf0e10cSrcweir 223cdf0e10cSrcweir return sal_True; 224cdf0e10cSrcweir } 225cdf0e10cSrcweir 226cdf0e10cSrcweir if( !pSvLink->GetLinkManager() ) 227cdf0e10cSrcweir return sal_False; 228cdf0e10cSrcweir 229cdf0e10cSrcweir String sServer, sTopic; 230cdf0e10cSrcweir pSvLink->GetLinkManager()->GetDisplayNames( pSvLink, &sServer, &sTopic, &sItem ); 231cdf0e10cSrcweir 232cdf0e10cSrcweir if( !sServer.Len() || !sTopic.Len() || !sItem.Len() ) 233cdf0e10cSrcweir return sal_False; 234cdf0e10cSrcweir 235cdf0e10cSrcweir pConnection = new DdeConnection( sServer, sTopic ); 236cdf0e10cSrcweir if( pConnection->GetError() ) 237cdf0e10cSrcweir { 238*d94c4e0eSHerbert Dürr // check if the DDE server knows the "SYSTEM" topic 239*d94c4e0eSHerbert Dürr bool bSysTopic = false; 240*d94c4e0eSHerbert Dürr if( !sTopic.EqualsIgnoreCaseAscii( "SYSTEM" )) 241cdf0e10cSrcweir { 242cdf0e10cSrcweir DdeConnection aTmp( sServer, String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "SYSTEM" ) ) ); 243cdf0e10cSrcweir bSysTopic = !aTmp.GetError(); 244cdf0e10cSrcweir } 245cdf0e10cSrcweir 246cdf0e10cSrcweir if( bSysTopic ) 247cdf0e10cSrcweir { 248*d94c4e0eSHerbert Dürr // if the system topic works then the server is up but just doesn't know the original topic 249cdf0e10cSrcweir nError = DDELINK_ERROR_DATA; 250cdf0e10cSrcweir return sal_False; 251cdf0e10cSrcweir } 252cdf0e10cSrcweir 253cdf0e10cSrcweir nError = DDELINK_ERROR_APP; 254cdf0e10cSrcweir } 255cdf0e10cSrcweir 256cdf0e10cSrcweir if( LINKUPDATE_ALWAYS == nLinkType && !pLink && !pConnection->GetError() ) 257cdf0e10cSrcweir { 258cdf0e10cSrcweir // Hot Link einrichten, Daten kommen irgendwann spaeter 259cdf0e10cSrcweir pLink = new DdeHotLink( *pConnection, sItem ); 260cdf0e10cSrcweir pLink->SetDataHdl( LINK( this, SvDDEObject, ImplGetDDEData ) ); 261cdf0e10cSrcweir pLink->SetDoneHdl( LINK( this, SvDDEObject, ImplDoneDDEData ) ); 262cdf0e10cSrcweir pLink->SetFormat( pSvLink->GetContentType() ); 263cdf0e10cSrcweir pLink->Execute(); 264cdf0e10cSrcweir } 265cdf0e10cSrcweir 266cdf0e10cSrcweir if( pConnection->GetError() ) 267cdf0e10cSrcweir return sal_False; 268cdf0e10cSrcweir 269cdf0e10cSrcweir AddDataAdvise( pSvLink, 270cdf0e10cSrcweir SotExchange::GetFormatMimeType( pSvLink->GetContentType()), 271cdf0e10cSrcweir LINKUPDATE_ONCALL == nLinkType 272cdf0e10cSrcweir ? ADVISEMODE_ONLYONCE 273cdf0e10cSrcweir : 0 ); 274cdf0e10cSrcweir AddConnectAdvise( pSvLink ); 275cdf0e10cSrcweir SetUpdateTimeout( 0 ); 276cdf0e10cSrcweir return sal_True; 277cdf0e10cSrcweir } 278cdf0e10cSrcweir 279cdf0e10cSrcweir void SvDDEObject::Edit( Window* pParent, sfx2::SvBaseLink* pBaseLink, const Link& rEndEditHdl ) 280cdf0e10cSrcweir { 281cdf0e10cSrcweir SvDDELinkEditDialog aDlg( pParent, pBaseLink ); 282cdf0e10cSrcweir if ( RET_OK == aDlg.Execute() && rEndEditHdl.IsSet() ) 283cdf0e10cSrcweir { 284cdf0e10cSrcweir String sCommand = aDlg.GetCmd(); 285cdf0e10cSrcweir rEndEditHdl.Call( &sCommand ); 286cdf0e10cSrcweir } 287cdf0e10cSrcweir } 288cdf0e10cSrcweir 289cdf0e10cSrcweir sal_Bool SvDDEObject::ImplHasOtherFormat( DdeTransaction& rReq ) 290cdf0e10cSrcweir { 291cdf0e10cSrcweir sal_uInt16 nFmt = 0; 292cdf0e10cSrcweir switch( rReq.GetFormat() ) 293cdf0e10cSrcweir { 294cdf0e10cSrcweir case FORMAT_RTF: 295cdf0e10cSrcweir nFmt = FORMAT_STRING; 296cdf0e10cSrcweir break; 297cdf0e10cSrcweir 298cdf0e10cSrcweir case SOT_FORMATSTR_ID_HTML_SIMPLE: 299cdf0e10cSrcweir case SOT_FORMATSTR_ID_HTML: 300cdf0e10cSrcweir nFmt = FORMAT_RTF; 301cdf0e10cSrcweir break; 302cdf0e10cSrcweir 303cdf0e10cSrcweir case FORMAT_GDIMETAFILE: 304cdf0e10cSrcweir nFmt = FORMAT_BITMAP; 305cdf0e10cSrcweir break; 306cdf0e10cSrcweir 307cdf0e10cSrcweir case SOT_FORMATSTR_ID_SVXB: 308cdf0e10cSrcweir nFmt = FORMAT_GDIMETAFILE; 309cdf0e10cSrcweir break; 310cdf0e10cSrcweir 311cdf0e10cSrcweir // sonst noch irgendwas ?? 312cdf0e10cSrcweir } 313cdf0e10cSrcweir if( nFmt ) 314cdf0e10cSrcweir rReq.SetFormat( nFmt ); // damit nochmal versuchen 315cdf0e10cSrcweir return 0 != nFmt; 316cdf0e10cSrcweir } 317cdf0e10cSrcweir 318cdf0e10cSrcweir sal_Bool SvDDEObject::IsPending() const 319cdf0e10cSrcweir /* [Beschreibung] 320cdf0e10cSrcweir 321cdf0e10cSrcweir Die Methode stellt fest, ob aus einem DDE-Object die Daten gelesen 322cdf0e10cSrcweir werden kann. 323cdf0e10cSrcweir Zurueckgegeben wird: 324cdf0e10cSrcweir ERRCODE_NONE wenn sie komplett gelesen wurde 325cdf0e10cSrcweir ERRCODE_SO_PENDING wenn sie noch nicht komplett gelesen wurde 326cdf0e10cSrcweir ERRCODE_SO_FALSE sonst 327cdf0e10cSrcweir */ 328cdf0e10cSrcweir { 329cdf0e10cSrcweir return bWaitForData; 330cdf0e10cSrcweir } 331cdf0e10cSrcweir 332cdf0e10cSrcweir sal_Bool SvDDEObject::IsDataComplete() const 333cdf0e10cSrcweir { 334cdf0e10cSrcweir return bWaitForData; 335cdf0e10cSrcweir } 336cdf0e10cSrcweir 337cdf0e10cSrcweir IMPL_LINK( SvDDEObject, ImplGetDDEData, DdeData*, pData ) 338cdf0e10cSrcweir { 339cdf0e10cSrcweir sal_uIntPtr nFmt = pData->GetFormat(); 340cdf0e10cSrcweir switch( nFmt ) 341cdf0e10cSrcweir { 342cdf0e10cSrcweir case FORMAT_GDIMETAFILE: 343cdf0e10cSrcweir break; 344cdf0e10cSrcweir 345cdf0e10cSrcweir case FORMAT_BITMAP: 346cdf0e10cSrcweir break; 347cdf0e10cSrcweir 348cdf0e10cSrcweir default: 349cdf0e10cSrcweir { 350cdf0e10cSrcweir const sal_Char* p = (sal_Char*)( pData->operator const void*() ); 351cdf0e10cSrcweir long nLen = FORMAT_STRING == nFmt ? (p ? strlen( p ) : 0) : (long)*pData; 352cdf0e10cSrcweir 353cdf0e10cSrcweir Sequence< sal_Int8 > aSeq( (const sal_Int8*)p, nLen ); 354cdf0e10cSrcweir if( pGetData ) 355cdf0e10cSrcweir { 356cdf0e10cSrcweir *pGetData <<= aSeq; // Daten kopieren 357cdf0e10cSrcweir pGetData = 0; // und den Pointer bei mir zuruecksetzen 358cdf0e10cSrcweir } 359cdf0e10cSrcweir else 360cdf0e10cSrcweir { 361cdf0e10cSrcweir Any aVal; 362cdf0e10cSrcweir aVal <<= aSeq; 363cdf0e10cSrcweir DataChanged( SotExchange::GetFormatMimeType( 364cdf0e10cSrcweir pData->GetFormat() ), aVal ); 365cdf0e10cSrcweir bWaitForData = sal_False; 366cdf0e10cSrcweir } 367cdf0e10cSrcweir } 368cdf0e10cSrcweir } 369cdf0e10cSrcweir 370cdf0e10cSrcweir return 0; 371cdf0e10cSrcweir } 372cdf0e10cSrcweir 373cdf0e10cSrcweir IMPL_LINK( SvDDEObject, ImplDoneDDEData, void*, pData ) 374cdf0e10cSrcweir { 375cdf0e10cSrcweir sal_Bool bValid = (sal_Bool)(sal_uIntPtr)pData; 376cdf0e10cSrcweir if( !bValid && ( pRequest || pLink )) 377cdf0e10cSrcweir { 378cdf0e10cSrcweir DdeTransaction* pReq = 0; 379cdf0e10cSrcweir if( !pLink || ( pLink && pLink->IsBusy() )) 380cdf0e10cSrcweir pReq = pRequest; // dann kann nur der fertig sein 381cdf0e10cSrcweir else if( pRequest && pRequest->IsBusy() ) 382cdf0e10cSrcweir pReq = pLink; // dann kann nur der fertig sein 383cdf0e10cSrcweir 384cdf0e10cSrcweir if( pReq ) 385cdf0e10cSrcweir { 386cdf0e10cSrcweir if( ImplHasOtherFormat( *pReq ) ) 387cdf0e10cSrcweir { 388cdf0e10cSrcweir pReq->Execute(); 389cdf0e10cSrcweir } 390cdf0e10cSrcweir else if( pReq == pRequest ) 391cdf0e10cSrcweir { 392cdf0e10cSrcweir // das wars dann 393cdf0e10cSrcweir bWaitForData = sal_False; 394cdf0e10cSrcweir } 395cdf0e10cSrcweir } 396cdf0e10cSrcweir } 397cdf0e10cSrcweir else 398cdf0e10cSrcweir // das warten ist beendet 399cdf0e10cSrcweir bWaitForData = sal_False; 400cdf0e10cSrcweir 401cdf0e10cSrcweir return 0; 402cdf0e10cSrcweir } 403cdf0e10cSrcweir 404cdf0e10cSrcweir } 405