Revert some really unwanted changes to the DDE code.
[wine] / dlls / user / dde / ddeml16.c
1 /*
2  * DDEML library
3  *
4  * Copyright 1997 Alexandre Julliard
5  * Copyright 1997 Len White
6  * Copyright 1999 Keith Matthews
7  * Copyright 2000 Corel
8  * Copyright 2001,2002 Eric Pouech
9  *
10  * This library is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU Lesser General Public
12  * License as published by the Free Software Foundation; either
13  * version 2.1 of the License, or (at your option) any later version.
14  *
15  * This library 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 GNU
18  * Lesser General Public License for more details.
19  *
20  * You should have received a copy of the GNU Lesser General Public
21  * License along with this library; if not, write to the Free Software
22  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23  */
24
25 #include <string.h>
26 #include "winbase.h"
27 #include "windef.h"
28 #include "wine/windef16.h"
29 #include "wingdi.h"
30 #include "winuser.h"
31 #include "winerror.h"
32 #include "wownt32.h"
33 #include "dde.h"
34 #include "ddeml.h"
35 #include "dde/dde_private.h"
36 #include "wine/debug.h"
37
38 WINE_DEFAULT_DEBUG_CHANNEL(ddeml);
39
40
41 typedef HDDEDATA (CALLBACK *PFNCALLBACK16)(UINT16,UINT16,HCONV,HSZ,HSZ,HDDEDATA,
42                                            DWORD,DWORD);
43
44 typedef struct
45 {
46     UINT16  cb;
47     UINT16  wFlags;
48     UINT16  wCountryID;
49     INT16   iCodePage;
50     DWORD   dwLangID;
51     DWORD   dwSecurity;
52 } CONVCONTEXT16, *LPCONVCONTEXT16;
53
54 typedef struct
55 {
56     DWORD          cb;
57     DWORD          hUser;
58     HCONV          hConvPartner;
59     HSZ            hszSvcPartner;
60     HSZ            hszServiceReq;
61     HSZ            hszTopic;
62     HSZ            hszItem;
63     UINT16         wFmt;
64     UINT16         wType;
65     UINT16         wStatus;
66     UINT16         wConvst;
67     UINT16         wLastError;
68     HCONVLIST      hConvList;
69     CONVCONTEXT16  ConvCtxt;
70 } CONVINFO16, *LPCONVINFO16;
71
72 static void map1632_conv_context(CONVCONTEXT* cc32, const CONVCONTEXT16* cc16)
73 {
74     cc32->cb = sizeof(*cc32);
75     cc32->wFlags = cc16->wFlags;
76     cc32->wCountryID = cc16->wCountryID;
77     cc32->iCodePage = cc16->iCodePage;
78     cc32->dwLangID = cc16->dwLangID;
79     cc32->dwSecurity = cc16->dwSecurity;
80 }
81
82 static void map3216_conv_context(CONVCONTEXT16* cc16, const CONVCONTEXT* cc32)
83 {
84     cc16->cb = sizeof(*cc16);
85     cc16->wFlags = cc32->wFlags;
86     cc16->wCountryID = cc32->wCountryID;
87     cc16->iCodePage = cc32->iCodePage;
88     cc16->dwLangID = cc32->dwLangID;
89     cc16->dwSecurity = cc32->dwSecurity;
90 }
91
92
93 /******************************************************************
94  *              WDML_InvokeCallback16
95  *
96  *
97  */
98 HDDEDATA        WDML_InvokeCallback16(PFNCALLBACK pfn, UINT uType, UINT uFmt,
99                                       HCONV hConv, HSZ hsz1, HSZ hsz2,
100                                       HDDEDATA hdata, DWORD dwData1, DWORD dwData2)
101 {
102     DWORD               d1 = 0;
103     HDDEDATA            ret;
104     CONVCONTEXT16       cc16;
105     WORD args[16];
106
107     switch (uType)
108     {
109     case XTYP_CONNECT:
110     case XTYP_WILDCONNECT:
111         if (dwData1)
112         {
113             map3216_conv_context(&cc16, (const CONVCONTEXT*)dwData1);
114             d1 = MapLS(&cc16);
115         }
116         else
117         break;
118     default:
119         d1 = dwData1;
120         break;
121     }
122     args[15] = HIWORD(uType);
123     args[14] = LOWORD(uType);
124     args[13] = HIWORD(uFmt);
125     args[12] = LOWORD(uFmt);
126     args[11] = HIWORD(hConv);
127     args[10] = LOWORD(hConv);
128     args[9]  = HIWORD(hsz1);
129     args[8]  = LOWORD(hsz1);
130     args[7]  = HIWORD(hsz2);
131     args[6]  = LOWORD(hsz2);
132     args[5]  = HIWORD(hdata);
133     args[4]  = LOWORD(hdata);
134     args[3]  = HIWORD(d1);
135     args[2]  = LOWORD(d1);
136     args[1]  = HIWORD(dwData2);
137     args[0]  = LOWORD(dwData2);
138     WOWCallback16Ex( (DWORD)pfn, WCB16_PASCAL, sizeof(args), args, (DWORD *)&ret );
139
140     switch (uType)
141     {
142     case XTYP_CONNECT:
143     case XTYP_WILDCONNECT:
144         if (d1 != 0) UnMapLS(d1);
145         break;
146     }
147     return ret;
148 }
149
150 /******************************************************************************
151  *            DdeInitialize   (DDEML.2)
152  */
153 UINT16 WINAPI DdeInitialize16(LPDWORD pidInst, PFNCALLBACK16 pfnCallback,
154                               DWORD afCmd, DWORD ulRes)
155 {
156     return WDML_Initialize(pidInst, (PFNCALLBACK)pfnCallback, afCmd, ulRes,
157                            FALSE, TRUE);
158 }
159
160 /*****************************************************************
161  *            DdeUninitialize   (DDEML.3)
162  */
163 BOOL16 WINAPI DdeUninitialize16(DWORD idInst)
164 {
165     return (BOOL16)DdeUninitialize(idInst);
166 }
167
168 /*****************************************************************
169  * DdeConnectList [DDEML.4]
170  */
171
172 HCONVLIST WINAPI DdeConnectList16(DWORD idInst, HSZ hszService, HSZ hszTopic,
173                                   HCONVLIST hConvList, LPCONVCONTEXT16 pCC16)
174 {
175     CONVCONTEXT         cc;
176     CONVCONTEXT*        pCC = NULL;
177
178     if (pCC16)
179         map1632_conv_context(pCC = &cc, pCC16);
180     return DdeConnectList(idInst, hszService, hszTopic, hConvList, pCC);
181 }
182
183 /*****************************************************************
184  * DdeQueryNextServer [DDEML.5]
185  */
186 HCONV WINAPI DdeQueryNextServer16(HCONVLIST hConvList, HCONV hConvPrev)
187 {
188     return DdeQueryNextServer(hConvList, hConvPrev);
189 }
190
191 /*****************************************************************
192  *            DdeDisconnectList (DDEML.6)
193  */
194 BOOL16 WINAPI DdeDisconnectList16(HCONVLIST hConvList)
195 {
196     return (BOOL16)DdeDisconnectList(hConvList);
197 }
198
199
200 /*****************************************************************
201  *              DdeQueryString (DDEML.23)
202  */
203 DWORD WINAPI DdeQueryString16(DWORD idInst, HSZ hsz, LPSTR lpsz, DWORD cchMax,
204                               INT16 codepage)
205 {
206     return DdeQueryStringA(idInst, hsz, lpsz, cchMax, codepage);
207 }
208
209 /*****************************************************************
210  *            DdeConnect   (DDEML.7)
211  */
212 HCONV WINAPI DdeConnect16(DWORD idInst, HSZ hszService, HSZ hszTopic,
213                           LPCONVCONTEXT16 pCC16)
214 {
215     CONVCONTEXT         cc;
216     CONVCONTEXT*        pCC = NULL;
217
218     if (pCC16)
219         map1632_conv_context(pCC = &cc, pCC16);
220     return DdeConnect(idInst, hszService, hszTopic, pCC);
221 }
222
223 /*****************************************************************
224  *            DdeDisconnect   (DDEML.8)
225  */
226 BOOL16 WINAPI DdeDisconnect16(HCONV hConv)
227 {
228     return (BOOL16)DdeDisconnect(hConv);
229 }
230
231 /*****************************************************************
232  *            DdeSetUserHandle (DDEML.10)
233  */
234 BOOL16 WINAPI DdeSetUserHandle16(HCONV hConv, DWORD id, DWORD hUser)
235 {
236     return DdeSetUserHandle(hConv, id, hUser);
237 }
238
239 /*****************************************************************
240  *            DdeCreateDataHandle (DDEML.14)
241  */
242 HDDEDATA WINAPI DdeCreateDataHandle16(DWORD idInst, LPBYTE pSrc, DWORD cb,
243                                       DWORD cbOff, HSZ hszItem, UINT16 wFmt,
244                                       UINT16 afCmd)
245 {
246     return DdeCreateDataHandle(idInst, pSrc, cb, cbOff, hszItem, wFmt, afCmd);
247 }
248
249 /*****************************************************************
250  *            DdeCreateStringHandle   (DDEML.21)
251  */
252 HSZ WINAPI DdeCreateStringHandle16(DWORD idInst, LPCSTR str, INT16 codepage)
253 {
254     if  (codepage)
255     {
256         return DdeCreateStringHandleA(idInst, str, codepage);
257     }
258     else
259     {
260         TRACE("Default codepage supplied\n");
261         return DdeCreateStringHandleA(idInst, str, CP_WINANSI);
262     }
263 }
264
265 /*****************************************************************
266  *            DdeFreeStringHandle   (DDEML.22)
267  */
268 BOOL16 WINAPI DdeFreeStringHandle16(DWORD idInst, HSZ hsz)
269 {
270     return (BOOL16)DdeFreeStringHandle(idInst, hsz);
271 }
272
273 /*****************************************************************
274  *            DdeFreeDataHandle   (DDEML.19)
275  */
276 BOOL16 WINAPI DdeFreeDataHandle16(HDDEDATA hData)
277 {
278     return (BOOL16)DdeFreeDataHandle(hData);
279 }
280
281 /*****************************************************************
282  *            DdeKeepStringHandle   (DDEML.24)
283  */
284 BOOL16 WINAPI DdeKeepStringHandle16(DWORD idInst, HSZ hsz)
285 {
286     return (BOOL)DdeKeepStringHandle(idInst, hsz);
287 }
288
289 /*****************************************************************
290  *            DdeClientTransaction  (DDEML.11)
291  */
292 HDDEDATA WINAPI DdeClientTransaction16(LPVOID pData, DWORD cbData, HCONV hConv,
293                                        HSZ hszItem, UINT16 wFmt, UINT16 wType,
294                                        DWORD dwTimeout, LPDWORD pdwResult)
295 {
296     return DdeClientTransaction((LPBYTE)pData, cbData, hConv, hszItem,
297                                 wFmt, wType, dwTimeout, pdwResult);
298 }
299
300 /*****************************************************************
301  *
302  *            DdeAbandonTransaction (DDEML.12)
303  *
304  */
305 BOOL16 WINAPI DdeAbandonTransaction16(DWORD idInst, HCONV hConv, DWORD idTransaction)
306 {
307     return (BOOL16)DdeAbandonTransaction(idInst, hConv, idTransaction);
308 }
309
310 /*****************************************************************
311  * DdePostAdvise [DDEML.13]
312  */
313 BOOL16 WINAPI DdePostAdvise16(DWORD idInst, HSZ hszTopic, HSZ hszItem)
314 {
315     return (BOOL16)DdePostAdvise(idInst, hszTopic, hszItem);
316 }
317
318 /*****************************************************************
319  *            DdeAddData (DDEML.15)
320  */
321 HDDEDATA WINAPI DdeAddData16(HDDEDATA hData, LPBYTE pSrc, DWORD cb, DWORD cbOff)
322 {
323     return DdeAddData(hData, pSrc, cb, cbOff);
324 }
325
326 /*****************************************************************
327  * DdeGetData [DDEML.16]
328  */
329 DWORD WINAPI DdeGetData16(HDDEDATA hData, LPBYTE pDst, DWORD cbMax, DWORD cbOff)
330 {
331     return DdeGetData(hData, pDst, cbMax, cbOff);
332 }
333
334 /*****************************************************************
335  *            DdeAccessData (DDEML.17)
336  */
337 LPBYTE WINAPI DdeAccessData16(HDDEDATA hData, LPDWORD pcbDataSize)
338 {
339     FIXME("expect trouble\n");
340     /* FIXME: there's a memory leak here... */
341     return (LPBYTE)MapLS(DdeAccessData(hData, pcbDataSize));
342 }
343
344 /*****************************************************************
345  *            DdeUnaccessData (DDEML.18)
346  */
347 BOOL16 WINAPI DdeUnaccessData16(HDDEDATA hData)
348 {
349     return DdeUnaccessData(hData);
350 }
351
352 /*****************************************************************
353  *            DdeEnableCallback (DDEML.26)
354  */
355 BOOL16 WINAPI DdeEnableCallback16(DWORD idInst, HCONV hConv, UINT16 wCmd)
356 {
357     return DdeEnableCallback(idInst, hConv, wCmd);
358 }
359
360 /*****************************************************************
361  *            DdeNameService  (DDEML.27)
362  */
363 HDDEDATA WINAPI DdeNameService16(DWORD idInst, HSZ hsz1, HSZ hsz2, UINT16 afCmd)
364 {
365     return DdeNameService(idInst, hsz1, hsz2, afCmd);
366 }
367
368 /*****************************************************************
369  *            DdeGetLastError  (DDEML.20)
370  */
371 UINT16 WINAPI DdeGetLastError16(DWORD idInst)
372 {
373     return (UINT16)DdeGetLastError(idInst);
374 }
375
376 /*****************************************************************
377  *            DdeCmpStringHandles (DDEML.36)
378  */
379 INT16 WINAPI DdeCmpStringHandles16(HSZ hsz1, HSZ hsz2)
380 {
381     return DdeCmpStringHandles(hsz1, hsz2);
382 }
383
384 /******************************************************************
385  *              DdeQueryConvInfo (DDEML.9)
386  *
387  */
388 UINT16 WINAPI DdeQueryConvInfo16(HCONV hConv, DWORD idTransaction,
389                                  LPCONVINFO16 lpConvInfo)
390 {
391     CONVINFO    ci32;
392     CONVINFO16  ci16;
393     UINT        ret;
394
395     ci32.cb = sizeof(ci32);
396     ci32.ConvCtxt.cb = sizeof(ci32.ConvCtxt);
397
398     ret = DdeQueryConvInfo(hConv, idTransaction, &ci32);
399     if (ret == 0) return 0;
400
401     ci16.hUser = ci32.hUser;
402     ci16.hConvPartner = ci32.hConvPartner;
403     ci16.hszSvcPartner = ci32.hszSvcPartner;
404     ci16.hszServiceReq = ci32.hszServiceReq;
405     ci16.hszTopic = ci32.hszTopic;
406     ci16.hszItem = ci32.hszItem;
407     ci16.wFmt = ci32.wFmt;
408     ci16.wType = ci32.wType;
409     ci16.wStatus = ci32.wStatus;
410     ci16.wConvst = ci32.wConvst;
411     ci16.wLastError = ci32.wLastError;
412     ci16.hConvList = ci32.hConvList;
413
414     map3216_conv_context(&ci16.ConvCtxt, &ci32.ConvCtxt);
415
416     memcpy(lpConvInfo, &ci16, lpConvInfo->cb);
417     return lpConvInfo->cb;
418 }