4 * Copyright 1997 Alexandre Julliard
5 * Copyright 1997 Len White
6 * Copyright 1999 Keith Matthews
8 * Copyright 2001,2002 Eric Pouech
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.
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.
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
28 #include "wine/windef16.h"
35 #include "dde/dde_private.h"
36 #include "wine/debug.h"
38 WINE_DEFAULT_DEBUG_CHANNEL(ddeml);
41 typedef HDDEDATA (CALLBACK *PFNCALLBACK16)(UINT16,UINT16,HCONV,HSZ,HSZ,HDDEDATA,
52 } CONVCONTEXT16, *LPCONVCONTEXT16;
69 CONVCONTEXT16 ConvCtxt;
70 } CONVINFO16, *LPCONVINFO16;
72 static void map1632_conv_context(CONVCONTEXT* cc32, const CONVCONTEXT16* cc16)
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;
82 static void map3216_conv_context(CONVCONTEXT16* cc16, const CONVCONTEXT* cc32)
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;
93 /******************************************************************
94 * WDML_InvokeCallback16
98 HDDEDATA WDML_InvokeCallback16(PFNCALLBACK pfn, UINT uType, UINT uFmt,
99 HCONV hConv, HSZ hsz1, HSZ hsz2,
100 HDDEDATA hdata, DWORD dwData1, DWORD dwData2)
110 case XTYP_WILDCONNECT:
113 map3216_conv_context(&cc16, (const CONVCONTEXT*)dwData1);
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 );
143 case XTYP_WILDCONNECT:
144 if (d1 != 0) UnMapLS(d1);
150 /******************************************************************************
151 * DdeInitialize (DDEML.2)
153 UINT16 WINAPI DdeInitialize16(LPDWORD pidInst, PFNCALLBACK16 pfnCallback,
154 DWORD afCmd, DWORD ulRes)
156 return WDML_Initialize(pidInst, (PFNCALLBACK)pfnCallback, afCmd, ulRes,
160 /*****************************************************************
161 * DdeUninitialize (DDEML.3)
163 BOOL16 WINAPI DdeUninitialize16(DWORD idInst)
165 return (BOOL16)DdeUninitialize(idInst);
168 /*****************************************************************
169 * DdeConnectList [DDEML.4]
172 HCONVLIST WINAPI DdeConnectList16(DWORD idInst, HSZ hszService, HSZ hszTopic,
173 HCONVLIST hConvList, LPCONVCONTEXT16 pCC16)
176 CONVCONTEXT* pCC = NULL;
179 map1632_conv_context(pCC = &cc, pCC16);
180 return DdeConnectList(idInst, hszService, hszTopic, hConvList, pCC);
183 /*****************************************************************
184 * DdeQueryNextServer [DDEML.5]
186 HCONV WINAPI DdeQueryNextServer16(HCONVLIST hConvList, HCONV hConvPrev)
188 return DdeQueryNextServer(hConvList, hConvPrev);
191 /*****************************************************************
192 * DdeDisconnectList (DDEML.6)
194 BOOL16 WINAPI DdeDisconnectList16(HCONVLIST hConvList)
196 return (BOOL16)DdeDisconnectList(hConvList);
200 /*****************************************************************
201 * DdeQueryString (DDEML.23)
203 DWORD WINAPI DdeQueryString16(DWORD idInst, HSZ hsz, LPSTR lpsz, DWORD cchMax,
206 return DdeQueryStringA(idInst, hsz, lpsz, cchMax, codepage);
209 /*****************************************************************
210 * DdeConnect (DDEML.7)
212 HCONV WINAPI DdeConnect16(DWORD idInst, HSZ hszService, HSZ hszTopic,
213 LPCONVCONTEXT16 pCC16)
216 CONVCONTEXT* pCC = NULL;
219 map1632_conv_context(pCC = &cc, pCC16);
220 return DdeConnect(idInst, hszService, hszTopic, pCC);
223 /*****************************************************************
224 * DdeDisconnect (DDEML.8)
226 BOOL16 WINAPI DdeDisconnect16(HCONV hConv)
228 return (BOOL16)DdeDisconnect(hConv);
231 /*****************************************************************
232 * DdeSetUserHandle (DDEML.10)
234 BOOL16 WINAPI DdeSetUserHandle16(HCONV hConv, DWORD id, DWORD hUser)
236 return DdeSetUserHandle(hConv, id, hUser);
239 /*****************************************************************
240 * DdeCreateDataHandle (DDEML.14)
242 HDDEDATA WINAPI DdeCreateDataHandle16(DWORD idInst, LPBYTE pSrc, DWORD cb,
243 DWORD cbOff, HSZ hszItem, UINT16 wFmt,
246 return DdeCreateDataHandle(idInst, pSrc, cb, cbOff, hszItem, wFmt, afCmd);
249 /*****************************************************************
250 * DdeCreateStringHandle (DDEML.21)
252 HSZ WINAPI DdeCreateStringHandle16(DWORD idInst, LPCSTR str, INT16 codepage)
256 return DdeCreateStringHandleA(idInst, str, codepage);
260 TRACE("Default codepage supplied\n");
261 return DdeCreateStringHandleA(idInst, str, CP_WINANSI);
265 /*****************************************************************
266 * DdeFreeStringHandle (DDEML.22)
268 BOOL16 WINAPI DdeFreeStringHandle16(DWORD idInst, HSZ hsz)
270 return (BOOL16)DdeFreeStringHandle(idInst, hsz);
273 /*****************************************************************
274 * DdeFreeDataHandle (DDEML.19)
276 BOOL16 WINAPI DdeFreeDataHandle16(HDDEDATA hData)
278 return (BOOL16)DdeFreeDataHandle(hData);
281 /*****************************************************************
282 * DdeKeepStringHandle (DDEML.24)
284 BOOL16 WINAPI DdeKeepStringHandle16(DWORD idInst, HSZ hsz)
286 return (BOOL)DdeKeepStringHandle(idInst, hsz);
289 /*****************************************************************
290 * DdeClientTransaction (DDEML.11)
292 HDDEDATA WINAPI DdeClientTransaction16(LPVOID pData, DWORD cbData, HCONV hConv,
293 HSZ hszItem, UINT16 wFmt, UINT16 wType,
294 DWORD dwTimeout, LPDWORD pdwResult)
296 return DdeClientTransaction((LPBYTE)pData, cbData, hConv, hszItem,
297 wFmt, wType, dwTimeout, pdwResult);
300 /*****************************************************************
302 * DdeAbandonTransaction (DDEML.12)
305 BOOL16 WINAPI DdeAbandonTransaction16(DWORD idInst, HCONV hConv, DWORD idTransaction)
307 return (BOOL16)DdeAbandonTransaction(idInst, hConv, idTransaction);
310 /*****************************************************************
311 * DdePostAdvise [DDEML.13]
313 BOOL16 WINAPI DdePostAdvise16(DWORD idInst, HSZ hszTopic, HSZ hszItem)
315 return (BOOL16)DdePostAdvise(idInst, hszTopic, hszItem);
318 /*****************************************************************
319 * DdeAddData (DDEML.15)
321 HDDEDATA WINAPI DdeAddData16(HDDEDATA hData, LPBYTE pSrc, DWORD cb, DWORD cbOff)
323 return DdeAddData(hData, pSrc, cb, cbOff);
326 /*****************************************************************
327 * DdeGetData [DDEML.16]
329 DWORD WINAPI DdeGetData16(HDDEDATA hData, LPBYTE pDst, DWORD cbMax, DWORD cbOff)
331 return DdeGetData(hData, pDst, cbMax, cbOff);
334 /*****************************************************************
335 * DdeAccessData (DDEML.17)
337 LPBYTE WINAPI DdeAccessData16(HDDEDATA hData, LPDWORD pcbDataSize)
339 FIXME("expect trouble\n");
340 /* FIXME: there's a memory leak here... */
341 return (LPBYTE)MapLS(DdeAccessData(hData, pcbDataSize));
344 /*****************************************************************
345 * DdeUnaccessData (DDEML.18)
347 BOOL16 WINAPI DdeUnaccessData16(HDDEDATA hData)
349 return DdeUnaccessData(hData);
352 /*****************************************************************
353 * DdeEnableCallback (DDEML.26)
355 BOOL16 WINAPI DdeEnableCallback16(DWORD idInst, HCONV hConv, UINT16 wCmd)
357 return DdeEnableCallback(idInst, hConv, wCmd);
360 /*****************************************************************
361 * DdeNameService (DDEML.27)
363 HDDEDATA WINAPI DdeNameService16(DWORD idInst, HSZ hsz1, HSZ hsz2, UINT16 afCmd)
365 return DdeNameService(idInst, hsz1, hsz2, afCmd);
368 /*****************************************************************
369 * DdeGetLastError (DDEML.20)
371 UINT16 WINAPI DdeGetLastError16(DWORD idInst)
373 return (UINT16)DdeGetLastError(idInst);
376 /*****************************************************************
377 * DdeCmpStringHandles (DDEML.36)
379 INT16 WINAPI DdeCmpStringHandles16(HSZ hsz1, HSZ hsz2)
381 return DdeCmpStringHandles(hsz1, hsz2);
384 /******************************************************************
385 * DdeQueryConvInfo (DDEML.9)
388 UINT16 WINAPI DdeQueryConvInfo16(HCONV hConv, DWORD idTransaction,
389 LPCONVINFO16 lpConvInfo)
395 ci32.cb = sizeof(ci32);
396 ci32.ConvCtxt.cb = sizeof(ci32.ConvCtxt);
398 ret = DdeQueryConvInfo(hConv, idTransaction, &ci32);
399 if (ret == 0) return 0;
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;
414 map3216_conv_context(&ci16.ConvCtxt, &ci32.ConvCtxt);
416 memcpy(lpConvInfo, &ci16, lpConvInfo->cb);
417 return lpConvInfo->cb;