Module: wine Branch: master Commit: c5bc4b2c9a8ce8aa6e95d3800bf1d9d5021417e7 URL: http://source.winehq.org/git/wine.git/?a=commit;h=c5bc4b2c9a8ce8aa6e95d3800b...
Author: Jeff Latimer lats@yless4u.com.au Date: Thu Jan 22 23:35:27 2009 +1100
user32: Check the instance id on DdeCreateDataHandle and retire a couple of todos.
---
dlls/user32/dde_misc.c | 30 +++++++++++++++++++++++++++++- dlls/user32/tests/dde.c | 30 ++++++++++++++++++++++-------- 2 files changed, 51 insertions(+), 9 deletions(-)
diff --git a/dlls/user32/dde_misc.c b/dlls/user32/dde_misc.c index 89a6bb0..2b7fb81 100644 --- a/dlls/user32/dde_misc.c +++ b/dlls/user32/dde_misc.c @@ -817,6 +817,25 @@ UINT WINAPI DdeGetLastError(DWORD idInst) return error_code; }
+/****************************************************************** + * WDML_SetAllLastError + * + * + */ +static void WDML_SetAllLastError(DWORD lastError) +{ + DWORD threadID; + WDML_INSTANCE* pInstance; + threadID = GetCurrentThreadId(); + pInstance = WDML_InstanceList; + while (pInstance) + { + if (pInstance->threadID == threadID) + pInstance->lastError = lastError; + pInstance = pInstance->next; + } +} + /* ================================================================ * * String management @@ -1267,15 +1286,24 @@ INT WINAPI DdeCmpStringHandles(HSZ hsz1, HSZ hsz2) HDDEDATA WINAPI DdeCreateDataHandle(DWORD idInst, LPBYTE pSrc, DWORD cb, DWORD cbOff, HSZ hszItem, UINT wFmt, UINT afCmd) { - /* For now, we ignore idInst, hszItem. + + /* Other than check for validity we will ignore for now idInst, hszItem. * The purpose of these arguments still need to be investigated. */
+ WDML_INSTANCE* pInstance; HGLOBAL hMem; LPBYTE pByte; DDE_DATAHANDLE_HEAD* pDdh; WCHAR psz[MAX_BUFFER_LEN];
+ pInstance = WDML_GetInstance(idInst); + if (pInstance == NULL) + { + WDML_SetAllLastError(DMLERR_INVALIDPARAMETER); + return NULL; + } + if (!GetAtomNameW(HSZ2ATOM(hszItem), psz, MAX_BUFFER_LEN)) { psz[0] = HSZ2ATOM(hszItem); diff --git a/dlls/user32/tests/dde.c b/dlls/user32/tests/dde.c index 1d14df6..eaea63c 100644 --- a/dlls/user32/tests/dde.c +++ b/dlls/user32/tests/dde.c @@ -1544,7 +1544,7 @@ static void test_DdeCreateStringHandleW(DWORD dde_inst, int codepage) static void test_DdeCreateDataHandle(void) { HDDEDATA hdata; - DWORD dde_inst; + DWORD dde_inst, dde_inst2; DWORD size; UINT res, err; BOOL ret; @@ -1552,27 +1552,41 @@ static void test_DdeCreateDataHandle(void) LPBYTE ptr;
dde_inst = 0; + dde_inst2 = 0; res = DdeInitializeA(&dde_inst, client_ddeml_callback, APPCMD_CLIENTONLY, 0); ok(res == DMLERR_NO_ERROR, "Expected DMLERR_NO_ERROR, got %d\n", res);
+ res = DdeInitializeA(&dde_inst2, client_ddeml_callback, APPCMD_CLIENTONLY, 0); + ok(res == DMLERR_NO_ERROR, "Expected DMLERR_NO_ERROR, got %d\n", res); + item = DdeCreateStringHandleA(dde_inst, "item", CP_WINANSI); ok(item != NULL, "Expected non-NULL hsz\n"); + item = DdeCreateStringHandleA(dde_inst2, "item", CP_WINANSI); + ok(item != NULL, "Expected non-NULL hsz\n");
if (0) { /* do not test with an invalid instance id: that crashes on win9x */ hdata = DdeCreateDataHandle(0xdeadbeef, (LPBYTE)"data", MAX_PATH, 0, item, CF_TEXT, 0); }
- /* 0 instance id */ + /* 0 instance id + * This block tests an invalid instance Id. The correct behaviour is that if the instance Id + * is invalid then the lastError of all instances is set to the error. There are two instances + * created, lastError is cleared, an error is generated and then both instances are checked to + * ensure that they both have the same error set + */ DdeGetLastError(dde_inst); + DdeGetLastError(dde_inst2); hdata = DdeCreateDataHandle(0, (LPBYTE)"data", MAX_PATH, 0, item, CF_TEXT, 0); err = DdeGetLastError(dde_inst); - todo_wine - { - ok(hdata == NULL, "Expected NULL, got %p\n", hdata); - ok(err == DMLERR_INVALIDPARAMETER, - "Expected DMLERR_INVALIDPARAMETER, got %d\n", err); - } + ok(hdata == NULL, "Expected NULL, got %p\n", hdata); + ok(err == DMLERR_INVALIDPARAMETER, "Expected DMLERR_INVALIDPARAMETER, got %d\n", err); + err = DdeGetLastError(dde_inst2); + ok(err == DMLERR_INVALIDPARAMETER, "Expected DMLERR_INVALIDPARAMETER, got %d\n", err); + + ret = DdeUninitialize(dde_inst2); + ok(res == DMLERR_NO_ERROR, "Expected DMLERR_NO_ERROR, got %d\n", res); +
/* NULL pSrc */ DdeGetLastError(dde_inst);