/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_svl.hxx" #define UNICODE #include #include "ddeimp.hxx" #include // --- 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(pTopic->GetBuffer()); #ifdef __MINGW32__ hTopic = DdeCreateStringHandle( hDdeInst, const_cast(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(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(SZDDESYS_TOPIC) ) ); if ( !aSys.GetError() ) { DdeRequest aReq( aSys, String( reinterpret_cast(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; }