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
52*d2c21ab4SHerbert Dürr #include <unotools/securityoptions.hxx>
53*d2c21ab4SHerbert 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
SvDDELinkEditDialog(Window * pParent,SvBaseLink * pLink)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
GetCmd() const112cdf0e10cSrcweir 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
IMPL_STATIC_LINK(SvDDELinkEditDialog,EditHdl_Impl,Edit *,pEdit)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
SvDDEObject()131cdf0e10cSrcweir SvDDEObject::SvDDEObject()
132cdf0e10cSrcweir : pConnection( 0 ), pLink( 0 ), pRequest( 0 ), pGetData( 0 ), nError( 0 )
133cdf0e10cSrcweir {
134cdf0e10cSrcweir SetUpdateTimeout( 100 );
135cdf0e10cSrcweir bWaitForData = sal_False;
136cdf0e10cSrcweir }
137cdf0e10cSrcweir
~SvDDEObject()138cdf0e10cSrcweir SvDDEObject::~SvDDEObject()
139cdf0e10cSrcweir {
140cdf0e10cSrcweir delete pLink;
141cdf0e10cSrcweir delete pRequest;
142cdf0e10cSrcweir delete pConnection;
143cdf0e10cSrcweir }
144cdf0e10cSrcweir
GetData(::com::sun::star::uno::Any & rData,const String & rMimeType,sal_Bool bSynchron)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
Connect(SvBaseLink * pSvLink)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*d2c21ab4SHerbert Dürr // check if the DDE server knows the "SYSTEM" topic
239*d2c21ab4SHerbert Dürr bool bSysTopic = false;
240*d2c21ab4SHerbert 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*d2c21ab4SHerbert 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
Edit(Window * pParent,sfx2::SvBaseLink * pBaseLink,const Link & rEndEditHdl)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
ImplHasOtherFormat(DdeTransaction & rReq)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
IsPending() const318cdf0e10cSrcweir 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
IsDataComplete() const332cdf0e10cSrcweir sal_Bool SvDDEObject::IsDataComplete() const
333cdf0e10cSrcweir {
334cdf0e10cSrcweir return bWaitForData;
335cdf0e10cSrcweir }
336cdf0e10cSrcweir
IMPL_LINK(SvDDEObject,ImplGetDDEData,DdeData *,pData)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
IMPL_LINK(SvDDEObject,ImplDoneDDEData,void *,pData)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