/****************************************************************** * WDML_ServerQueueTerminate * * */ static WDML_XACT* WDML_ServerQueueTerminate(WDML_CONV* pConv, LPARAM lParam) { WDML_XACT* pXAct; pXAct = WDML_AllocTransaction(pConv->instance, WM_DDE_TERMINATE, 0, 0); return pXAct; }
/****************************************************************** * WDML_ClientQueueAdvise * * Creates and queue an WM_DDE_ADVISE transaction */ static WDML_XACT* WDML_ClientQueueAdvise(WDML_CONV* pConv, UINT wType, UINT wFmt, HSZ hszItem) { DDEADVISE* pDdeAdvise; WDML_XACT* pXAct; ATOM atom; TRACE("XTYP_ADVSTART (with%s data) transaction\n", (wType & XTYPF_NODATA) ? "out" : ""); atom = WDML_MakeAtomFromHsz(hszItem); if (!atom) return NULL; pXAct = WDML_AllocTransaction(pConv->instance, WM_DDE_ADVISE, wFmt, hszItem); if (!pXAct) { GlobalDeleteAtom(atom); return NULL; } pXAct->wType = wType & ~0x0F; pXAct->hMem = GlobalAlloc(GHND | GMEM_DDESHARE, sizeof(DDEADVISE)); /* FIXME: hMem is unfreed for now... should be deleted in server */ /* pack DdeAdvise */ pDdeAdvise = GlobalLock(pXAct->hMem); pDdeAdvise->fAckReq = (wType & XTYPF_ACKREQ) != 0; pDdeAdvise->fDeferUpd = (wType & XTYPF_NODATA) != 0; pDdeAdvise->cfFormat = wFmt; GlobalUnlock(pXAct->hMem); pXAct->lParam = PackDDElParam(WM_DDE_ADVISE, (UINT_PTR)pXAct->hMem, atom); return pXAct; }
/****************************************************************** * WDML_ClientQueueExecute * * */ static WDML_XACT* WDML_ClientQueueExecute(WDML_CONV* pConv, LPCVOID pData, DWORD cbData) { WDML_XACT* pXAct; TRACE("XTYP_EXECUTE transaction\n"); pXAct = WDML_AllocTransaction(pConv->instance, WM_DDE_EXECUTE, 0, 0); if (!pXAct) return NULL; if (cbData == (DWORD)-1) { HDDEDATA hDdeData = (HDDEDATA)pData; pData = DdeAccessData(hDdeData, &cbData); if (pData) { pXAct->hMem = WDML_BuildExecuteCommand(pConv, pData, cbData); DdeUnaccessData(hDdeData); } } else { pXAct->hMem = WDML_BuildExecuteCommand(pConv, pData, cbData); } pXAct->lParam = (LPARAM)pXAct->hMem; return pXAct; }
/****************************************************************** * WDML_QueueExecute * * */ static WDML_XACT* WDML_ServerQueueExecute(WDML_CONV* pConv, LPARAM lParam) { WDML_XACT* pXAct; pXAct = WDML_AllocTransaction(pConv->instance, WM_DDE_EXECUTE, 0, 0); if (pXAct) { pXAct->hMem = (HGLOBAL)lParam; } return pXAct; }
/****************************************************************** * WDML_ServerQueueUnadvise * * */ static WDML_XACT* WDML_ServerQueueUnadvise(WDML_CONV* pConv, LPARAM lParam) { UINT uiLo, uiHi; WDML_XACT* pXAct; UnpackDDElParam(WM_DDE_UNADVISE, lParam, &uiLo, &uiHi); pXAct = WDML_AllocTransaction(pConv->instance, WM_DDE_UNADVISE, uiLo, WDML_MakeHszFromAtom(pConv->instance, uiHi)); if (pXAct) pXAct->atom = uiHi; return pXAct; }
/****************************************************************** * WDML_ServerQueueRequest * * */ static WDML_XACT* WDML_ServerQueueRequest(WDML_CONV* pConv, LPARAM lParam) { UINT_PTR uiLo, uiHi; WDML_XACT* pXAct; UnpackDDElParam(WM_DDE_REQUEST, lParam, &uiLo, &uiHi); pXAct = WDML_AllocTransaction(pConv->instance, WM_DDE_REQUEST, uiLo, WDML_MakeHszFromAtom(pConv->instance, uiHi)); if (pXAct) pXAct->atom = uiHi; return pXAct; }
/****************************************************************** * WDML_ClientQueueTerminate * * Creates and queue an WM_DDE_TERMINATE transaction */ static WDML_XACT* WDML_ClientQueueTerminate(WDML_CONV* pConv) { WDML_XACT* pXAct; pXAct = WDML_AllocTransaction(pConv->instance, WM_DDE_TERMINATE, 0, 0); if (!pXAct) return NULL; pXAct->lParam = 0; pConv->wStatus &= ~ST_CONNECTED; return pXAct; }
/****************************************************************** * WDML_ClientQueuePoke * * */ static WDML_XACT* WDML_ClientQueuePoke(WDML_CONV* pConv, LPVOID pData, DWORD cbData, UINT wFmt, HSZ hszItem) { DDE_DATAHANDLE_HEAD *dh; WDML_XACT *pXAct; DDEPOKE *ddePoke; HGLOBAL hglobal; ATOM atom; TRACE("XTYP_POKE transaction\n"); atom = WDML_MakeAtomFromHsz(hszItem); if (!atom) return NULL; pXAct = WDML_AllocTransaction(pConv->instance, WM_DDE_POKE, wFmt, hszItem); if (!pXAct) { GlobalDeleteAtom(atom); return NULL; } if (cbData == (DWORD)-1) { hglobal = pData; dh = GlobalLock(hglobal); cbData = GlobalSize(hglobal) - sizeof(DDE_DATAHANDLE_HEAD); pData = dh + 1; GlobalUnlock(hglobal); } pXAct->hMem = GlobalAlloc(GHND | GMEM_DDESHARE, FIELD_OFFSET(DDEPOKE, Value[cbData])); ddePoke = GlobalLock(pXAct->hMem); if (!ddePoke) { pConv->instance->lastError = DMLERR_MEMORY_ERROR; return NULL; } ddePoke->unused = 0; ddePoke->fRelease = TRUE; ddePoke->cfFormat = wFmt; memcpy(ddePoke->Value, pData, cbData); GlobalUnlock(pXAct->hMem); pXAct->lParam = PackDDElParam(WM_DDE_POKE, (UINT_PTR)pXAct->hMem, atom); return pXAct; }
/****************************************************************** * WDML_ServerQueuePoke * * */ static WDML_XACT* WDML_ServerQueuePoke(WDML_CONV* pConv, LPARAM lParam) { UINT uiLo, uiHi; WDML_XACT* pXAct; UnpackDDElParam(WM_DDE_POKE, lParam, &uiLo, &uiHi); pXAct = WDML_AllocTransaction(pConv->instance, WM_DDE_POKE, 0, WDML_MakeHszFromAtom(pConv->instance, uiHi)); if (pXAct) { pXAct->atom = uiHi; pXAct->hMem = (HGLOBAL)uiLo; } return pXAct; }
/****************************************************************** * WDML_ServerQueueAdvise * * */ static WDML_XACT* WDML_ServerQueueAdvise(WDML_CONV* pConv, LPARAM lParam) { UINT uiLo, uiHi; WDML_XACT* pXAct; /* XTYP_ADVSTART transaction: establish link and save link info to InstanceInfoTable */ if (!UnpackDDElParam(WM_DDE_ADVISE, lParam, &uiLo, &uiHi)) return NULL; pXAct = WDML_AllocTransaction(pConv->instance, WM_DDE_ADVISE, 0, WDML_MakeHszFromAtom(pConv->instance, uiHi)); if (pXAct) { pXAct->hMem = (HGLOBAL)uiLo; pXAct->atom = uiHi; } return pXAct; }
/****************************************************************** * WDML_ClientQueuePoke * * */ static WDML_XACT* WDML_ClientQueuePoke(WDML_CONV* pConv, LPCVOID pData, DWORD cbData, UINT wFmt, HSZ hszItem) { WDML_XACT* pXAct; ATOM atom; TRACE("XTYP_POKE transaction\n"); atom = WDML_MakeAtomFromHsz(hszItem); if (!atom) return NULL; pXAct = WDML_AllocTransaction(pConv->instance, WM_DDE_POKE, wFmt, hszItem); if (!pXAct) { GlobalDeleteAtom(atom); return NULL; } if (cbData == (DWORD)-1) { pXAct->hMem = (HDDEDATA)pData; } else { DDEPOKE* ddePoke; pXAct->hMem = GlobalAlloc(GHND | GMEM_DDESHARE, sizeof(DDEPOKE) + cbData); ddePoke = GlobalLock(pXAct->hMem); if (ddePoke) { memcpy(ddePoke->Value, pData, cbData); ddePoke->fRelease = FALSE; /* FIXME: app owned ? */ ddePoke->cfFormat = wFmt; GlobalUnlock(pXAct->hMem); } } pXAct->lParam = PackDDElParam(WM_DDE_POKE, (UINT_PTR)pXAct->hMem, atom); return pXAct; }
/****************************************************************** * WDML_ClientQueueRequest * * */ static WDML_XACT* WDML_ClientQueueRequest(WDML_CONV* pConv, UINT wFmt, HSZ hszItem) { WDML_XACT* pXAct; ATOM atom; TRACE("XTYP_REQUEST transaction\n"); atom = WDML_MakeAtomFromHsz(hszItem); if (!atom) return NULL; pXAct = WDML_AllocTransaction(pConv->instance, WM_DDE_REQUEST, wFmt, hszItem); if (!pXAct) { GlobalDeleteAtom(atom); return NULL; } pXAct->lParam = PackDDElParam(WM_DDE_REQUEST, wFmt, atom); return pXAct; }
/****************************************************************** * WDML_ClientQueueExecute * * */ static WDML_XACT* WDML_ClientQueueExecute(WDML_CONV* pConv, LPVOID pData, DWORD cbData) { WDML_XACT* pXAct; TRACE("XTYP_EXECUTE transaction\n"); if (pData == NULL) { if (cbData == (DWORD)-1) pConv->instance->lastError = DMLERR_INVALIDPARAMETER; else pConv->instance->lastError = DMLERR_MEMORY_ERROR; return NULL; } pXAct = WDML_AllocTransaction(pConv->instance, WM_DDE_EXECUTE, 0, 0); if (!pXAct) return NULL; if (cbData == (DWORD)-1) { HDDEDATA hDdeData = pData; pData = DdeAccessData(hDdeData, &cbData); if (pData) { pXAct->hMem = WDML_BuildExecuteCommand(pConv, pData, cbData); DdeUnaccessData(hDdeData); } } else { pXAct->hMem = WDML_BuildExecuteCommand(pConv, pData, cbData); } pXAct->lParam = (LPARAM)pXAct->hMem; return pXAct; }
/****************************************************************** * WDML_ClientQueueUnadvise * * queues an unadvise transaction */ static WDML_XACT* WDML_ClientQueueUnadvise(WDML_CONV* pConv, UINT wFmt, HSZ hszItem) { WDML_XACT* pXAct; ATOM atom; TRACE("XTYP_ADVSTOP transaction\n"); atom = WDML_MakeAtomFromHsz(hszItem); if (!atom) return NULL; pXAct = WDML_AllocTransaction(pConv->instance, WM_DDE_UNADVISE, wFmt, hszItem); if (!pXAct) { GlobalDeleteAtom(atom); return NULL; } /* end advise loop: post WM_DDE_UNADVISE to server to terminate link * on the specified item. */ pXAct->lParam = PackDDElParam(WM_DDE_UNADVISE, wFmt, atom); return pXAct; }