Fixed initialisation messages for raw DDE. Fixed DdeCreateDataHandle for non NULL or CF_TEXT formats. Various fixes (cosmetics, better error checking).
diff --git a/dlls/user/dde/server.c b/dlls/user/dde/server.c index 301c244..7a18dc6 100644 --- a/dlls/user/dde/server.c +++ b/dlls/user/dde/server.c
@@ -47,7 +47,8 @@ { WDML_INSTANCE* pInstance = NULL; WDML_LINK* pLink = NULL; - HDDEDATA hDdeData = 0, hItemData = 0; + HDDEDATA hDdeData = 0; + HGLOBAL hItemData = 0; WDML_CONV* pConv = NULL; ATOM atom = 0; UINT count; @@ -88,7 +89,7 @@ hDdeData = WDML_InvokeCallback(pInstance, XTYP_ADVREQ, pLink->uFmt, pLink->hConv, hszTopic, hszItem, 0, count--, 0); - if (hDdeData == CBR_BLOCK) + if (hDdeData == (HDDEDATA)CBR_BLOCK) { /* MS doc is not consistent here */ FIXME("CBR_BLOCK returned for ADVREQ\n"); @@ -112,8 +113,7 @@ if (pConv == NULL) { - /* FIXME: wrong if app owned... */ - DdeFreeDataHandle(hDdeData); + if (!WDML_IsAppOwned(hDdeData)) DdeFreeDataHandle(hDdeData); goto theError; } @@ -121,11 +121,12 @@ PackDDElParam(WM_DDE_DATA, (UINT)hItemData, atom))) { ERR("post message failed\n"); - /* FIXME: wrong if app owned... */ - DdeFreeDataHandle(hDdeData); + pConv->wStatus &= ~ST_CONNECTED; + if (!WDML_IsAppOwned(hDdeData)) DdeFreeDataHandle(hDdeData); GlobalFree(hItemData); goto theError; - } + } + if (!WDML_IsAppOwned(hDdeData)) DdeFreeDataHandle(hDdeData); } } } @@ -352,10 +353,9 @@ SetWindowLongA(hwndServerConv, GWL_WDML_CONVERSATION, (DWORD)pConv); /* this should be the only place using SendMessage for WM_DDE_ACK */ + /* note: sent messages shall not use packing */ SendMessageA(hwndClient, WM_DDE_ACK, (WPARAM)hwndServerConv, - PackDDElParam(WM_DDE_ACK, - WDML_MakeAtomFromHsz(hszApp), - WDML_MakeAtomFromHsz(hszTopic))); + MAKELPARAM(WDML_MakeAtomFromHsz(hszApp), WDML_MakeAtomFromHsz(hszTopic))); /* we assume we're connected since we've sent an answer... * I'm not sure what we can do... it doesn't look like the return value * of SendMessage is used... sigh... @@ -457,7 +457,7 @@ hDdeData = WDML_InvokeCallback(pInstance, XTYP_WILDCONNECT, 0, 0, hszTop, hszApp, 0, (DWORD)pcc, self); - if (hDdeData == CBR_BLOCK) + if (hDdeData == (HDDEDATA)CBR_BLOCK) { /* MS doc is not consistent here */ FIXME("CBR_BLOCK returned for WILDCONNECT\n"); @@ -478,13 +478,10 @@ } DdeUnaccessData(hDdeData); } + if (!WDML_IsAppOwned(hDdeData)) DdeFreeDataHandle(hDdeData); } } } - /* - billx: make a conv and add it to the server list - - this can be delayed when link is created for the conv. NO NEED !!! - */ return 0; @@ -548,11 +545,11 @@ pConv->hszTopic, pXAct->hszItem, 0, 0, 0); } - switch (hDdeData) + switch ((DWORD)hDdeData) { case 0: - WDML_PostAck(pConv, WDML_SERVER_SIDE, 0, FALSE, FALSE, pXAct->hszItem, - pXAct->lParam, WM_DDE_REQUEST); + WDML_PostAck(pConv, WDML_SERVER_SIDE, 0, FALSE, FALSE, pXAct->atom, + pXAct->lParam, WM_DDE_REQUEST); break; case CBR_BLOCK: ret = WDML_QS_BLOCK; @@ -587,7 +584,8 @@ /* XTYP_ADVSTART transaction: establish link and save link info to InstanceInfoTable */ - UnpackDDElParam(WM_DDE_ADVISE, lParam, &uiLo, &uiHi); + if (!UnpackDDElParam(WM_DDE_ADVISE, lParam, &uiLo, &uiHi)) + return NULL; pXAct = WDML_AllocTransaction(pConv->instance, WM_DDE_ADVISE, 0, WDML_MakeHszFromAtom(pConv->instance, uiHi)); @@ -633,7 +631,7 @@ /* billx: first to see if the link is already created. */ pLink = WDML_FindLink(pConv->instance, (HCONV)pConv, WDML_SERVER_SIDE, - pXAct->hszItem, pDdeAdvise->cfFormat); + pXAct->hszItem, TRUE, pDdeAdvise->cfFormat); if (pLink != NULL) { @@ -643,7 +641,6 @@ else { TRACE("Adding Link with hConv=0x%lx\n", (DWORD)pConv); - WDML_AddLink(pConv->instance, (HCONV)pConv, WDML_SERVER_SIDE, uType, pXAct->hszItem, pDdeAdvise->cfFormat); } @@ -656,7 +653,10 @@ GlobalUnlock(pXAct->hMem); if (fAck) + { GlobalFree(pXAct->hMem); + } + pXAct->hMem = 0; WDML_PostAck(pConv, WDML_SERVER_SIDE, 0, FALSE, fAck, pXAct->atom, pXAct->lParam, WM_DDE_ADVISE); @@ -699,7 +699,7 @@ } pLink = WDML_FindLink(pConv->instance, (HCONV)pConv, WDML_SERVER_SIDE, - pXAct->hszItem, pXAct->wFmt); + pXAct->hszItem, TRUE, pXAct->wFmt); if (pLink == NULL) { ERR("Couln'd find link for %08lx, dropping request\n", (DWORD)pXAct->hszItem); @@ -718,7 +718,7 @@ /* send back ack */ WDML_PostAck(pConv, WDML_SERVER_SIDE, 0, FALSE, TRUE, pXAct->atom, - pXAct->lParam, WM_DDE_UNADVISE); + pXAct->lParam, WM_DDE_UNADVISE); WDML_DecHSZ(pConv->instance, pXAct->hszItem); @@ -856,8 +856,9 @@ GlobalUnlock(pXAct->hMem); if (!fAck) + { GlobalFree(pXAct->hMem); - + } WDML_PostAck(pConv, WDML_SERVER_SIDE, 0, fBusy, fAck, pXAct->atom, pXAct->lParam, WM_DDE_POKE); WDML_DecHSZ(pConv->instance, pXAct->hszItem); @@ -893,7 +894,6 @@ WDML_InvokeCallback(pConv->instance, XTYP_DISCONNECT, 0, (HCONV)pConv, 0, 0, 0, 0, (pConv->wStatus & ST_ISSELF) ? 1 : 0); } - PostMessageA(pConv->hwndClient, WM_DDE_TERMINATE, (WPARAM)pConv->hwndServer, 0); WDML_RemoveConv(pConv, WDML_SERVER_SIDE);