xref: /trunk/main/svl/source/svdde/ddecli.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
140df464eSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
340df464eSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
440df464eSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
540df464eSAndrew Rist  * distributed with this work for additional information
640df464eSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
740df464eSAndrew Rist  * to you under the Apache License, Version 2.0 (the
840df464eSAndrew Rist  * "License"); you may not use this file except in compliance
940df464eSAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
1140df464eSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
1340df464eSAndrew Rist  * Unless required by applicable law or agreed to in writing,
1440df464eSAndrew Rist  * software distributed under the License is distributed on an
1540df464eSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
1640df464eSAndrew Rist  * KIND, either express or implied.  See the License for the
1740df464eSAndrew Rist  * specific language governing permissions and limitations
1840df464eSAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
2040df464eSAndrew Rist  *************************************************************/
2140df464eSAndrew Rist 
2240df464eSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_svl.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #define UNICODE
28cdf0e10cSrcweir #include <string.h> // memset
29cdf0e10cSrcweir #include "ddeimp.hxx"
30cdf0e10cSrcweir #include <svl/svdde.hxx>
31cdf0e10cSrcweir 
32cdf0e10cSrcweir #include <osl/thread.h>
33cdf0e10cSrcweir #include <tools/debug.hxx>
34cdf0e10cSrcweir #include <tools/solarmutex.hxx>
35cdf0e10cSrcweir #include <vos/mutex.hxx>
36cdf0e10cSrcweir 
37cdf0e10cSrcweir // static DWORD        hDdeInst  = NULL;
38cdf0e10cSrcweir // static short        nInstance = 0;
39cdf0e10cSrcweir 
40cdf0e10cSrcweir // DdeConnections*     DdeConnection::pConnections = NULL;
41cdf0e10cSrcweir 
ImpInitInstData()42cdf0e10cSrcweir DdeInstData* ImpInitInstData()
43cdf0e10cSrcweir {
44cdf0e10cSrcweir     DdeInstData* pData = new DdeInstData;
45cdf0e10cSrcweir     memset( pData,0,sizeof(DdeInstData) );
46cdf0e10cSrcweir     DdeInstData** ppInst = (DdeInstData**)GetAppData( SHL_SVDDE );
47cdf0e10cSrcweir     *ppInst = pData;
48cdf0e10cSrcweir     return pData;
49cdf0e10cSrcweir }
50cdf0e10cSrcweir 
ImpDeinitInstData()51cdf0e10cSrcweir void ImpDeinitInstData()
52cdf0e10cSrcweir {
53cdf0e10cSrcweir     DdeInstData** ppInst = (DdeInstData**)GetAppData( SHL_SVDDE );
54cdf0e10cSrcweir     delete (*ppInst);
55cdf0e10cSrcweir     *ppInst = 0;
56cdf0e10cSrcweir }
57cdf0e10cSrcweir 
58cdf0e10cSrcweir 
59cdf0e10cSrcweir struct DdeImp
60cdf0e10cSrcweir {
61cdf0e10cSrcweir     HCONV   hConv;
62cdf0e10cSrcweir     long    nStatus;
63cdf0e10cSrcweir };
64cdf0e10cSrcweir 
65cdf0e10cSrcweir // --- DdeInternat::CliCallback() ----------------------------------
66cdf0e10cSrcweir 
CliCallback(WORD nCode,WORD nCbType,HCONV hConv,HSZ,HSZ hText2,HDDEDATA hData,DWORD nInfo1,DWORD)67cdf0e10cSrcweir HDDEDATA CALLBACK DdeInternal::CliCallback(
68cdf0e10cSrcweir             WORD nCode, WORD nCbType, HCONV hConv, HSZ, HSZ hText2,
69cdf0e10cSrcweir             HDDEDATA hData, DWORD nInfo1, DWORD )
70cdf0e10cSrcweir {
71cdf0e10cSrcweir     HDDEDATA nRet = DDE_FNOTPROCESSED;
72cdf0e10cSrcweir     DdeConnections&     rAll = (DdeConnections&)DdeConnection::GetConnections();
73cdf0e10cSrcweir     DdeConnection*      self = 0;
74cdf0e10cSrcweir 
75cdf0e10cSrcweir     DdeInstData* pInst = ImpGetInstData();
76cdf0e10cSrcweir     DBG_ASSERT(pInst,"SVDDE:No instance data");
77cdf0e10cSrcweir 
78cdf0e10cSrcweir     for ( self = rAll.First(); self; self = rAll.Next() )
79cdf0e10cSrcweir         if ( self->pImp->hConv == hConv )
80cdf0e10cSrcweir             break;
81cdf0e10cSrcweir 
82cdf0e10cSrcweir     if( self )
83cdf0e10cSrcweir     {
84cdf0e10cSrcweir         DdeTransaction* t;
85cdf0e10cSrcweir         sal_Bool bFound = sal_False;
86cdf0e10cSrcweir         for( t = self->aTransactions.First(); t; t = self->aTransactions.Next() )
87cdf0e10cSrcweir         {
88cdf0e10cSrcweir             switch( nCode )
89cdf0e10cSrcweir             {
90cdf0e10cSrcweir                 case XTYP_XACT_COMPLETE:
91cdf0e10cSrcweir                     if( (DWORD)t->nId == nInfo1 )
92cdf0e10cSrcweir                     {
93cdf0e10cSrcweir                         nCode = t->nType & (XCLASS_MASK | XTYP_MASK);
94cdf0e10cSrcweir                         t->bBusy = sal_False;
95cdf0e10cSrcweir                         t->Done( 0 != hData );
96cdf0e10cSrcweir                         bFound = sal_True;
97cdf0e10cSrcweir                     }
98cdf0e10cSrcweir                     break;
99cdf0e10cSrcweir 
100cdf0e10cSrcweir                 case XTYP_DISCONNECT:
101cdf0e10cSrcweir                     self->pImp->hConv = DdeReconnect( hConv );
102cdf0e10cSrcweir                     self->pImp->nStatus = self->pImp->hConv
103cdf0e10cSrcweir                                     ? DMLERR_NO_ERROR
104cdf0e10cSrcweir                                     : DdeGetLastError( pInst->hDdeInstCli );
105cdf0e10cSrcweir                     t = 0;
106cdf0e10cSrcweir                     nRet = 0;
107cdf0e10cSrcweir                     bFound = sal_True;
108cdf0e10cSrcweir                     break;
109cdf0e10cSrcweir 
110cdf0e10cSrcweir                 case XTYP_ADVDATA:
111cdf0e10cSrcweir                     bFound = sal_Bool( *t->pName == hText2 );
112cdf0e10cSrcweir                     break;
113cdf0e10cSrcweir             }
114cdf0e10cSrcweir             if( bFound )
115cdf0e10cSrcweir                 break;
116cdf0e10cSrcweir         }
117cdf0e10cSrcweir 
118cdf0e10cSrcweir         if( t )
119cdf0e10cSrcweir         {
120cdf0e10cSrcweir             switch( nCode )
121cdf0e10cSrcweir             {
122cdf0e10cSrcweir             case XTYP_ADVDATA:
123cdf0e10cSrcweir                 if( !hData )
124cdf0e10cSrcweir                 {
125cdf0e10cSrcweir                     ((DdeLink*) t)->Notify();
126cdf0e10cSrcweir                     nRet = (HDDEDATA)DDE_FACK;
127cdf0e10cSrcweir                     break;
128cdf0e10cSrcweir                 }
129cdf0e10cSrcweir                 // kein break;
130cdf0e10cSrcweir 
131cdf0e10cSrcweir             case XTYP_REQUEST:
132cdf0e10cSrcweir                 if( !hData && XTYP_REQUEST == nCode )
133cdf0e10cSrcweir                 {
134cdf0e10cSrcweir 
135cdf0e10cSrcweir                 }
136cdf0e10cSrcweir 
137cdf0e10cSrcweir                 DdeData d;
138cdf0e10cSrcweir                 d.pImp->hData = hData;
139cdf0e10cSrcweir                 d.pImp->nFmt  = DdeData::GetInternalFormat( nCbType );
140cdf0e10cSrcweir                 d.Lock();
141cdf0e10cSrcweir                 t->Data( &d );
142cdf0e10cSrcweir                 nRet = (HDDEDATA)DDE_FACK;
143cdf0e10cSrcweir                 break;
144cdf0e10cSrcweir             }
145cdf0e10cSrcweir         }
146cdf0e10cSrcweir     }
147cdf0e10cSrcweir     return nRet;
148cdf0e10cSrcweir }
149cdf0e10cSrcweir 
150cdf0e10cSrcweir // --- DdeConnection::DdeConnection() ------------------------------
151cdf0e10cSrcweir 
DdeConnection(const String & rService,const String & rTopic)152cdf0e10cSrcweir DdeConnection::DdeConnection( const String& rService, const String& rTopic )
153cdf0e10cSrcweir {
154cdf0e10cSrcweir     pImp = new DdeImp;
155cdf0e10cSrcweir     pImp->nStatus  = DMLERR_NO_ERROR;
156cdf0e10cSrcweir     pImp->hConv    = NULL;
157cdf0e10cSrcweir 
158cdf0e10cSrcweir     DdeInstData* pInst = ImpGetInstData();
159cdf0e10cSrcweir     if( !pInst )
160cdf0e10cSrcweir         pInst = ImpInitInstData();
161cdf0e10cSrcweir     pInst->nRefCount++;
162cdf0e10cSrcweir     pInst->nInstanceCli++;
163cdf0e10cSrcweir     if ( !pInst->hDdeInstCli )
164cdf0e10cSrcweir     {
165cdf0e10cSrcweir         pImp->nStatus = DdeInitialize( &pInst->hDdeInstCli,
166cdf0e10cSrcweir                                        (PFNCALLBACK)DdeInternal::CliCallback,
167cdf0e10cSrcweir                                        APPCLASS_STANDARD | APPCMD_CLIENTONLY |
168cdf0e10cSrcweir                                        CBF_FAIL_ALLSVRXACTIONS |
169cdf0e10cSrcweir                                        CBF_SKIP_REGISTRATIONS  |
170cdf0e10cSrcweir                                        CBF_SKIP_UNREGISTRATIONS, 0L );
171cdf0e10cSrcweir         pInst->pConnections = new DdeConnections;
172cdf0e10cSrcweir     }
173cdf0e10cSrcweir 
174cdf0e10cSrcweir     pService = new DdeString( pInst->hDdeInstCli, rService );
175cdf0e10cSrcweir     pTopic   = new DdeString( pInst->hDdeInstCli, rTopic );
176cdf0e10cSrcweir 
177cdf0e10cSrcweir     if ( pImp->nStatus == DMLERR_NO_ERROR )
178cdf0e10cSrcweir     {
179cdf0e10cSrcweir         pImp->hConv = DdeConnect( pInst->hDdeInstCli,*pService,*pTopic, NULL);
180cdf0e10cSrcweir         if( !pImp->hConv )
181cdf0e10cSrcweir             pImp->nStatus = DdeGetLastError( pInst->hDdeInstCli );
182cdf0e10cSrcweir     }
183cdf0e10cSrcweir 
184cdf0e10cSrcweir     if ( pInst->pConnections )
185cdf0e10cSrcweir         pInst->pConnections->Insert( this );
186cdf0e10cSrcweir }
187cdf0e10cSrcweir 
188cdf0e10cSrcweir // --- DdeConnection::~DdeConnection() -----------------------------
189cdf0e10cSrcweir 
~DdeConnection()190cdf0e10cSrcweir DdeConnection::~DdeConnection()
191cdf0e10cSrcweir {
192cdf0e10cSrcweir     if ( pImp->hConv )
193cdf0e10cSrcweir         DdeDisconnect( pImp->hConv );
194cdf0e10cSrcweir 
195cdf0e10cSrcweir     delete pService;
196cdf0e10cSrcweir     delete pTopic;
197cdf0e10cSrcweir 
198cdf0e10cSrcweir     DdeInstData* pInst = ImpGetInstData();
199cdf0e10cSrcweir     DBG_ASSERT(pInst,"SVDDE:No instance data");
200cdf0e10cSrcweir     if ( pInst->pConnections )
201cdf0e10cSrcweir         pInst->pConnections->Remove( this );
202cdf0e10cSrcweir 
203cdf0e10cSrcweir     pInst->nInstanceCli--;
204cdf0e10cSrcweir     pInst->nRefCount--;
205cdf0e10cSrcweir     if ( !pInst->nInstanceCli && pInst->hDdeInstCli )
206cdf0e10cSrcweir     {
207cdf0e10cSrcweir         if( DdeUninitialize( pInst->hDdeInstCli ) )
208cdf0e10cSrcweir         {
209cdf0e10cSrcweir             pInst->hDdeInstCli = NULL;
210cdf0e10cSrcweir             delete pInst->pConnections;
211cdf0e10cSrcweir             pInst->pConnections = NULL;
212cdf0e10cSrcweir             if( pInst->nRefCount == 0 )
213cdf0e10cSrcweir                 ImpDeinitInstData();
214cdf0e10cSrcweir         }
215cdf0e10cSrcweir     }
216cdf0e10cSrcweir     delete pImp;
217cdf0e10cSrcweir }
218cdf0e10cSrcweir 
219cdf0e10cSrcweir // --- DdeConnection::IsConnected() --------------------------------
220cdf0e10cSrcweir 
IsConnected()221cdf0e10cSrcweir sal_Bool DdeConnection::IsConnected()
222cdf0e10cSrcweir {
223cdf0e10cSrcweir     CONVINFO c;
224cdf0e10cSrcweir #ifdef OS2
225cdf0e10cSrcweir     c.nSize = sizeof( c );
226cdf0e10cSrcweir #else
227cdf0e10cSrcweir     c.cb = sizeof( c );
228cdf0e10cSrcweir #endif
229cdf0e10cSrcweir     if ( DdeQueryConvInfo( pImp->hConv, QID_SYNC, &c ) )
230cdf0e10cSrcweir         return sal_True;
231cdf0e10cSrcweir     else
232cdf0e10cSrcweir     {
233cdf0e10cSrcweir         DdeInstData* pInst = ImpGetInstData();
234cdf0e10cSrcweir         pImp->hConv = DdeReconnect( pImp->hConv );
235cdf0e10cSrcweir         pImp->nStatus = pImp->hConv ? DMLERR_NO_ERROR : DdeGetLastError( pInst->hDdeInstCli );
236cdf0e10cSrcweir         return sal_Bool( pImp->nStatus == DMLERR_NO_ERROR );
237cdf0e10cSrcweir     }
238cdf0e10cSrcweir }
239cdf0e10cSrcweir 
240cdf0e10cSrcweir // --- DdeConnection::GetServiceName() -----------------------------
241cdf0e10cSrcweir 
GetServiceName()242cdf0e10cSrcweir const String& DdeConnection::GetServiceName()
243cdf0e10cSrcweir {
244cdf0e10cSrcweir     return (const String&)*pService;
245cdf0e10cSrcweir }
246cdf0e10cSrcweir 
247cdf0e10cSrcweir // --- DdeConnection::GetTopicName() -------------------------------
248cdf0e10cSrcweir 
GetTopicName()249cdf0e10cSrcweir const String& DdeConnection::GetTopicName()
250cdf0e10cSrcweir {
251cdf0e10cSrcweir     return (const String&)*pTopic;
252cdf0e10cSrcweir }
253cdf0e10cSrcweir 
254cdf0e10cSrcweir // --- DdeConnection::GetConvId() ----------------------------------
255cdf0e10cSrcweir 
GetConvId()256*c4c57a27SDamjan Jovanovic sal_uIntPtr DdeConnection::GetConvId()
257cdf0e10cSrcweir {
258*c4c57a27SDamjan Jovanovic     return (sal_uIntPtr)pImp->hConv;
259cdf0e10cSrcweir }
260cdf0e10cSrcweir 
GetConnections()261cdf0e10cSrcweir const DdeConnections& DdeConnection::GetConnections()
262cdf0e10cSrcweir {
263cdf0e10cSrcweir     DdeInstData* pInst = ImpGetInstData();
264cdf0e10cSrcweir     DBG_ASSERT(pInst,"SVDDE:No instance data");
265cdf0e10cSrcweir     return *(pInst->pConnections);
266cdf0e10cSrcweir }
267cdf0e10cSrcweir 
268cdf0e10cSrcweir // --- DdeTransaction::DdeTransaction() ----------------------------
269cdf0e10cSrcweir 
DdeTransaction(DdeConnection & d,const String & rItemName,long n)270cdf0e10cSrcweir DdeTransaction::DdeTransaction( DdeConnection& d, const String& rItemName,
271cdf0e10cSrcweir                                 long n ) :
272cdf0e10cSrcweir                     rDde( d )
273cdf0e10cSrcweir {
274cdf0e10cSrcweir     DdeInstData* pInst = ImpGetInstData();
275cdf0e10cSrcweir     pName = new DdeString( pInst->hDdeInstCli, rItemName );
276cdf0e10cSrcweir     nTime = n;
277cdf0e10cSrcweir     nId   = 0;
278cdf0e10cSrcweir     nType = 0;
279cdf0e10cSrcweir     bBusy = sal_False;
280cdf0e10cSrcweir 
281cdf0e10cSrcweir     rDde.aTransactions.Insert( this );
282cdf0e10cSrcweir }
283cdf0e10cSrcweir 
284cdf0e10cSrcweir // --- DdeTransaction::~DdeTransaction() ---------------------------
285cdf0e10cSrcweir 
~DdeTransaction()286cdf0e10cSrcweir DdeTransaction::~DdeTransaction()
287cdf0e10cSrcweir {
288cdf0e10cSrcweir     if ( nId && rDde.pImp->hConv )
289cdf0e10cSrcweir     {
290cdf0e10cSrcweir         DdeInstData* pInst = ImpGetInstData();
291cdf0e10cSrcweir         DdeAbandonTransaction( pInst->hDdeInstCli, rDde.pImp->hConv, nId );
292cdf0e10cSrcweir     }
293cdf0e10cSrcweir 
294cdf0e10cSrcweir     delete pName;
295cdf0e10cSrcweir     rDde.aTransactions.Remove( this );
296cdf0e10cSrcweir }
297cdf0e10cSrcweir 
298cdf0e10cSrcweir // --- DdeTransaction::Execute() -----------------------------------
299cdf0e10cSrcweir 
Execute()300cdf0e10cSrcweir void DdeTransaction::Execute()
301cdf0e10cSrcweir {
302cdf0e10cSrcweir     HSZ     hItem = *pName;
303cdf0e10cSrcweir     void*   pData = (void*)(const void *)aDdeData;
304cdf0e10cSrcweir     DWORD   nData = (DWORD)(long)aDdeData;
305cdf0e10cSrcweir     sal_uLong   nIntFmt = aDdeData.pImp->nFmt;
306cdf0e10cSrcweir     UINT    nExtFmt  = DdeData::GetExternalFormat( nIntFmt );
307cdf0e10cSrcweir     DdeInstData* pInst = ImpGetInstData();
308cdf0e10cSrcweir 
309cdf0e10cSrcweir     if ( nType == XTYP_EXECUTE )
310cdf0e10cSrcweir         hItem = NULL;
311cdf0e10cSrcweir     if ( nType != XTYP_EXECUTE && nType != XTYP_POKE )
312cdf0e10cSrcweir     {
313cdf0e10cSrcweir         pData = NULL;
314cdf0e10cSrcweir         nData = 0L;
315cdf0e10cSrcweir     }
316cdf0e10cSrcweir     if ( nTime )
317cdf0e10cSrcweir     {
318cdf0e10cSrcweir         HDDEDATA hData = DdeClientTransaction( (unsigned char*)pData,
319cdf0e10cSrcweir                                                nData, rDde.pImp->hConv,
320cdf0e10cSrcweir                                                hItem, nExtFmt, (UINT)nType,
321cdf0e10cSrcweir                                                (DWORD)nTime, (DWORD FAR*)NULL );
322cdf0e10cSrcweir 
323cdf0e10cSrcweir         rDde.pImp->nStatus = DdeGetLastError( pInst->hDdeInstCli );
324cdf0e10cSrcweir         if( hData && nType == XTYP_REQUEST )
325cdf0e10cSrcweir         {
326cdf0e10cSrcweir             {
327cdf0e10cSrcweir                 DdeData d;
328cdf0e10cSrcweir                 d.pImp->hData = hData;
329cdf0e10cSrcweir                 d.pImp->nFmt = nIntFmt;
330cdf0e10cSrcweir                 d.Lock();
331cdf0e10cSrcweir                 Data( &d );
332cdf0e10cSrcweir             }
333cdf0e10cSrcweir             DdeFreeDataHandle( hData );
334cdf0e10cSrcweir         }
335cdf0e10cSrcweir     }
336cdf0e10cSrcweir     else
337cdf0e10cSrcweir     {
338cdf0e10cSrcweir         if ( nId && rDde.pImp->hConv )
339cdf0e10cSrcweir             DdeAbandonTransaction( pInst->hDdeInstCli, rDde.pImp->hConv, nId);
340cdf0e10cSrcweir         nId = 0;
341cdf0e10cSrcweir         bBusy = sal_True;
342cdf0e10cSrcweir         HDDEDATA hRet = DdeClientTransaction( (unsigned char*)pData, nData,
343cdf0e10cSrcweir                                             rDde.pImp->hConv, hItem, nExtFmt,
344cdf0e10cSrcweir                                             (UINT)nType, TIMEOUT_ASYNC,
345cdf0e10cSrcweir                                             (DWORD FAR *) ((long*) &nId) );
346cdf0e10cSrcweir         rDde.pImp->nStatus = hRet ? DMLERR_NO_ERROR
347cdf0e10cSrcweir                                   : DdeGetLastError( pInst->hDdeInstCli );
348cdf0e10cSrcweir     }
349cdf0e10cSrcweir }
350cdf0e10cSrcweir 
351cdf0e10cSrcweir // --- DdeTransaction::GetName() -----------------------------------
352cdf0e10cSrcweir 
GetName() const353cdf0e10cSrcweir const String& DdeTransaction::GetName() const
354cdf0e10cSrcweir {
355cdf0e10cSrcweir     return *pName;
356cdf0e10cSrcweir }
357cdf0e10cSrcweir 
358cdf0e10cSrcweir // --- DdeTransaction::Data() --------------------------------------
359cdf0e10cSrcweir 
360cdf0e10cSrcweir 
Data(const DdeData * p)361cdf0e10cSrcweir void __EXPORT DdeTransaction::Data( const DdeData* p )
362cdf0e10cSrcweir {
363cdf0e10cSrcweir     if ( ::tools::SolarMutex::Acquire() )
364cdf0e10cSrcweir     {
365cdf0e10cSrcweir         aData.Call( (void*)p );
366cdf0e10cSrcweir         ::tools::SolarMutex::Release();
367cdf0e10cSrcweir     }
368cdf0e10cSrcweir }
369cdf0e10cSrcweir 
370cdf0e10cSrcweir // --- DdeTransaction::Done() --------------------------------------
371cdf0e10cSrcweir 
Done(sal_Bool bDataValid)372cdf0e10cSrcweir void __EXPORT DdeTransaction::Done( sal_Bool bDataValid )
373cdf0e10cSrcweir {
374cdf0e10cSrcweir     aDone.Call( (void*)bDataValid );
375cdf0e10cSrcweir }
376cdf0e10cSrcweir 
377cdf0e10cSrcweir // --- DdeLink::DdeLink() ------------------------------------------
378cdf0e10cSrcweir 
DdeLink(DdeConnection & d,const String & aItemName,long n)379cdf0e10cSrcweir DdeLink::DdeLink( DdeConnection& d, const String& aItemName, long n ) :
380cdf0e10cSrcweir             DdeTransaction (d, aItemName, n)
381cdf0e10cSrcweir {
382cdf0e10cSrcweir }
383cdf0e10cSrcweir 
384cdf0e10cSrcweir // --- DdeLink::~DdeLink() -----------------------------------------
385cdf0e10cSrcweir 
~DdeLink()386cdf0e10cSrcweir DdeLink::~DdeLink()
387cdf0e10cSrcweir {
388cdf0e10cSrcweir     nType = (sal_uInt16)XTYP_ADVSTOP;
389cdf0e10cSrcweir     nTime = 0;
390cdf0e10cSrcweir }
391cdf0e10cSrcweir 
392cdf0e10cSrcweir // --- DdeLink::Notify() -----------------------------------------
393cdf0e10cSrcweir 
Notify()394cdf0e10cSrcweir void __EXPORT DdeLink::Notify()
395cdf0e10cSrcweir {
396cdf0e10cSrcweir     aNotify.Call( NULL );
397cdf0e10cSrcweir }
398cdf0e10cSrcweir 
399cdf0e10cSrcweir // --- DdeRequest::DdeRequest() ------------------------------------
400cdf0e10cSrcweir 
DdeRequest(DdeConnection & d,const String & i,long n)401cdf0e10cSrcweir DdeRequest::DdeRequest( DdeConnection& d, const String& i, long n ) :
402cdf0e10cSrcweir                 DdeTransaction( d, i, n )
403cdf0e10cSrcweir {
404cdf0e10cSrcweir     nType = XTYP_REQUEST;
405cdf0e10cSrcweir }
406cdf0e10cSrcweir 
407cdf0e10cSrcweir // --- DdeWarmLink::DdeWarmLink() ----------------------------------
408cdf0e10cSrcweir 
DdeWarmLink(DdeConnection & d,const String & i,long n)409cdf0e10cSrcweir DdeWarmLink::DdeWarmLink( DdeConnection& d, const String& i, long n ) :
410cdf0e10cSrcweir                 DdeLink( d, i, n )
411cdf0e10cSrcweir {
412cdf0e10cSrcweir     nType = XTYP_ADVSTART | XTYPF_NODATA;
413cdf0e10cSrcweir }
414cdf0e10cSrcweir 
415cdf0e10cSrcweir // --- DdeHotLink::DdeHotLink() ------------------------------------
416cdf0e10cSrcweir 
DdeHotLink(DdeConnection & d,const String & i,long n)417cdf0e10cSrcweir DdeHotLink::DdeHotLink( DdeConnection& d, const String& i, long n ) :
418cdf0e10cSrcweir                 DdeLink( d, i, n )
419cdf0e10cSrcweir {
420cdf0e10cSrcweir     nType = XTYP_ADVSTART;
421cdf0e10cSrcweir }
422cdf0e10cSrcweir 
423cdf0e10cSrcweir // --- DdePoke::DdePoke() ------------------------------------------
424cdf0e10cSrcweir 
DdePoke(DdeConnection & d,const String & i,const char * p,long l,sal_uLong f,long n)425cdf0e10cSrcweir DdePoke::DdePoke( DdeConnection& d, const String& i, const char* p,
426cdf0e10cSrcweir                   long l, sal_uLong f, long n ) :
427cdf0e10cSrcweir             DdeTransaction( d, i, n )
428cdf0e10cSrcweir {
429cdf0e10cSrcweir     aDdeData = DdeData( p, l, f );
430cdf0e10cSrcweir     nType = XTYP_POKE;
431cdf0e10cSrcweir }
432cdf0e10cSrcweir 
433cdf0e10cSrcweir // --- DdePoke::DdePoke() ------------------------------------------
434cdf0e10cSrcweir 
DdePoke(DdeConnection & d,const String & i,const String & rData,long n)435cdf0e10cSrcweir DdePoke::DdePoke( DdeConnection& d, const String& i, const String& rData,
436cdf0e10cSrcweir                   long n ) :
437cdf0e10cSrcweir             DdeTransaction( d, i, n )
438cdf0e10cSrcweir {
439cdf0e10cSrcweir //  ByteString aByteStr( rData, osl_getThreadTextEncoding() );
440cdf0e10cSrcweir     aDdeData = DdeData( (void*) rData.GetBuffer(), sizeof(sal_Unicode) * (rData.Len()), CF_TEXT );
441cdf0e10cSrcweir     nType = XTYP_POKE;
442cdf0e10cSrcweir }
443cdf0e10cSrcweir 
444cdf0e10cSrcweir // --- DdePoke::DdePoke() ------------------------------------------
445cdf0e10cSrcweir 
DdePoke(DdeConnection & d,const String & i,const DdeData & rData,long n)446cdf0e10cSrcweir DdePoke::DdePoke( DdeConnection& d, const String& i, const DdeData& rData,
447cdf0e10cSrcweir                   long n ) :
448cdf0e10cSrcweir             DdeTransaction( d, i, n )
449cdf0e10cSrcweir {
450cdf0e10cSrcweir     aDdeData = rData;
451cdf0e10cSrcweir     nType = XTYP_POKE;
452cdf0e10cSrcweir }
453cdf0e10cSrcweir 
454cdf0e10cSrcweir // --- DdeExecute::DdeExecute() ------------------------------------
455cdf0e10cSrcweir 
DdeExecute(DdeConnection & d,const String & rData,long n)456cdf0e10cSrcweir DdeExecute::DdeExecute( DdeConnection& d, const String& rData, long n ) :
457cdf0e10cSrcweir                 DdeTransaction( d, String(), n )
458cdf0e10cSrcweir {
459cdf0e10cSrcweir //  ByteString aByteStr( rData, osl_getThreadTextEncoding() );
460cdf0e10cSrcweir     aDdeData = DdeData( (void*)rData.GetBuffer(), sizeof(sal_Unicode) * (rData.Len() + 1), CF_TEXT );
461cdf0e10cSrcweir     nType = XTYP_EXECUTE;
462cdf0e10cSrcweir }
463cdf0e10cSrcweir 
464cdf0e10cSrcweir // --- DdeConnection::GetError() -----------------------------------
465cdf0e10cSrcweir 
GetError()466cdf0e10cSrcweir long DdeConnection::GetError()
467cdf0e10cSrcweir {
468cdf0e10cSrcweir     return pImp->nStatus;
469cdf0e10cSrcweir }
470