diff options
Diffstat (limited to 'svl/source/svdde/ddeinf.cxx')
-rw-r--r-- | svl/source/svdde/ddeinf.cxx | 193 |
1 files changed, 193 insertions, 0 deletions
diff --git a/svl/source/svdde/ddeinf.cxx b/svl/source/svdde/ddeinf.cxx new file mode 100644 index 000000000000..b5154e1f7530 --- /dev/null +++ b/svl/source/svdde/ddeinf.cxx @@ -0,0 +1,193 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: ddeinf.cxx,v $ + * $Revision: 1.8 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_svl.hxx" + +#define UNICODE + +#include <string.h> +#include "ddeimp.hxx" +#include <svl/svdde.hxx> + +// --- DdeInternal::InfCallback() ---------------------------------- + +#ifdef WNT +HDDEDATA CALLBACK DdeInternal::InfCallback( + WORD, WORD, HCONV, HSZ, HSZ, HDDEDATA, DWORD, DWORD ) +#else +#if defined ( MTW ) || ( defined ( GCC ) && defined ( OS2 )) || defined( ICC ) +HDDEDATA CALLBACK __EXPORT DdeInternal::InfCallback( + WORD, WORD, HCONV, HSZ, HSZ, HDDEDATA, DWORD, DWORD ) +#else +HDDEDATA CALLBACK _export DdeInternal::InfCallback( + WORD, WORD, HCONV, HSZ, HSZ, HDDEDATA, DWORD, DWORD ) +#endif +#endif +{ + return (HDDEDATA)DDE_FNOTPROCESSED; +} + +// --- DdeServiceList::DdeServiceList() ---------------------------- + +DdeServiceList::DdeServiceList( const String* pTopic ) +{ + DWORD hDdeInst = NULL; + HCONVLIST hConvList = NULL; + HCONV hConv = NULL; + UINT nStatus = DMLERR_NO_ERROR; + HSZ hTopic = NULL; + +#ifndef OS2 // YD FIXME + + nStatus = DdeInitialize( &hDdeInst, (PFNCALLBACK) DdeInternal::InfCallback, + APPCLASS_STANDARD | APPCMD_CLIENTONLY | + CBF_FAIL_ALLSVRXACTIONS | + CBF_SKIP_ALLNOTIFICATIONS, 0L ); + + if ( nStatus == DMLERR_NO_ERROR ) + { + if ( pTopic ) + { + LPCTSTR p = reinterpret_cast<LPCTSTR>(pTopic->GetBuffer()); +#ifdef __MINGW32__ + hTopic = DdeCreateStringHandle( hDdeInst, const_cast<LPTSTR>(p), CP_WINUNICODE ); +#else + hTopic = DdeCreateStringHandle( hDdeInst, p, CP_WINUNICODE ); +#endif + } + + hConvList = DdeConnectList( hDdeInst, NULL, hTopic, NULL, NULL ); + nStatus = DdeGetLastError( hDdeInst ); + } + + if ( nStatus == DMLERR_NO_ERROR ) + { + while ( ( hConv = DdeQueryNextServer( hConvList, hConv ) ) != NULL) + { + CONVINFO aInf; + TCHAR buf[256], *p; + HSZ h; +#ifdef OS2 + aInf.nSize = sizeof( aInf ); +#else + aInf.cb = sizeof( aInf ); +#endif + if( DdeQueryConvInfo( hConv, QID_SYNC, &aInf)) + { + h = aInf.hszServiceReq; + if ( !h ) +#ifndef OS2 + h = aInf.hszSvcPartner; +#else + h = aInf.hszPartner; +#endif + DdeQueryString( hDdeInst, h, buf, sizeof(buf) / sizeof(TCHAR), CP_WINUNICODE ); + p = buf + lstrlen( buf ); + *p++ = '|'; *p = 0; + DdeQueryString( hDdeInst, aInf.hszTopic, p, sizeof(buf)/sizeof(TCHAR)-lstrlen( buf ), + CP_WINUNICODE ); + aServices.Insert( new String( reinterpret_cast<const sal_Unicode*>(buf) ) ); + } + } + DdeDisconnectList( hConvList ); + } + + if ( hTopic) + DdeFreeStringHandle( hDdeInst, hTopic ); + if ( hDdeInst ) + DdeUninitialize( hDdeInst ); + +#endif + +} + +// --- DdeServiceList::~DdeServiceList() --------------------------- + +DdeServiceList::~DdeServiceList() +{ + String* s; + while ( ( s = aServices.First() ) != NULL ) + { + aServices.Remove( s ); + delete s; + } +} + +// --- DdeTopicList::DdeTopicList() -------------------------------- + +DdeTopicList::DdeTopicList( const String& rService ) +{ + DdeConnection aSys( rService, String( reinterpret_cast<const sal_Unicode*>(SZDDESYS_TOPIC) ) ); + + if ( !aSys.GetError() ) + { + DdeRequest aReq( aSys, String( reinterpret_cast<const sal_Unicode*>(SZDDESYS_ITEM_TOPICS) ), 500 ); + aReq.SetDataHdl( LINK( this, DdeTopicList, Data ) ); + aReq.Execute(); + } +} + +// --- DdeTopicList::~DdeTopicList() ------------------------------- + +DdeTopicList::~DdeTopicList() +{ + String* s; + while ( ( s = aTopics.First() ) != NULL ) + { + aTopics.Remove( s ); + delete s; + } +} + +// --- DdeTopicList::Data() -------------------------------------------- + +IMPL_LINK( DdeTopicList, Data, DdeData*, pData ) +{ + char* p = (char*) (const void *) *pData; + char* q = p; + short i; + char buf[256]; + + while ( *p && *p != '\r' && *p != '\n' ) + { + q = buf; i = 0; + while ( i < 255 && *p && *p != '\r' && *p != '\n' && *p != '\t' ) + *q++ = *p++, i++; + *q = 0; + while ( *p && *p != '\r' && *p != '\n' && *p != '\t' ) + p++; + aTopics.Insert( new String( String::CreateFromAscii(buf) ) ); + if ( *p == '\t' ) + p++; + } + return 0; +} + |