1*40df464eSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*40df464eSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*40df464eSAndrew Rist * or more contributor license agreements. See the NOTICE file 5*40df464eSAndrew Rist * distributed with this work for additional information 6*40df464eSAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*40df464eSAndrew Rist * to you under the Apache License, Version 2.0 (the 8*40df464eSAndrew Rist * "License"); you may not use this file except in compliance 9*40df464eSAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*40df464eSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*40df464eSAndrew Rist * Unless required by applicable law or agreed to in writing, 14*40df464eSAndrew Rist * software distributed under the License is distributed on an 15*40df464eSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*40df464eSAndrew Rist * KIND, either express or implied. See the License for the 17*40df464eSAndrew Rist * specific language governing permissions and limitations 18*40df464eSAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*40df464eSAndrew Rist *************************************************************/ 21*40df464eSAndrew Rist 22*40df464eSAndrew 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 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 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 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 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 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 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 242cdf0e10cSrcweir const String& DdeConnection::GetServiceName() 243cdf0e10cSrcweir { 244cdf0e10cSrcweir return (const String&)*pService; 245cdf0e10cSrcweir } 246cdf0e10cSrcweir 247cdf0e10cSrcweir // --- DdeConnection::GetTopicName() ------------------------------- 248cdf0e10cSrcweir 249cdf0e10cSrcweir const String& DdeConnection::GetTopicName() 250cdf0e10cSrcweir { 251cdf0e10cSrcweir return (const String&)*pTopic; 252cdf0e10cSrcweir } 253cdf0e10cSrcweir 254cdf0e10cSrcweir // --- DdeConnection::GetConvId() ---------------------------------- 255cdf0e10cSrcweir 256cdf0e10cSrcweir long DdeConnection::GetConvId() 257cdf0e10cSrcweir { 258cdf0e10cSrcweir return (long)pImp->hConv; 259cdf0e10cSrcweir } 260cdf0e10cSrcweir 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 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 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 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 353cdf0e10cSrcweir const String& DdeTransaction::GetName() const 354cdf0e10cSrcweir { 355cdf0e10cSrcweir return *pName; 356cdf0e10cSrcweir } 357cdf0e10cSrcweir 358cdf0e10cSrcweir // --- DdeTransaction::Data() -------------------------------------- 359cdf0e10cSrcweir 360cdf0e10cSrcweir 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 372cdf0e10cSrcweir void __EXPORT DdeTransaction::Done( sal_Bool bDataValid ) 373cdf0e10cSrcweir { 374cdf0e10cSrcweir aDone.Call( (void*)bDataValid ); 375cdf0e10cSrcweir } 376cdf0e10cSrcweir 377cdf0e10cSrcweir // --- DdeLink::DdeLink() ------------------------------------------ 378cdf0e10cSrcweir 379cdf0e10cSrcweir DdeLink::DdeLink( DdeConnection& d, const String& aItemName, long n ) : 380cdf0e10cSrcweir DdeTransaction (d, aItemName, n) 381cdf0e10cSrcweir { 382cdf0e10cSrcweir } 383cdf0e10cSrcweir 384cdf0e10cSrcweir // --- DdeLink::~DdeLink() ----------------------------------------- 385cdf0e10cSrcweir 386cdf0e10cSrcweir DdeLink::~DdeLink() 387cdf0e10cSrcweir { 388cdf0e10cSrcweir nType = (sal_uInt16)XTYP_ADVSTOP; 389cdf0e10cSrcweir nTime = 0; 390cdf0e10cSrcweir } 391cdf0e10cSrcweir 392cdf0e10cSrcweir // --- DdeLink::Notify() ----------------------------------------- 393cdf0e10cSrcweir 394cdf0e10cSrcweir void __EXPORT DdeLink::Notify() 395cdf0e10cSrcweir { 396cdf0e10cSrcweir aNotify.Call( NULL ); 397cdf0e10cSrcweir } 398cdf0e10cSrcweir 399cdf0e10cSrcweir // --- DdeRequest::DdeRequest() ------------------------------------ 400cdf0e10cSrcweir 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 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 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 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 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 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 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 466cdf0e10cSrcweir long DdeConnection::GetError() 467cdf0e10cSrcweir { 468cdf0e10cSrcweir return pImp->nStatus; 469cdf0e10cSrcweir } 470