Handle CBR_BLOCK in EXECUTE and ADVISE DDE transactions.
diff --git a/dlls/user/dde/server.c b/dlls/user/dde/server.c index c90c6a4..0bb91b8 100644 --- a/dlls/user/dde/server.c +++ b/dlls/user/dde/server.c
@@ -562,7 +562,7 @@ static WDML_QUEUE_STATE WDML_ServerHandleRequest(WDML_CONV* pConv, WDML_XACT* pXAct) { HDDEDATA hDdeData = 0; - WDML_QUEUE_STATE ret = WDML_QS_HANDLED; + BOOL fAck = TRUE; if (!(pConv->instance->CBFflags & CBF_FAIL_REQUESTS)) { @@ -574,12 +574,13 @@ switch ((ULONG_PTR)hDdeData) { case 0: - WDML_PostAck(pConv, WDML_SERVER_SIDE, 0, FALSE, FALSE, pXAct->atom, - pXAct->lParam, WM_DDE_REQUEST); + TRACE("No data returned from the Callback\n"); + fAck = FALSE; break; + case (ULONG_PTR)CBR_BLOCK: - ret = WDML_QS_BLOCK; - break; + return WDML_QS_BLOCK; + default: { HGLOBAL hMem = WDML_DataHandle2Global(hDdeData, TRUE, FALSE, FALSE, FALSE); @@ -589,12 +590,17 @@ { DdeFreeDataHandle(hDdeData); GlobalFree(hMem); + fAck = FALSE; } } break; } + + WDML_PostAck(pConv, WDML_SERVER_SIDE, 0, FALSE, fAck, pXAct->atom, pXAct->lParam, WM_DDE_REQUEST); + WDML_DecHSZ(pConv->instance, pXAct->hszItem); - return ret; + + return WDML_QS_HANDLED; } /****************************************************************** @@ -633,8 +639,8 @@ UINT uType; WDML_LINK* pLink; DDEADVISE* pDdeAdvise; - HDDEDATA hDdeData; - BOOL fAck; + HDDEDATA hDdeData = 0; + BOOL fAck = TRUE; pDdeAdvise = (DDEADVISE*)GlobalLock(pXAct->hMem); uType = XTYP_ADVSTART | @@ -646,15 +652,18 @@ hDdeData = WDML_InvokeCallback(pConv->instance, XTYP_ADVSTART, pDdeAdvise->cfFormat, (HCONV)pConv, pConv->hszTopic, pXAct->hszItem, 0, 0, 0); } - else - { - hDdeData = 0; - } - if ((UINT)hDdeData) + switch ((ULONG_PTR)hDdeData) { - fAck = TRUE; + case 0: + TRACE("No data returned from the Callback\n"); + fAck = FALSE; + break; + case (ULONG_PTR)CBR_BLOCK: + return WDML_QS_BLOCK; + + default: /* billx: first to see if the link is already created. */ pLink = WDML_FindLink(pConv->instance, (HCONV)pConv, WDML_SERVER_SIDE, pXAct->hszItem, TRUE, pDdeAdvise->cfFormat); @@ -670,11 +679,7 @@ WDML_AddLink(pConv->instance, (HCONV)pConv, WDML_SERVER_SIDE, uType, pXAct->hszItem, pDdeAdvise->cfFormat); } - } - else - { - TRACE("No data returned from the Callback\n"); - fAck = FALSE; + break; } GlobalUnlock(pXAct->hMem); @@ -792,8 +797,11 @@ pConv->hszTopic, 0, hDdeData, 0L, 0L); } - switch ((UINT)hDdeData) + switch ((ULONG_PTR)hDdeData) { + case (ULONG_PTR)CBR_BLOCK: + return WDML_QS_BLOCK; + case DDE_FACK: fAck = TRUE; break; @@ -801,7 +809,7 @@ fBusy = TRUE; break; default: - WARN("Bad result code\n"); + FIXME("Unsupported returned value %p\n", hDdeData); /* fall through */ case DDE_FNOTPROCESSED: break; @@ -985,6 +993,8 @@ WDML_CONV* pConv; WDML_XACT* pXAct = NULL; + TRACE("%p %04x %08x %08lx\n", hwndServer, iMsg, wParam , lParam); + if (iMsg == WM_DESTROY) { EnterCriticalSection(&WDML_CritSect);