xref: /trunk/main/svl/source/svdde/ddeinf.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_svl.hxx"
30 
31 #define UNICODE
32 
33 #include <string.h>
34 #include "ddeimp.hxx"
35 #include <svl/svdde.hxx>
36 
37 // --- DdeInternal::InfCallback() ----------------------------------
38 
39 #ifdef WNT
40 HDDEDATA CALLBACK DdeInternal::InfCallback(
41                 WORD, WORD, HCONV, HSZ, HSZ, HDDEDATA, DWORD, DWORD )
42 #else
43 #if defined ( MTW ) || ( defined ( GCC ) && defined ( OS2 )) || defined( ICC )
44 HDDEDATA CALLBACK __EXPORT DdeInternal::InfCallback(
45                 WORD, WORD, HCONV, HSZ, HSZ, HDDEDATA, DWORD, DWORD )
46 #else
47 HDDEDATA CALLBACK _export DdeInternal::InfCallback(
48                 WORD, WORD, HCONV, HSZ, HSZ, HDDEDATA, DWORD, DWORD )
49 #endif
50 #endif
51 {
52     return (HDDEDATA)DDE_FNOTPROCESSED;
53 }
54 
55 // --- DdeServiceList::DdeServiceList() ----------------------------
56 
57 DdeServiceList::DdeServiceList( const String* pTopic )
58 {
59     DWORD       hDdeInst = NULL;
60     HCONVLIST   hConvList = NULL;
61     HCONV       hConv = NULL;
62     UINT        nStatus = DMLERR_NO_ERROR;
63     HSZ         hTopic = NULL;
64 
65 #ifndef OS2 // YD FIXME
66 
67     nStatus = DdeInitialize( &hDdeInst, (PFNCALLBACK) DdeInternal::InfCallback,
68                              APPCLASS_STANDARD | APPCMD_CLIENTONLY |
69                              CBF_FAIL_ALLSVRXACTIONS |
70                              CBF_SKIP_ALLNOTIFICATIONS, 0L );
71 
72     if ( nStatus == DMLERR_NO_ERROR )
73     {
74         if ( pTopic )
75         {
76             LPCTSTR p = reinterpret_cast<LPCTSTR>(pTopic->GetBuffer());
77 #ifdef __MINGW32__
78             hTopic = DdeCreateStringHandle( hDdeInst, const_cast<LPTSTR>(p), CP_WINUNICODE );
79 #else
80             hTopic = DdeCreateStringHandle( hDdeInst, p, CP_WINUNICODE );
81 #endif
82         }
83 
84         hConvList = DdeConnectList( hDdeInst, NULL, hTopic, NULL, NULL );
85         nStatus = DdeGetLastError( hDdeInst );
86     }
87 
88     if ( nStatus == DMLERR_NO_ERROR )
89     {
90         while ( ( hConv = DdeQueryNextServer( hConvList, hConv ) ) != NULL)
91         {
92             CONVINFO    aInf;
93             TCHAR       buf[256], *p;
94             HSZ         h;
95 #ifdef OS2
96             aInf.nSize = sizeof( aInf );
97 #else
98             aInf.cb = sizeof( aInf );
99 #endif
100             if( DdeQueryConvInfo( hConv, QID_SYNC, &aInf))
101             {
102                 h = aInf.hszServiceReq;
103                 if ( !h )
104 #ifndef OS2
105                     h = aInf.hszSvcPartner;
106 #else
107                     h = aInf.hszPartner;
108 #endif
109                 DdeQueryString( hDdeInst, h, buf, sizeof(buf) / sizeof(TCHAR), CP_WINUNICODE );
110                 p = buf + lstrlen( buf );
111                 *p++ = '|'; *p = 0;
112                 DdeQueryString( hDdeInst, aInf.hszTopic, p, sizeof(buf)/sizeof(TCHAR)-lstrlen( buf ),
113                                 CP_WINUNICODE );
114                 aServices.Insert( new String( reinterpret_cast<const sal_Unicode*>(buf) ) );
115             }
116         }
117         DdeDisconnectList( hConvList );
118     }
119 
120     if ( hTopic)
121         DdeFreeStringHandle( hDdeInst, hTopic );
122     if ( hDdeInst )
123         DdeUninitialize( hDdeInst );
124 
125 #endif
126 
127 }
128 
129 // --- DdeServiceList::~DdeServiceList() ---------------------------
130 
131 DdeServiceList::~DdeServiceList()
132 {
133     String* s;
134     while ( ( s = aServices.First() ) != NULL )
135     {
136         aServices.Remove( s );
137         delete s;
138     }
139 }
140 
141 // --- DdeTopicList::DdeTopicList() --------------------------------
142 
143 DdeTopicList::DdeTopicList( const String& rService )
144 {
145     DdeConnection aSys( rService, String( reinterpret_cast<const sal_Unicode*>(SZDDESYS_TOPIC) ) );
146 
147     if ( !aSys.GetError() )
148     {
149         DdeRequest aReq( aSys, String( reinterpret_cast<const sal_Unicode*>(SZDDESYS_ITEM_TOPICS) ), 500 );
150         aReq.SetDataHdl( LINK( this, DdeTopicList, Data ) );
151         aReq.Execute();
152     }
153 }
154 
155 // --- DdeTopicList::~DdeTopicList() -------------------------------
156 
157 DdeTopicList::~DdeTopicList()
158 {
159     String* s;
160     while ( ( s = aTopics.First() ) != NULL )
161     {
162         aTopics.Remove( s );
163         delete s;
164     }
165 }
166 
167 // --- DdeTopicList::Data() --------------------------------------------
168 
169 IMPL_LINK( DdeTopicList, Data, DdeData*, pData )
170 {
171     char*   p = (char*) (const void *) *pData;
172     char*   q = p;
173     short   i;
174     char    buf[256];
175 
176     while ( *p && *p != '\r' && *p != '\n' )
177     {
178         q = buf; i = 0;
179         while ( i < 255 && *p && *p != '\r' && *p != '\n' && *p != '\t' )
180             *q++ = *p++, i++;
181         *q = 0;
182         while ( *p && *p != '\r' && *p != '\n' && *p != '\t' )
183             p++;
184         aTopics.Insert( new String( String::CreateFromAscii(buf) ) );
185         if ( *p == '\t' )
186             p++;
187     }
188     return 0;
189 }
190 
191