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
10*40df464eSAndrew Rist *
11*40df464eSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12*40df464eSAndrew Rist *
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.
19*40df464eSAndrew Rist *
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
29cdf0e10cSrcweir #include <string.h>
30cdf0e10cSrcweir #include "ddeimp.hxx"
31cdf0e10cSrcweir #include <svl/svdde.hxx>
32cdf0e10cSrcweir
33cdf0e10cSrcweir // --- DdeInternal::InfCallback() ----------------------------------
34cdf0e10cSrcweir
35cdf0e10cSrcweir #ifdef WNT
InfCallback(WORD,WORD,HCONV,HSZ,HSZ,HDDEDATA,DWORD,DWORD)36cdf0e10cSrcweir HDDEDATA CALLBACK DdeInternal::InfCallback(
37cdf0e10cSrcweir WORD, WORD, HCONV, HSZ, HSZ, HDDEDATA, DWORD, DWORD )
38cdf0e10cSrcweir #else
39cdf0e10cSrcweir #if defined ( MTW ) || ( defined ( GCC ) && defined ( OS2 )) || defined( ICC )
40cdf0e10cSrcweir HDDEDATA CALLBACK __EXPORT DdeInternal::InfCallback(
41cdf0e10cSrcweir WORD, WORD, HCONV, HSZ, HSZ, HDDEDATA, DWORD, DWORD )
42cdf0e10cSrcweir #else
43cdf0e10cSrcweir HDDEDATA CALLBACK _export DdeInternal::InfCallback(
44cdf0e10cSrcweir WORD, WORD, HCONV, HSZ, HSZ, HDDEDATA, DWORD, DWORD )
45cdf0e10cSrcweir #endif
46cdf0e10cSrcweir #endif
47cdf0e10cSrcweir {
48cdf0e10cSrcweir return (HDDEDATA)DDE_FNOTPROCESSED;
49cdf0e10cSrcweir }
50cdf0e10cSrcweir
51cdf0e10cSrcweir // --- DdeServiceList::DdeServiceList() ----------------------------
52cdf0e10cSrcweir
DdeServiceList(const String * pTopic)53cdf0e10cSrcweir DdeServiceList::DdeServiceList( const String* pTopic )
54cdf0e10cSrcweir {
55cdf0e10cSrcweir DWORD hDdeInst = NULL;
56cdf0e10cSrcweir HCONVLIST hConvList = NULL;
57cdf0e10cSrcweir HCONV hConv = NULL;
58cdf0e10cSrcweir UINT nStatus = DMLERR_NO_ERROR;
59cdf0e10cSrcweir HSZ hTopic = NULL;
60cdf0e10cSrcweir
61cdf0e10cSrcweir #ifndef OS2 // YD FIXME
62cdf0e10cSrcweir
63cdf0e10cSrcweir nStatus = DdeInitialize( &hDdeInst, (PFNCALLBACK) DdeInternal::InfCallback,
64cdf0e10cSrcweir APPCLASS_STANDARD | APPCMD_CLIENTONLY |
65cdf0e10cSrcweir CBF_FAIL_ALLSVRXACTIONS |
66cdf0e10cSrcweir CBF_SKIP_ALLNOTIFICATIONS, 0L );
67cdf0e10cSrcweir
68cdf0e10cSrcweir if ( nStatus == DMLERR_NO_ERROR )
69cdf0e10cSrcweir {
70cdf0e10cSrcweir if ( pTopic )
71cdf0e10cSrcweir {
72cdf0e10cSrcweir LPCTSTR p = reinterpret_cast<LPCTSTR>(pTopic->GetBuffer());
73cdf0e10cSrcweir #ifdef __MINGW32__
74cdf0e10cSrcweir hTopic = DdeCreateStringHandle( hDdeInst, const_cast<LPTSTR>(p), CP_WINUNICODE );
75cdf0e10cSrcweir #else
76cdf0e10cSrcweir hTopic = DdeCreateStringHandle( hDdeInst, p, CP_WINUNICODE );
77cdf0e10cSrcweir #endif
78cdf0e10cSrcweir }
79cdf0e10cSrcweir
80cdf0e10cSrcweir hConvList = DdeConnectList( hDdeInst, NULL, hTopic, NULL, NULL );
81cdf0e10cSrcweir nStatus = DdeGetLastError( hDdeInst );
82cdf0e10cSrcweir }
83cdf0e10cSrcweir
84cdf0e10cSrcweir if ( nStatus == DMLERR_NO_ERROR )
85cdf0e10cSrcweir {
86cdf0e10cSrcweir while ( ( hConv = DdeQueryNextServer( hConvList, hConv ) ) != NULL)
87cdf0e10cSrcweir {
88cdf0e10cSrcweir CONVINFO aInf;
89cdf0e10cSrcweir TCHAR buf[256], *p;
90cdf0e10cSrcweir HSZ h;
91cdf0e10cSrcweir #ifdef OS2
92cdf0e10cSrcweir aInf.nSize = sizeof( aInf );
93cdf0e10cSrcweir #else
94cdf0e10cSrcweir aInf.cb = sizeof( aInf );
95cdf0e10cSrcweir #endif
96cdf0e10cSrcweir if( DdeQueryConvInfo( hConv, QID_SYNC, &aInf))
97cdf0e10cSrcweir {
98cdf0e10cSrcweir h = aInf.hszServiceReq;
99cdf0e10cSrcweir if ( !h )
100cdf0e10cSrcweir #ifndef OS2
101cdf0e10cSrcweir h = aInf.hszSvcPartner;
102cdf0e10cSrcweir #else
103cdf0e10cSrcweir h = aInf.hszPartner;
104cdf0e10cSrcweir #endif
105cdf0e10cSrcweir DdeQueryString( hDdeInst, h, buf, sizeof(buf) / sizeof(TCHAR), CP_WINUNICODE );
106cdf0e10cSrcweir p = buf + lstrlen( buf );
107cdf0e10cSrcweir *p++ = '|'; *p = 0;
108cdf0e10cSrcweir DdeQueryString( hDdeInst, aInf.hszTopic, p, sizeof(buf)/sizeof(TCHAR)-lstrlen( buf ),
109cdf0e10cSrcweir CP_WINUNICODE );
110cdf0e10cSrcweir aServices.Insert( new String( reinterpret_cast<const sal_Unicode*>(buf) ) );
111cdf0e10cSrcweir }
112cdf0e10cSrcweir }
113cdf0e10cSrcweir DdeDisconnectList( hConvList );
114cdf0e10cSrcweir }
115cdf0e10cSrcweir
116cdf0e10cSrcweir if ( hTopic)
117cdf0e10cSrcweir DdeFreeStringHandle( hDdeInst, hTopic );
118cdf0e10cSrcweir if ( hDdeInst )
119cdf0e10cSrcweir DdeUninitialize( hDdeInst );
120cdf0e10cSrcweir
121cdf0e10cSrcweir #endif
122cdf0e10cSrcweir
123cdf0e10cSrcweir }
124cdf0e10cSrcweir
125cdf0e10cSrcweir // --- DdeServiceList::~DdeServiceList() ---------------------------
126cdf0e10cSrcweir
~DdeServiceList()127cdf0e10cSrcweir DdeServiceList::~DdeServiceList()
128cdf0e10cSrcweir {
129cdf0e10cSrcweir String* s;
130cdf0e10cSrcweir while ( ( s = aServices.First() ) != NULL )
131cdf0e10cSrcweir {
132cdf0e10cSrcweir aServices.Remove( s );
133cdf0e10cSrcweir delete s;
134cdf0e10cSrcweir }
135cdf0e10cSrcweir }
136cdf0e10cSrcweir
137cdf0e10cSrcweir // --- DdeTopicList::DdeTopicList() --------------------------------
138cdf0e10cSrcweir
DdeTopicList(const String & rService)139cdf0e10cSrcweir DdeTopicList::DdeTopicList( const String& rService )
140cdf0e10cSrcweir {
141cdf0e10cSrcweir DdeConnection aSys( rService, String( reinterpret_cast<const sal_Unicode*>(SZDDESYS_TOPIC) ) );
142cdf0e10cSrcweir
143cdf0e10cSrcweir if ( !aSys.GetError() )
144cdf0e10cSrcweir {
145cdf0e10cSrcweir DdeRequest aReq( aSys, String( reinterpret_cast<const sal_Unicode*>(SZDDESYS_ITEM_TOPICS) ), 500 );
146cdf0e10cSrcweir aReq.SetDataHdl( LINK( this, DdeTopicList, Data ) );
147cdf0e10cSrcweir aReq.Execute();
148cdf0e10cSrcweir }
149cdf0e10cSrcweir }
150cdf0e10cSrcweir
151cdf0e10cSrcweir // --- DdeTopicList::~DdeTopicList() -------------------------------
152cdf0e10cSrcweir
~DdeTopicList()153cdf0e10cSrcweir DdeTopicList::~DdeTopicList()
154cdf0e10cSrcweir {
155cdf0e10cSrcweir String* s;
156cdf0e10cSrcweir while ( ( s = aTopics.First() ) != NULL )
157cdf0e10cSrcweir {
158cdf0e10cSrcweir aTopics.Remove( s );
159cdf0e10cSrcweir delete s;
160cdf0e10cSrcweir }
161cdf0e10cSrcweir }
162cdf0e10cSrcweir
163cdf0e10cSrcweir // --- DdeTopicList::Data() --------------------------------------------
164cdf0e10cSrcweir
IMPL_LINK(DdeTopicList,Data,DdeData *,pData)165cdf0e10cSrcweir IMPL_LINK( DdeTopicList, Data, DdeData*, pData )
166cdf0e10cSrcweir {
167cdf0e10cSrcweir char* p = (char*) (const void *) *pData;
168cdf0e10cSrcweir char* q = p;
169cdf0e10cSrcweir short i;
170cdf0e10cSrcweir char buf[256];
171cdf0e10cSrcweir
172cdf0e10cSrcweir while ( *p && *p != '\r' && *p != '\n' )
173cdf0e10cSrcweir {
174cdf0e10cSrcweir q = buf; i = 0;
175cdf0e10cSrcweir while ( i < 255 && *p && *p != '\r' && *p != '\n' && *p != '\t' )
176cdf0e10cSrcweir *q++ = *p++, i++;
177cdf0e10cSrcweir *q = 0;
178cdf0e10cSrcweir while ( *p && *p != '\r' && *p != '\n' && *p != '\t' )
179cdf0e10cSrcweir p++;
180cdf0e10cSrcweir aTopics.Insert( new String( String::CreateFromAscii(buf) ) );
181cdf0e10cSrcweir if ( *p == '\t' )
182cdf0e10cSrcweir p++;
183cdf0e10cSrcweir }
184cdf0e10cSrcweir return 0;
185cdf0e10cSrcweir }
186cdf0e10cSrcweir
187