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