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
29 #include "wine/windef16.h"
36 #include "dde/dde_private.h"
37 #include "wine/debug.h"
39 WINE_DEFAULT_DEBUG_CHANNEL(ddeml);
42 typedef HDDEDATA (CALLBACK *PFNCALLBACK16)(UINT16,UINT16,HCONV,HSZ,HSZ,HDDEDATA,
53 } CONVCONTEXT16, *LPCONVCONTEXT16;
70 CONVCONTEXT16 ConvCtxt;
71 } CONVINFO16, *LPCONVINFO16;
73 static void map1632_conv_context(CONVCONTEXT* cc32, const CONVCONTEXT16* cc16)
75 cc32->cb = sizeof(*cc32);
76 cc32->wFlags = cc16->wFlags;
77 cc32->wCountryID = cc16->wCountryID;
78 cc32->iCodePage = cc16->iCodePage;
79 cc32->dwLangID = cc16->dwLangID;
80 cc32->dwSecurity = cc16->dwSecurity;
83 static void map3216_conv_context(CONVCONTEXT16* cc16, const CONVCONTEXT* cc32)
85 cc16->cb = sizeof(*cc16);
86 cc16->wFlags = cc32->wFlags;
87 cc16->wCountryID = cc32->wCountryID;
88 cc16->iCodePage = cc32->iCodePage;
89 cc16->dwLangID = cc32->dwLangID;
90 cc16->dwSecurity = cc32->dwSecurity;
94 /******************************************************************
95 * WDML_InvokeCallback16
99 HDDEDATA WDML_InvokeCallback16(PFNCALLBACK pfn, UINT uType, UINT uFmt,
100 HCONV hConv, HSZ hsz1, HSZ hsz2,
101 HDDEDATA hdata, DWORD dwData1, DWORD dwData2)
111 case XTYP_WILDCONNECT:
114 map3216_conv_context(&cc16, (const CONVCONTEXT*)dwData1);
123 args[15] = HIWORD(uType);
124 args[14] = LOWORD(uType);
125 args[13] = HIWORD(uFmt);
126 args[12] = LOWORD(uFmt);
127 args[11] = HIWORD(hConv);
128 args[10] = LOWORD(hConv);
129 args[9] = HIWORD(hsz1);
130 args[8] = LOWORD(hsz1);
131 args[7] = HIWORD(hsz2);
132 args[6] = LOWORD(hsz2);
133 args[5] = HIWORD(hdata);
134 args[4] = LOWORD(hdata);
135 args[3] = HIWORD(d1);
136 args[2] = LOWORD(d1);
137 args[1] = HIWORD(dwData2);
138 args[0] = LOWORD(dwData2);
139 WOWCallback16Ex( (DWORD)pfn, WCB16_PASCAL, sizeof(args), args, (DWORD *)&ret );
144 case XTYP_WILDCONNECT:
145 if (d1 != 0) UnMapLS(d1);
151 /******************************************************************************
152 * DdeInitialize (DDEML.2)
154 UINT16 WINAPI DdeInitialize16(LPDWORD pidInst, PFNCALLBACK16 pfnCallback,
155 DWORD afCmd, DWORD ulRes)
157 return WDML_Initialize(pidInst, (PFNCALLBACK)pfnCallback, afCmd, ulRes,
161 /*****************************************************************
162 * DdeUninitialize (DDEML.3)
164 BOOL16 WINAPI DdeUninitialize16(DWORD idInst)
166 return (BOOL16)DdeUninitialize(idInst);
169 /*****************************************************************
170 * DdeConnectList [DDEML.4]
173 HCONVLIST WINAPI DdeConnectList16(DWORD idInst, HSZ hszService, HSZ hszTopic,
174 HCONVLIST hConvList, LPCONVCONTEXT16 pCC16)
177 CONVCONTEXT* pCC = NULL;
180 map1632_conv_context(pCC = &cc, pCC16);
181 return DdeConnectList(idInst, hszService, hszTopic, hConvList, pCC);
184 /*****************************************************************
185 * DdeQueryNextServer [DDEML.5]
187 HCONV WINAPI DdeQueryNextServer16(HCONVLIST hConvList, HCONV hConvPrev)
189 return DdeQueryNextServer(hConvList, hConvPrev);
192 /*****************************************************************
193 * DdeDisconnectList (DDEML.6)
195 BOOL16 WINAPI DdeDisconnectList16(HCONVLIST hConvList)
197 return (BOOL16)DdeDisconnectList(hConvList);
201 /*****************************************************************
202 * DdeQueryString (DDEML.23)
204 DWORD WINAPI DdeQueryString16(DWORD idInst, HSZ hsz, LPSTR lpsz, DWORD cchMax,
207 return DdeQueryStringA(idInst, hsz, lpsz, cchMax, codepage);
210 /*****************************************************************
211 * DdeConnect (DDEML.7)
213 HCONV WINAPI DdeConnect16(DWORD idInst, HSZ hszService, HSZ hszTopic,
214 LPCONVCONTEXT16 pCC16)
217 CONVCONTEXT* pCC = NULL;
220 map1632_conv_context(pCC = &cc, pCC16);
221 return DdeConnect(idInst, hszService, hszTopic, pCC);
224 /*****************************************************************
225 * DdeDisconnect (DDEML.8)
227 BOOL16 WINAPI DdeDisconnect16(HCONV hConv)
229 return (BOOL16)DdeDisconnect(hConv);
232 /*****************************************************************
233 * DdeSetUserHandle (DDEML.10)
235 BOOL16 WINAPI DdeSetUserHandle16(HCONV hConv, DWORD id, DWORD hUser)
237 return DdeSetUserHandle(hConv, id, hUser);
240 /*****************************************************************
241 * DdeCreateDataHandle (DDEML.14)
243 HDDEDATA WINAPI DdeCreateDataHandle16(DWORD idInst, LPBYTE pSrc, DWORD cb,
244 DWORD cbOff, HSZ hszItem, UINT16 wFmt,
247 return DdeCreateDataHandle(idInst, pSrc, cb, cbOff, hszItem, wFmt, afCmd);
250 /*****************************************************************
251 * DdeCreateStringHandle (DDEML.21)
253 HSZ WINAPI DdeCreateStringHandle16(DWORD idInst, LPCSTR str, INT16 codepage)
257 return DdeCreateStringHandleA(idInst, str, codepage);
261 TRACE("Default codepage supplied\n");
262 return DdeCreateStringHandleA(idInst, str, CP_WINANSI);
266 /*****************************************************************
267 * DdeFreeStringHandle (DDEML.22)
269 BOOL16 WINAPI DdeFreeStringHandle16(DWORD idInst, HSZ hsz)
271 return (BOOL16)DdeFreeStringHandle(idInst, hsz);
274 /*****************************************************************
275 * DdeFreeDataHandle (DDEML.19)
277 BOOL16 WINAPI DdeFreeDataHandle16(HDDEDATA hData)
279 return (BOOL16)DdeFreeDataHandle(hData);
282 /*****************************************************************
283 * DdeKeepStringHandle (DDEML.24)
285 BOOL16 WINAPI DdeKeepStringHandle16(DWORD idInst, HSZ hsz)
287 return (BOOL)DdeKeepStringHandle(idInst, hsz);
290 /*****************************************************************
291 * DdeClientTransaction (DDEML.11)
293 HDDEDATA WINAPI DdeClientTransaction16(LPVOID pData, DWORD cbData, HCONV hConv,
294 HSZ hszItem, UINT16 wFmt, UINT16 wType,
295 DWORD dwTimeout, LPDWORD pdwResult)
297 return DdeClientTransaction((LPBYTE)pData, cbData, hConv, hszItem,
298 wFmt, wType, dwTimeout, pdwResult);
301 /*****************************************************************
303 * DdeAbandonTransaction (DDEML.12)
306 BOOL16 WINAPI DdeAbandonTransaction16(DWORD idInst, HCONV hConv, DWORD idTransaction)
308 return (BOOL16)DdeAbandonTransaction(idInst, hConv, idTransaction);
311 /*****************************************************************
312 * DdePostAdvise [DDEML.13]
314 BOOL16 WINAPI DdePostAdvise16(DWORD idInst, HSZ hszTopic, HSZ hszItem)
316 return (BOOL16)DdePostAdvise(idInst, hszTopic, hszItem);
319 /*****************************************************************
320 * DdeAddData (DDEML.15)
322 HDDEDATA WINAPI DdeAddData16(HDDEDATA hData, LPBYTE pSrc, DWORD cb, DWORD cbOff)
324 return DdeAddData(hData, pSrc, cb, cbOff);
327 /*****************************************************************
328 * DdeGetData [DDEML.16]
330 DWORD WINAPI DdeGetData16(HDDEDATA hData, LPBYTE pDst, DWORD cbMax, DWORD cbOff)
332 return DdeGetData(hData, pDst, cbMax, cbOff);
335 /*****************************************************************
336 * DdeAccessData (DDEML.17)
338 LPBYTE WINAPI DdeAccessData16(HDDEDATA hData, LPDWORD pcbDataSize)
340 FIXME("expect trouble\n");
341 /* FIXME: there's a memory leak here... */
342 return (LPBYTE)MapLS(DdeAccessData(hData, pcbDataSize));
345 /*****************************************************************
346 * DdeUnaccessData (DDEML.18)
348 BOOL16 WINAPI DdeUnaccessData16(HDDEDATA hData)
350 return DdeUnaccessData(hData);
353 /*****************************************************************
354 * DdeEnableCallback (DDEML.26)
356 BOOL16 WINAPI DdeEnableCallback16(DWORD idInst, HCONV hConv, UINT16 wCmd)
358 return DdeEnableCallback(idInst, hConv, wCmd);
361 /*****************************************************************
362 * DdeNameService (DDEML.27)
364 HDDEDATA WINAPI DdeNameService16(DWORD idInst, HSZ hsz1, HSZ hsz2, UINT16 afCmd)
366 return DdeNameService(idInst, hsz1, hsz2, afCmd);
369 /*****************************************************************
370 * DdeGetLastError (DDEML.20)
372 UINT16 WINAPI DdeGetLastError16(DWORD idInst)
374 return (UINT16)DdeGetLastError(idInst);
377 /*****************************************************************
378 * DdeCmpStringHandles (DDEML.36)
380 INT16 WINAPI DdeCmpStringHandles16(HSZ hsz1, HSZ hsz2)
382 return DdeCmpStringHandles(hsz1, hsz2);
385 /******************************************************************
386 * DdeQueryConvInfo (DDEML.9)
389 UINT16 WINAPI DdeQueryConvInfo16(HCONV hConv, DWORD idTransaction,
390 LPCONVINFO16 lpConvInfo)
396 ci32.cb = sizeof(ci32);
397 ci32.ConvCtxt.cb = sizeof(ci32.ConvCtxt);
399 ret = DdeQueryConvInfo(hConv, idTransaction, &ci32);
400 if (ret == 0) return 0;
402 ci16.hUser = ci32.hUser;
403 ci16.hConvPartner = ci32.hConvPartner;
404 ci16.hszSvcPartner = ci32.hszSvcPartner;
405 ci16.hszServiceReq = ci32.hszServiceReq;
406 ci16.hszTopic = ci32.hszTopic;
407 ci16.hszItem = ci32.hszItem;
408 ci16.wFmt = ci32.wFmt;
409 ci16.wType = ci32.wType;
410 ci16.wStatus = ci32.wStatus;
411 ci16.wConvst = ci32.wConvst;
412 ci16.wLastError = ci32.wLastError;
413 ci16.hConvList = ci32.hConvList;
415 map3216_conv_context(&ci16.ConvCtxt, &ci32.ConvCtxt);
417 memcpy(lpConvInfo, &ci16, lpConvInfo->cb);
418 return lpConvInfo->cb;