this patch mostly finishes the first big round of the DDE(ML) implementation it fixes 1/ most the 16 bit API in DDEML 2/ implements 16/32 bit message translation there are still lots of memory leaks in current DDE implementation and this patch adds a few more :-( I don't know (with current Wine API implementation) better way to implement it... so, except crashes when using too much DDE A+
Name: msg_dde1632 ChangeLog: added 16/32 DDE message conversion finished the 16 bit implementation of DDEML License: X11 GenDate: 2002/05/20 19:10:31 UTC ModifiedFiles: windows/winproc.c dlls/user/dde/ddeml16.c AddedFiles: =================================================================== RCS file: /home/cvs/cvsroot/wine/wine/windows/winproc.c,v retrieving revision 1.85 diff -u -u -r1.85 winproc.c --- windows/winproc.c 7 May 2002 18:31:10 -0000 1.85 +++ windows/winproc.c 19 May 2002 07:14:35 -0000 @@ -40,6 +40,7 @@ #include "spy.h" #include "task.h" #include "thread.h" +#include "dde.h" WINE_DECLARE_DEBUG_CHANNEL(msg); WINE_DECLARE_DEBUG_CHANNEL(relay); @@ -1078,6 +1079,22 @@ } } +static HANDLE convert_handle_16_to_32(HANDLE16 src, unsigned int flags) +{ + HANDLE dst; + UINT sz = GlobalSize16(src); + LPSTR ptr16, ptr32; + + if (!(dst = GlobalAlloc(flags, sz))) + return 0; + ptr16 = GlobalLock16(src); + ptr32 = GlobalLock(dst); + if (ptr16 != NULL && ptr32 != NULL) memcpy(ptr32, ptr16, sz); + GlobalUnlock16(src); + GlobalUnlock(dst); + + return dst; +} /********************************************************************** * WINPROC_MapMsg16To32A @@ -1343,7 +1360,65 @@ case WM_SIZECLIPBOARD: FIXME_(msg)("message %04x needs translation\n",msg16 ); return -1; - + case WM_DDE_INITIATE: + case WM_DDE_TERMINATE: + case WM_DDE_UNADVISE: + case WM_DDE_REQUEST: + *pwparam32 = WIN_Handle32(wParam16); + return 0; + case WM_DDE_ADVISE: + case WM_DDE_DATA: + case WM_DDE_POKE: + { + HANDLE16 lo16; + ATOM hi; + HANDLE lo32 = 0; + + *pwparam32 = WIN_Handle32(wParam16); + lo16 = LOWORD(*plparam); + hi = HIWORD(*plparam); + if (lo16 && !(lo32 = convert_handle_16_to_32(lo16, GMEM_DDESHARE))) + return -1; + *plparam = PackDDElParam(msg16, lo32, hi); + } + return 0; /* FIXME don't know how to free allocated memory (handle) !! */ + case WM_DDE_ACK: + { + UINT lo, hi; + int flag = 0; + char buf[2]; + + *pwparam32 = WIN_Handle32(wParam16); + + lo = LOWORD(*plparam); + hi = HIWORD(*plparam); + + if (GlobalGetAtomNameA(hi, buf, 2) > 0) flag |= 1; + if (GlobalSize16(hi) != 0) flag |= 2; + switch (flag) + { + case 0: + if (hi) + { + MESSAGE("DDE_ACK: neither atom nor handle!!!\n"); + hi = 0; + } + break; + case 1: + break; /* atom, nothing to do */ + case 3: + MESSAGE("DDE_ACK: %x both atom and handle... choosing handle\n", hi); + /* fall thru */ + case 2: + hi = convert_handle_16_to_32(hi, GMEM_DDESHARE); + break; + } + *plparam = PackDDElParam(WM_DDE_ACK, lo, hi); + } + return 0; /* FIXME don't know how to free allocated memory (handle) !! */ + case WM_DDE_EXECUTE: + *plparam = convert_handle_16_to_32(*plparam, GMEM_DDESHARE); + return 0; /* FIXME don't know how to free allocated memory (handle) !! */ default: /* No translation needed */ return 0; } @@ -1616,6 +1691,23 @@ return result; } +static HANDLE16 convert_handle_32_to_16(HANDLE src, unsigned int flags) +{ + HANDLE16 dst; + UINT sz = GlobalSize(src); + LPSTR ptr16, ptr32; + + if (!(dst = GlobalAlloc16(flags, sz))) + return 0; + ptr32 = GlobalLock(src); + ptr16 = GlobalLock16(dst); + if (ptr16 != NULL && ptr32 != NULL) memcpy(ptr16, ptr32, sz); + GlobalUnlock(src); + GlobalUnlock16(dst); + + return dst; +} + /********************************************************************** * WINPROC_MapMsg32ATo16 @@ -2052,6 +2144,62 @@ case WM_STYLECHANGING: case WM_STYLECHANGED: return -1; + case WM_DDE_INITIATE: + case WM_DDE_TERMINATE: + case WM_DDE_UNADVISE: + case WM_DDE_REQUEST: + *pwparam16 = WIN_Handle16(wParam32); + return 0; + case WM_DDE_ADVISE: + case WM_DDE_DATA: + case WM_DDE_POKE: + { + unsigned lo32, hi; + HANDLE16 lo16 = 0; + + *pwparam16 = WIN_Handle16(wParam32); + UnpackDDElParam(msg32, *plparam, &lo32, &hi); + if (lo32 && !(lo16 = convert_handle_32_to_16(lo32, GMEM_DDESHARE))) + return -1; + *plparam = MAKELPARAM(lo16, hi); + } + return 0; /* FIXME don't know how to free allocated memory (handle) !! */ + case WM_DDE_ACK: + { + UINT lo, hi; + int flag = 0; + char buf[2]; + + *pwparam16 = WIN_Handle16(wParam32); + + UnpackDDElParam(msg32, *plparam, &lo, &hi); + + if (GlobalGetAtomNameA((ATOM)hi, buf, sizeof(buf)) > 0) flag |= 1; + if (GlobalSize(hi) != 0) flag |= 2; + switch (flag) + { + case 0: + if (hi) + { + MESSAGE("DDE_ACK: neither atom nor handle!!!\n"); + hi = 0; + } + break; + case 1: + break; /* atom, nothing to do */ + case 3: + MESSAGE("DDE_ACK: %x both atom and handle... choosing handle\n", hi); + /* fall thru */ + case 2: + hi = convert_handle_32_to_16(hi, GMEM_DDESHARE); + break; + } + *plparam = MAKELPARAM(lo, hi); + } + return 0; /* FIXME don't know how to free allocated memory (handle) !! */ + case WM_DDE_EXECUTE: + *plparam = convert_handle_32_to_16(*plparam, GMEM_DDESHARE); + return 0; /* FIXME don't know how to free allocated memory (handle) !! */ default: /* No translation needed */ return 0; } Index: dlls/user/dde/ddeml16.c =================================================================== RCS file: /home/cvs/cvsroot/wine/wine/dlls/user/dde/ddeml16.c,v retrieving revision 1.5 diff -u -u -r1.5 ddeml16.c --- dlls/user/dde/ddeml16.c 9 Mar 2002 23:44:31 -0000 1.5 +++ dlls/user/dde/ddeml16.c 19 May 2002 07:34:17 -0000 @@ -1,5 +1,3 @@ -/* -*- tab-width: 8; c-basic-offset: 8 -*- */ - /* * DDEML library * @@ -7,7 +5,7 @@ * Copyright 1997 Len White * Copyright 1999 Keith Matthews * Copyright 2000 Corel - * Copyright 2001 Eric Pouech + * Copyright 2001,2002 Eric Pouech * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -39,7 +37,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(ddeml); -typedef HDDEDATA (CALLBACK *PFNCALLBACK16)(UINT16,UINT16,HCONV,HSZ,HSZ,HDDEDATA,DWORD,DWORD); +typedef HDDEDATA (CALLBACK *PFNCALLBACK16)(UINT16,UINT16,HCONV,HSZ,HSZ,HDDEDATA, + DWORD,DWORD); typedef struct { @@ -69,8 +68,28 @@ CONVCONTEXT16 ConvCtxt; } CONVINFO16, *LPCONVINFO16; +static void map1632_conv_context(CONVCONTEXT* cc32, const CONVCONTEXT16* cc16) +{ + cc32->cb = sizeof(*cc32); + cc32->wFlags = cc16->wFlags; + cc32->wCountryID = cc16->wCountryID; + cc32->iCodePage = cc16->iCodePage; + cc32->dwLangID = cc16->dwLangID; + cc32->dwSecurity = cc16->dwSecurity; +} + +static void map3216_conv_context(CONVCONTEXT16* cc16, const CONVCONTEXT* cc32) +{ + cc16->cb = sizeof(*cc16); + cc16->wFlags = cc32->wFlags; + cc16->wCountryID = cc32->wCountryID; + cc16->iCodePage = cc32->iCodePage; + cc16->dwLangID = cc32->dwLangID; + cc16->dwSecurity = cc32->dwSecurity; +} + /* ### start build ### */ -extern LONG CALLBACK WDML_CallTo16_long_llllllll (FARPROC16,LONG,LONG,LONG,LONG,LONG,LONG,LONG,LONG); +extern LONG CALLBACK WDML_CallTo16_long_llllllll(FARPROC16,LONG,LONG,LONG,LONG,LONG,LONG,LONG,LONG); /* ### stop build ### */ /****************************************************************** @@ -78,12 +97,35 @@ * * */ -HDDEDATA WDML_InvokeCallback16(PFNCALLBACK pfn, UINT uType, UINT uFmt, HCONV hConv, - HSZ hsz1, HSZ hsz2, HDDEDATA hdata, - DWORD dwData1, DWORD dwData2) -{ - return WDML_CallTo16_long_llllllll((FARPROC16)pfn, uType, uFmt, hConv, - hsz1, hsz2, hdata, dwData1, dwData2); +HDDEDATA WDML_InvokeCallback16(PFNCALLBACK pfn, UINT uType, UINT uFmt, + HCONV hConv, HSZ hsz1, HSZ hsz2, + HDDEDATA hdata, DWORD dwData1, DWORD dwData2) +{ + DWORD d1; + HDDEDATA ret; + CONVCONTEXT16 cc16; + + switch (uType) + { + case XTYP_CONNECT: + case XTYP_WILDCONNECT: + map3216_conv_context(&cc16, (const CONVCONTEXT*)dwData1); + d1 = MapLS(&cc16); + break; + default: + d1 = dwData1; + break; + } + ret = WDML_CallTo16_long_llllllll((FARPROC16)pfn, uType, uFmt, hConv, + hsz1, hsz2, hdata, d1, dwData2); + switch (uType) + { + case XTYP_CONNECT: + case XTYP_WILDCONNECT: + UnMapLS(d1); + break; + } + return ret; } /****************************************************************************** @@ -92,7 +134,8 @@ UINT16 WINAPI DdeInitialize16(LPDWORD pidInst, PFNCALLBACK16 pfnCallback, DWORD afCmd, DWORD ulRes) { - return WDML_Initialize(pidInst, (PFNCALLBACK)pfnCallback, afCmd, ulRes, FALSE, TRUE); + return WDML_Initialize(pidInst, (PFNCALLBACK)pfnCallback, afCmd, ulRes, + FALSE, TRUE); } /***************************************************************** @@ -100,8 +143,7 @@ */ BOOL16 WINAPI DdeUninitialize16(DWORD idInst) { - FIXME(" stub calling DdeUninitialize\n"); - return (BOOL16)DdeUninitialize(idInst); + return (BOOL16)DdeUninitialize(idInst); } /***************************************************************** @@ -109,10 +151,14 @@ */ HCONVLIST WINAPI DdeConnectList16(DWORD idInst, HSZ hszService, HSZ hszTopic, - HCONVLIST hConvList, LPCONVCONTEXT16 pCC) + HCONVLIST hConvList, LPCONVCONTEXT16 pCC16) { - return DdeConnectList(idInst, hszService, hszTopic, hConvList, - (LPCONVCONTEXT)pCC); + CONVCONTEXT cc; + CONVCONTEXT* pCC = NULL; + + if (pCC16) + map1632_conv_context(pCC = &cc, pCC16); + return DdeConnectList(idInst, hszService, hszTopic, hConvList, pCC); } /***************************************************************** @@ -120,7 +166,7 @@ */ HCONV WINAPI DdeQueryNextServer16(HCONVLIST hConvList, HCONV hConvPrev) { - return DdeQueryNextServer(hConvList, hConvPrev); + return DdeQueryNextServer(hConvList, hConvPrev); } /***************************************************************** @@ -128,38 +174,31 @@ */ BOOL16 WINAPI DdeDisconnectList16(HCONVLIST hConvList) { - return (BOOL16)DdeDisconnectList(hConvList); + return (BOOL16)DdeDisconnectList(hConvList); } /***************************************************************** * DdeQueryString (DDEML.23) */ -DWORD WINAPI DdeQueryString16(DWORD idInst, HSZ hsz, LPSTR lpsz, DWORD cchMax, INT16 codepage) +DWORD WINAPI DdeQueryString16(DWORD idInst, HSZ hsz, LPSTR lpsz, DWORD cchMax, + INT16 codepage) { - FIXME("(%ld, 0x%x, %p, %ld, %d): stub \n", - idInst, hsz, lpsz, cchMax, codepage); - return 0; + return DdeQueryStringA(idInst, hsz, lpsz, cchMax, codepage); } /***************************************************************** * DdeConnect (DDEML.7) */ -HCONV WINAPI DdeConnect16(DWORD idInst, HSZ hszService, HSZ hszTopic, - LPCONVCONTEXT16 pCC16) +HCONV WINAPI DdeConnect16(DWORD idInst, HSZ hszService, HSZ hszTopic, + LPCONVCONTEXT16 pCC16) { - CONVCONTEXT cc; - CONVCONTEXT* pCC = NULL; - - if (pCC16) { - pCC = &cc; - cc.cb = sizeof(cc); - cc.wFlags = pCC16->wFlags; - cc.iCodePage = pCC16->iCodePage; - cc.dwLangID = pCC16->dwLangID; - cc.dwSecurity = pCC16->dwSecurity; - } - return DdeConnect(idInst, hszService, hszTopic, pCC); + CONVCONTEXT cc; + CONVCONTEXT* pCC = NULL; + + if (pCC16) + map1632_conv_context(pCC = &cc, pCC16); + return DdeConnect(idInst, hszService, hszTopic, pCC); } /***************************************************************** @@ -167,7 +206,7 @@ */ BOOL16 WINAPI DdeDisconnect16(HCONV hConv) { - return (BOOL16)DdeDisconnect(hConv); + return (BOOL16)DdeDisconnect(hConv); } /***************************************************************** @@ -175,17 +214,17 @@ */ BOOL16 WINAPI DdeSetUserHandle16(HCONV hConv, DWORD id, DWORD hUser) { - return DdeSetUserHandle(hConv, id, hUser); + return DdeSetUserHandle(hConv, id, hUser); } /***************************************************************** * DdeCreateDataHandle (DDEML.14) */ HDDEDATA WINAPI DdeCreateDataHandle16(DWORD idInst, LPBYTE pSrc, DWORD cb, - DWORD cbOff, HSZ hszItem, UINT16 wFmt, + DWORD cbOff, HSZ hszItem, UINT16 wFmt, UINT16 afCmd) { - return DdeCreateDataHandle(idInst, pSrc, cb, cbOff, hszItem, wFmt, afCmd); + return DdeCreateDataHandle(idInst, pSrc, cb, cbOff, hszItem, wFmt, afCmd); } /***************************************************************** @@ -193,15 +232,15 @@ */ HSZ WINAPI DdeCreateStringHandle16(DWORD idInst, LPCSTR str, INT16 codepage) { - if (codepage) - { - return DdeCreateStringHandleA(idInst, str, codepage); - } - else - { - TRACE("Default codepage supplied\n"); - return DdeCreateStringHandleA(idInst, str, CP_WINANSI); - } + if (codepage) + { + return DdeCreateStringHandleA(idInst, str, codepage); + } + else + { + TRACE("Default codepage supplied\n"); + return DdeCreateStringHandleA(idInst, str, CP_WINANSI); + } } /***************************************************************** @@ -209,8 +248,7 @@ */ BOOL16 WINAPI DdeFreeStringHandle16(DWORD idInst, HSZ hsz) { - TRACE("idInst %ld hsz 0x%x\n",idInst,hsz); - return (BOOL)DdeFreeStringHandle(idInst, hsz); + return (BOOL16)DdeFreeStringHandle(idInst, hsz); } /***************************************************************** @@ -218,7 +256,7 @@ */ BOOL16 WINAPI DdeFreeDataHandle16(HDDEDATA hData) { - return (BOOL)DdeFreeDataHandle(hData); + return (BOOL16)DdeFreeDataHandle(hData); } /***************************************************************** @@ -226,19 +264,18 @@ */ BOOL16 WINAPI DdeKeepStringHandle16(DWORD idInst, HSZ hsz) { - return (BOOL)DdeKeepStringHandle(idInst, hsz); + return (BOOL)DdeKeepStringHandle(idInst, hsz); } /***************************************************************** * DdeClientTransaction (DDEML.11) */ -HDDEDATA WINAPI DdeClientTransaction16(LPVOID pData, DWORD cbData, - HCONV hConv, HSZ hszItem, UINT16 wFmt, - UINT16 wType, DWORD dwTimeout, - LPDWORD pdwResult) +HDDEDATA WINAPI DdeClientTransaction16(LPVOID pData, DWORD cbData, HCONV hConv, + HSZ hszItem, UINT16 wFmt, UINT16 wType, + DWORD dwTimeout, LPDWORD pdwResult) { - return DdeClientTransaction((LPBYTE)pData, cbData, hConv, hszItem, - wFmt, wType, dwTimeout, pdwResult); + return DdeClientTransaction((LPBYTE)pData, cbData, hConv, hszItem, + wFmt, wType, dwTimeout, pdwResult); } /***************************************************************** @@ -246,10 +283,9 @@ * DdeAbandonTransaction (DDEML.12) * */ -BOOL16 WINAPI DdeAbandonTransaction16(DWORD idInst, HCONV hConv, - DWORD idTransaction) +BOOL16 WINAPI DdeAbandonTransaction16(DWORD idInst, HCONV hConv, DWORD idTransaction) { - return DdeAbandonTransaction(idInst, hConv, idTransaction); + return (BOOL16)DdeAbandonTransaction(idInst, hConv, idTransaction); } /***************************************************************** @@ -257,28 +293,23 @@ */ BOOL16 WINAPI DdePostAdvise16(DWORD idInst, HSZ hszTopic, HSZ hszItem) { - return (BOOL16)DdePostAdvise(idInst, hszTopic, hszItem); + return (BOOL16)DdePostAdvise(idInst, hszTopic, hszItem); } /***************************************************************** * DdeAddData (DDEML.15) */ -HDDEDATA WINAPI DdeAddData16(HDDEDATA hData, LPBYTE pSrc, DWORD cb, - DWORD cbOff) +HDDEDATA WINAPI DdeAddData16(HDDEDATA hData, LPBYTE pSrc, DWORD cb, DWORD cbOff) { - return DdeAddData(hData, pSrc, cb, cbOff); + return DdeAddData(hData, pSrc, cb, cbOff); } /***************************************************************** * DdeGetData [DDEML.16] */ -DWORD WINAPI DdeGetData16( - HDDEDATA hData, - LPBYTE pDst, - DWORD cbMax, - DWORD cbOff) +DWORD WINAPI DdeGetData16(HDDEDATA hData, LPBYTE pDst, DWORD cbMax, DWORD cbOff) { - return DdeGetData(hData, pDst, cbMax, cbOff); + return DdeGetData(hData, pDst, cbMax, cbOff); } /***************************************************************** @@ -286,6 +317,7 @@ */ LPBYTE WINAPI DdeAccessData16(HDDEDATA hData, LPDWORD pcbDataSize) { + FIXME("expect trouble\n"); /* FIXME: there's a memory leak here... */ return (LPBYTE)MapLS(DdeAccessData(hData, pcbDataSize)); } @@ -309,8 +341,7 @@ /***************************************************************** * DdeNameService (DDEML.27) */ -HDDEDATA WINAPI DdeNameService16(DWORD idInst, HSZ hsz1, HSZ hsz2, - UINT16 afCmd) +HDDEDATA WINAPI DdeNameService16(DWORD idInst, HSZ hsz1, HSZ hsz2, UINT16 afCmd) { return DdeNameService(idInst, hsz1, hsz2, afCmd); } @@ -335,8 +366,34 @@ * DdeQueryConvInfo (DDEML.9) * */ -UINT16 WINAPI DdeQueryConvInfo16(HCONV hconv, DWORD idTransaction, LPCONVINFO16 lpConvInfo) +UINT16 WINAPI DdeQueryConvInfo16(HCONV hConv, DWORD idTransaction, + LPCONVINFO16 lpConvInfo) { - FIXME("stub.\n"); - return 0; + CONVINFO ci32; + CONVINFO16 ci16; + UINT ret; + + ci32.cb = sizeof(ci32); + ci32.ConvCtxt.cb = sizeof(ci32.ConvCtxt); + + ret = DdeQueryConvInfo(hConv, idTransaction, &ci32); + if (ret == 0) return 0; + + ci16.hUser = ci32.hUser; + ci16.hConvPartner = ci32.hConvPartner; + ci16.hszSvcPartner = ci32.hszSvcPartner; + ci16.hszServiceReq = ci32.hszServiceReq; + ci16.hszTopic = ci32.hszTopic; + ci16.hszItem = ci32.hszItem; + ci16.wFmt = ci32.wFmt; + ci16.wType = ci32.wType; + ci16.wStatus = ci32.wStatus; + ci16.wConvst = ci32.wConvst; + ci16.wLastError = ci32.wLastError; + ci16.hConvList = ci32.hConvList; + + map3216_conv_context(&ci16.ConvCtxt, &ci32.ConvCtxt); + + memcpy(lpConvInfo, &ci16, lpConvInfo->cb); + return lpConvInfo->cb; }