From 5ef324ee898ed6045f47c3ac0564c8dad3a355b9 Mon Sep 17 00:00:00 2001 From: Dmitry Timoshkov Date: Wed, 15 Nov 2006 21:21:44 +0800 Subject: [PATCH] user: Set DDE errors in some failing cases. --- dlls/user/dde_client.c | 11 +++++++++-- dlls/user/dde_misc.c | 7 +++++-- dlls/user/dde_server.c | 2 ++ 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/dlls/user/dde_client.c b/dlls/user/dde_client.c index ecd3b3b7f40..bcf8b33f6a5 100644 --- a/dlls/user/dde_client.c +++ b/dlls/user/dde_client.c @@ -1166,7 +1166,7 @@ HDDEDATA WINAPI DdeClientTransaction(LPBYTE pData, DWORD cbData, HCONV hConv, HS pXAct = WDML_ClientQueueRequest(pConv, wFmt, hszItem); break; default: - FIXME("Unknown transation\n"); + FIXME("Unknown transaction type %04x\n", wType); /* unknown transaction type */ pConv->instance->lastError = DMLERR_INVALIDPARAMETER; goto theError; @@ -1187,6 +1187,7 @@ HDDEDATA WINAPI DdeClientTransaction(LPBYTE pData, DWORD cbData, HCONV hConv, HS pConv->wStatus &= ~ST_CONNECTED; WDML_UnQueueTransaction(pConv, pXAct); WDML_FreeTransaction(pConv->instance, pXAct, TRUE); + pConv->instance->lastError = DMLERR_POSTMSG_FAILED; goto theError; } pXAct->dwTimeout = dwTimeout; @@ -1393,10 +1394,16 @@ BOOL WINAPI DdeDisconnect(HCONV hConv) LeaveCriticalSection(&WDML_CritSect); if (PostMessageW(pConv->hwndServer, pXAct->ddeMsg, (WPARAM)pConv->hwndClient, pXAct->lParam)) + { WDML_SyncWaitTransactionReply(hConv, 10000, pXAct, NULL); + ret = TRUE; + } for (i = 0; i < count; i++) EnterCriticalSection(&WDML_CritSect); - ret = TRUE; + + if (!ret) + pConv->instance->lastError = DMLERR_POSTMSG_FAILED; + WDML_FreeTransaction(pConv->instance, pXAct, TRUE); /* still have to destroy data assosiated with conversation */ WDML_RemoveConv(pConv, WDML_CLIENT_SIDE); diff --git a/dlls/user/dde_misc.c b/dlls/user/dde_misc.c index 506f2dfd5a1..e707c096a00 100644 --- a/dlls/user/dde_misc.c +++ b/dlls/user/dde_misc.c @@ -1924,12 +1924,14 @@ WDML_CONV* WDML_GetConv(HCONV hConv, BOOL checkConnected) if (checkConnected && !(pConv->wStatus & ST_CONNECTED)) { - FIXME("found conv but ain't connected\n"); + WARN("found conv but ain't connected\n"); + pConv->instance->lastError = DMLERR_NO_CONV_ESTABLISHED; return NULL; } if (!pConv->instance || GetCurrentThreadId() != pConv->instance->threadID) { - FIXME("wrong thread ID\n"); + WARN("wrong thread ID\n"); + pConv->instance->lastError = DMLERR_INVALIDPARAMETER; /* FIXME: check */ return NULL; } @@ -1980,6 +1982,7 @@ BOOL WDML_PostAck(WDML_CONV* pConv, WDML_SIDE side, WORD appRetCode, if (!PostMessageW(to, WM_DDE_ACK, (WPARAM)from, lParam)) { pConv->wStatus &= ~ST_CONNECTED; + pConv->instance->lastError = DMLERR_POSTMSG_FAILED; FreeDDElParam(WM_DDE_ACK, lParam); return FALSE; } diff --git a/dlls/user/dde_server.c b/dlls/user/dde_server.c index e12980e397b..5f0f5ee20d7 100644 --- a/dlls/user/dde_server.c +++ b/dlls/user/dde_server.c @@ -136,6 +136,7 @@ BOOL WINAPI DdePostAdvise(DWORD idInst, HSZ hszTopic, HSZ hszItem) { ERR("post message failed\n"); pConv->wStatus &= ~ST_CONNECTED; + pConv->instance->lastError = DMLERR_POSTMSG_FAILED; if (!WDML_IsAppOwned(hDdeData)) DdeFreeDataHandle(hDdeData); GlobalFree(hItemData); goto theError; @@ -587,6 +588,7 @@ static WDML_QUEUE_STATE WDML_ServerHandleRequest(WDML_CONV* pConv, WDML_XACT* pX ReuseDDElParam(pXAct->lParam, WM_DDE_REQUEST, WM_DDE_DATA, (UINT_PTR)hMem, (UINT_PTR)pXAct->atom))) { + pConv->instance->lastError = DMLERR_POSTMSG_FAILED; DdeFreeDataHandle(hDdeData); GlobalFree(hMem); fAck = FALSE;