blob: d07120e0a56c62a148c0b03ee1104c5c2101b6db [file] [log] [blame]
/**************************************************************
*
* 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 <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;
}