Author: dchapyshev
Date: Mon Apr 14 09:20:49 2008
New Revision: 32959
URL:
http://svn.reactos.org/svn/reactos?rev=32959&view=rev
Log:
- Synchronised with wine head
Modified:
trunk/reactos/dll/win32/user32/include/dde_private.h
trunk/reactos/dll/win32/user32/misc/dde.c
trunk/reactos/dll/win32/user32/misc/ddeclient.c
Modified: trunk/reactos/dll/win32/user32/include/dde_private.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/include/d…
==============================================================================
--- trunk/reactos/dll/win32/user32/include/dde_private.h [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/user32/include/dde_private.h [iso-8859-1] Mon Apr 14 09:20:49
2008
@@ -164,6 +164,7 @@
DWORD monitorFlags;
DWORD lastError;
HWND hwndEvent;
+ DWORD wStatus; /* global instance status */
WDML_SERVER* servers; /* list of registered servers */
WDML_CONV* convs[2]; /* active conversations for this instance (client and server)
*/
WDML_LINK* links[2]; /* active links for this instance (client and server) */
@@ -198,6 +199,8 @@
extern WDML_SERVER* WDML_FindServer(WDML_INSTANCE* pInstance, HSZ hszService, HSZ
hszTopic);
/* transaction handler on the server side */
extern WDML_QUEUE_STATE WDML_ServerHandle(WDML_CONV* pConv, WDML_XACT* pXAct);
+/* transaction handler on the client side */
+HDDEDATA WDML_ClientHandle(WDML_CONV *pConv, WDML_XACT *pXAct, DWORD dwTimeout, LPDWORD
pdwResult) DECLSPEC_HIDDEN;
/* called both in DdeClientTransaction and server side. */
extern UINT WDML_Initialize(LPDWORD pidInst, PFNCALLBACK pfnCallback,
DWORD afCmd, DWORD ulRes, BOOL bUnicode, BOOL b16);
@@ -222,7 +225,7 @@
extern BOOL WDML_DecHSZ(WDML_INSTANCE* pInstance, HSZ hsz);
extern BOOL WDML_IncHSZ(WDML_INSTANCE* pInstance, HSZ hsz);
extern ATOM WDML_MakeAtomFromHsz(HSZ hsz);
-extern HSZ WDML_MakeHszFromAtom(WDML_INSTANCE* pInstance, ATOM atom);
+extern HSZ WDML_MakeHszFromAtom(const WDML_INSTANCE* pInstance, ATOM atom);
/* client calls these */
extern WDML_XACT* WDML_AllocTransaction(WDML_INSTANCE* pInstance, UINT ddeMsg, UINT wFmt,
HSZ hszItem);
extern void WDML_QueueTransaction(WDML_CONV* pConv, WDML_XACT* pXAct);
Modified: trunk/reactos/dll/win32/user32/misc/dde.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/misc/dde.…
==============================================================================
--- trunk/reactos/dll/win32/user32/misc/dde.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/user32/misc/dde.c [iso-8859-1] Mon Apr 14 09:20:49 2008
@@ -20,12 +20,15 @@
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "config.h"
#include <user32.h>
-
-#include <wine/debug.h>
+#include "dde_private.h"
+#include "wine/unicode.h"
+#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(ddeml);
@@ -37,7 +40,9 @@
static LONG WDML_MaxInstanceID = 0; /* OK for present, have to worry about wrap-around
later */
const WCHAR WDML_szEventClass[] =
{'D','d','e','E','v','e','n','t','C','l','a','s','s',0};
-static CRITICAL_SECTION_DEBUG critsect_debug =
+/* protection for instance list */
+CRITICAL_SECTION WDML_CritSect;
+CRITICAL_SECTION_DEBUG critsect_debug =
{
0, 0, &WDML_CritSect,
{ &critsect_debug.ProcessLocksList, &critsect_debug.ProcessLocksList },
@@ -111,13 +116,12 @@
case WM_DDE_ADVISE:
case WM_DDE_DATA:
case WM_DDE_POKE:
- if (!lParam) return FALSE;
- if (!(params = GlobalLock( (HGLOBAL)lParam )))
+ if (!lParam || !(params = GlobalLock((HGLOBAL)lParam)))
{
- ERR("GlobalLock failed (%lx)\n", lParam);
+ if (uiLo) *uiLo = 0;
+ if (uiHi) *uiHi = 0;
return FALSE;
}
- TRACE("unpacked: low %08lx, high %08lx\n", params[0], params[1]);
if (uiLo) *uiLo = params[0];
if (uiHi) *uiHi = params[1];
GlobalUnlock( (HGLOBAL)lParam );
@@ -250,7 +254,7 @@
DWORD id = InterlockedIncrement(&WDML_MaxInstanceID);
pInstance->instanceID = id;
- TRACE("New instance id %ld allocated\n", id);
+ TRACE("New instance id %d allocated\n", id);
}
/******************************************************************
@@ -334,7 +338,7 @@
UINT ret;
WNDCLASSEXW wndclass;
- TRACE("(%p,%p,0x%lx,%ld)\n",
+ TRACE("(%p,%p,0x%x,%d)\n",
pidInst, pfnCallback, afCmd, ulRes);
if (ulRes)
@@ -346,7 +350,7 @@
/* grab enough heap for one control struct - not really necessary for re-initialise
* but allows us to use same validation routines */
- pInstance = (WDML_INSTANCE*)HeapAlloc(GetProcessHeap(), 0, sizeof(WDML_INSTANCE));
+ pInstance = HeapAlloc(GetProcessHeap(), 0, sizeof(WDML_INSTANCE));
if (pInstance == NULL)
{
/* catastrophe !! warn user & abort */
@@ -366,6 +370,7 @@
pInstance->win16 = b16;
pInstance->nodeList = NULL; /* node will be added later */
pInstance->monitorFlags = afCmd & MF_MASK;
+ pInstance->wStatus = 0;
pInstance->servers = NULL;
pInstance->convs[0] = NULL;
pInstance->convs[1] = NULL;
@@ -388,7 +393,7 @@
if (*pidInst == 0)
{
/* Initialisation of new Instance Identifier */
- TRACE("new instance, callback %p flags %lX\n",pfnCallback,afCmd);
+ TRACE("new instance, callback %p flags %X\n",pfnCallback,afCmd);
EnterCriticalSection(&WDML_CritSect);
@@ -491,7 +496,7 @@
else
{
/* Reinitialisation situation --- FIX */
- TRACE("reinitialisation of (%p,%p,0x%lx,%ld): stub\n", pidInst, pfnCallback,
afCmd, ulRes);
+ TRACE("reinitialisation of (%p,%p,0x%x,%d): stub\n", pidInst, pfnCallback,
afCmd, ulRes);
EnterCriticalSection(&WDML_CritSect);
@@ -518,7 +523,7 @@
{
if ((reference_inst->CBFflags & CBF_FAIL_ALLSVRXACTIONS) !=
CBF_FAIL_ALLSVRXACTIONS)
{
- /* i.e. Was set to Client-only and through APPCMD_CLIENTONLY */
+ /* i.e. Was set to Client-only and through APPCMD_CLIENTONLY */
if (!(afCmd & APPCMD_CLIENTONLY))
{
@@ -616,16 +621,13 @@
WDML_CONV* pConv;
WDML_CONV* pConvNext;
- TRACE("(%ld)\n", idInst);
-
- EnterCriticalSection(&WDML_CritSect);
+ TRACE("(%d)\n", idInst);
/* First check instance
*/
pInstance = WDML_GetInstance(idInst);
if (pInstance == NULL)
{
- LeaveCriticalSection(&WDML_CritSect);
/*
* Needs something here to record NOT_INITIALIZED ready for DdeGetLastError
*/
@@ -668,10 +670,10 @@
for (inst = WDML_InstanceList; inst->next != pInstance; inst = inst->next);
inst->next = pInstance->next;
}
- /* leave crit sect and release the heap entry
+ /* release the heap entry
*/
HeapFree(GetProcessHeap(), 0, pInstance);
- LeaveCriticalSection(&WDML_CritSect);
+
return TRUE;
}
@@ -692,7 +694,9 @@
next = pInstance->next;
if (pInstance->threadID == tid)
{
+ LeaveCriticalSection(&WDML_CritSect);
DdeUninitialize(pInstance->instanceID);
+ EnterCriticalSection(&WDML_CritSect);
}
}
LeaveCriticalSection(&WDML_CritSect);
@@ -711,10 +715,13 @@
if (pInstance == NULL)
return NULL;
+
TRACE("invoking CB%d[%p] (%x %x %p %p %p %p %lx %lx)\n",
pInstance->win16 ? 16 : 32, pInstance->callback, uType, uFmt,
hConv, hsz1, hsz2, hdata, dwData1, dwData2);
- ret = pInstance->callback(uType, uFmt, hConv, hsz1, hsz2, hdata, dwData1,
dwData2);
+
+ ret = pInstance->callback(uType, uFmt, hConv, hsz1, hsz2, hdata, dwData1, dwData2);
+
TRACE("done => %p\n", ret);
return ret;
}
@@ -729,6 +736,8 @@
WDML_INSTANCE* WDML_GetInstance(DWORD instId)
{
WDML_INSTANCE* pInstance;
+
+ EnterCriticalSection(&WDML_CritSect);
for (pInstance = WDML_InstanceList; pInstance != NULL; pInstance =
pInstance->next)
{
@@ -739,11 +748,15 @@
FIXME("Tried to get instance from wrong thread\n");
continue;
}
- return pInstance;
- }
- }
- TRACE("Instance entry missing\n");
- return NULL;
+ break;
+ }
+ }
+
+ LeaveCriticalSection(&WDML_CritSect);
+
+ if (!pInstance)
+ WARN("Instance entry missing for id %04x\n", instId);
+ return pInstance;
}
/******************************************************************
@@ -769,8 +782,6 @@
{
DWORD error_code;
WDML_INSTANCE* pInstance;
-
- EnterCriticalSection(&WDML_CritSect);
/* First check instance
*/
@@ -785,7 +796,6 @@
pInstance->lastError = 0;
}
- LeaveCriticalSection(&WDML_CritSect);
return error_code;
}
@@ -838,7 +848,7 @@
* Generally used while receiving a global atom and transforming it
* into an HSZ
*/
-HSZ WDML_MakeHszFromAtom(WDML_INSTANCE* pInstance, ATOM atom)
+HSZ WDML_MakeHszFromAtom(const WDML_INSTANCE* pInstance, ATOM atom)
{
WCHAR nameBuffer[MAX_BUFFER_LEN];
@@ -937,7 +947,7 @@
HSZNode* pNew = NULL;
/* Create a new node for this HSZ.
*/
- pNew = (HSZNode*)HeapAlloc(GetProcessHeap(), 0, sizeof(HSZNode));
+ pNew = HeapAlloc(GetProcessHeap(), 0, sizeof(HSZNode));
if (pNew != NULL)
{
pNew->hsz = hsz;
@@ -978,7 +988,7 @@
break;
case CP_WINUNICODE:
ret = GetAtomNameW(HSZ2ATOM(hsz), ptr, cchMax);
- break;
+ break;
default:
ERR("Unknown code page %d\n", codepage);
ret = 0;
@@ -994,9 +1004,7 @@
DWORD ret = 0;
WDML_INSTANCE* pInstance;
- TRACE("(%ld, %p, %p, %ld, %d)\n", idInst, hsz, psz, cchMax, iCodePage);
-
- EnterCriticalSection(&WDML_CritSect);
+ TRACE("(%d, %p, %p, %d, %d)\n", idInst, hsz, psz, cchMax, iCodePage);
/* First check instance
*/
@@ -1006,9 +1014,8 @@
if (iCodePage == 0) iCodePage = CP_WINANSI;
ret = WDML_QueryString(pInstance, hsz, psz, cchMax, iCodePage);
}
- LeaveCriticalSection(&WDML_CritSect);
-
- TRACE("returning %ld (%s)\n", ret, debugstr_a(psz));
+
+ TRACE("returning %d (%s)\n", ret, debugstr_a(psz));
return ret;
}
@@ -1021,9 +1028,7 @@
DWORD ret = 0;
WDML_INSTANCE* pInstance;
- TRACE("(%ld, %p, %p, %ld, %d)\n", idInst, hsz, psz, cchMax, iCodePage);
-
- EnterCriticalSection(&WDML_CritSect);
+ TRACE("(%d, %p, %p, %d, %d)\n", idInst, hsz, psz, cchMax, iCodePage);
/* First check instance
*/
@@ -1033,9 +1038,8 @@
if (iCodePage == 0) iCodePage = CP_WINUNICODE;
ret = WDML_QueryString(pInstance, hsz, psz, cchMax, iCodePage);
}
- LeaveCriticalSection(&WDML_CritSect);
-
- TRACE("returning %ld (%s)\n", ret, debugstr_w(psz));
+
+ TRACE("returning %d (%s)\n", ret, debugstr_w(psz));
return ret;
}
@@ -1076,9 +1080,7 @@
HSZ hsz = 0;
WDML_INSTANCE* pInstance;
- TRACE("(%ld,%s,%d)\n", idInst, debugstr_a(psz), codepage);
-
- EnterCriticalSection(&WDML_CritSect);
+ TRACE("(%d,%s,%d)\n", idInst, debugstr_a(psz), codepage);
pInstance = WDML_GetInstance(idInst);
if (pInstance)
@@ -1087,7 +1089,6 @@
hsz = WDML_CreateString(pInstance, psz, codepage);
}
- LeaveCriticalSection(&WDML_CritSect);
return hsz;
}
@@ -1108,17 +1109,12 @@
WDML_INSTANCE* pInstance;
HSZ hsz = 0;
- TRACE("(%ld,%s,%d)\n", idInst, debugstr_w(psz), codepage);
-
- EnterCriticalSection(&WDML_CritSect);
-
pInstance = WDML_GetInstance(idInst);
if (pInstance)
{
if (codepage == 0) codepage = CP_WINUNICODE;
hsz = WDML_CreateString(pInstance, psz, codepage);
}
- LeaveCriticalSection(&WDML_CritSect);
return hsz;
}
@@ -1134,9 +1130,7 @@
WDML_INSTANCE* pInstance;
BOOL ret = FALSE;
- TRACE("(%ld,%p):\n", idInst, hsz);
-
- EnterCriticalSection(&WDML_CritSect);
+ TRACE("(%d,%p):\n", idInst, hsz);
/* First check instance
*/
@@ -1144,8 +1138,6 @@
if (pInstance)
ret = WDML_DecHSZ(pInstance, hsz);
- LeaveCriticalSection(&WDML_CritSect);
-
return ret;
}
@@ -1161,9 +1153,7 @@
WDML_INSTANCE* pInstance;
BOOL ret = FALSE;
- TRACE("(%ld,%p):\n", idInst, hsz);
-
- EnterCriticalSection(&WDML_CritSect);
+ TRACE("(%d,%p):\n", idInst, hsz);
/* First check instance
*/
@@ -1171,7 +1161,6 @@
if (pInstance)
ret = WDML_IncHSZ(pInstance, hsz);
- LeaveCriticalSection(&WDML_CritSect);
return ret;
}
@@ -1186,9 +1175,9 @@
* hsz2 [I] Handle to the second string
*
* RETURNS
- * -1 The value of hsz1 is zero or less than hsz2
- * 0 The values of hsz 1 and 2 are the same or both zero.
- * 1 The value of hsz2 is zero of less than hsz1
+ * -1 The value of hsz1 is zero or less than hsz2
+ * 0 The values of hsz 1 and 2 are the same or both zero.
+ * 1 The value of hsz2 is zero of less than hsz1
*/
INT WINAPI DdeCmpStringHandles(HSZ hsz1, HSZ hsz2)
{
@@ -1267,7 +1256,7 @@
psz[1] = 0;
}
- TRACE("(%ld,%p,cb %ld, cbOff %ld,%p <%s>,fmt %04x,%x)\n",
+ TRACE("(%d,%p,cb %d, cbOff %d,%p <%s>,fmt %04x,%x)\n",
idInst, pSrc, cb, cbOff, hszItem, debugstr_w(psz), wFmt, afCmd);
if (afCmd != 0 && afCmd != HDATA_APPOWNED)
@@ -1310,7 +1299,7 @@
DWORD old_sz, new_sz;
LPBYTE pDst;
- TRACE("(%p,%p,cb %ld, cbOff %ld)\n", hData, pSrc, cb, cbOff);
+ TRACE("(%p,%p,cb %d, cbOff %d)\n", hData, pSrc, cb, cbOff);
pDst = DdeAccessData(hData, &old_sz);
if (!pDst) return 0;
@@ -1319,7 +1308,7 @@
if (new_sz > old_sz)
{
DdeUnaccessData(hData);
- hData = GlobalReAlloc((HGLOBAL)hData, new_sz + sizeof(DDE_DATAHANDLE_HEAD),
+ hData = GlobalReAlloc(hData, new_sz + sizeof(DDE_DATAHANDLE_HEAD),
GMEM_MOVEABLE | GMEM_DDESHARE);
pDst = DdeAccessData(hData, &old_sz);
}
@@ -1349,7 +1338,7 @@
DWORD dwSize, dwRet;
LPBYTE pByte;
- TRACE("(%p,%p,%ld,%ld)\n", hData, pDst, cbMax, cbOff);
+ TRACE("(%p,%p,%d,%d)\n", hData, pDst, cbMax, cbOff);
pByte = DdeAccessData(hData, &dwSize);
@@ -1389,7 +1378,7 @@
*/
LPBYTE WINAPI DdeAccessData(HDDEDATA hData, LPDWORD pcbDataSize)
{
- HGLOBAL hMem = (HGLOBAL)hData;
+ HGLOBAL hMem = hData;
DDE_DATAHANDLE_HEAD* pDdh;
TRACE("(%p,%p)\n", hData, pcbDataSize);
@@ -1414,7 +1403,7 @@
*/
BOOL WINAPI DdeUnaccessData(HDDEDATA hData)
{
- HGLOBAL hMem = (HGLOBAL)hData;
+ HGLOBAL hMem = hData;
TRACE("(%p)\n", hData);
@@ -1429,7 +1418,7 @@
BOOL WINAPI DdeFreeDataHandle(HDDEDATA hData)
{
TRACE("(%p)\n", hData);
- return GlobalFree((HGLOBAL)hData) == 0;
+ return GlobalFree(hData) == 0;
}
/******************************************************************
@@ -1442,11 +1431,11 @@
DDE_DATAHANDLE_HEAD* pDdh;
BOOL ret = FALSE;
- pDdh = (DDE_DATAHANDLE_HEAD*)GlobalLock((HGLOBAL)hData);
+ pDdh = (DDE_DATAHANDLE_HEAD*)GlobalLock(hData);
if (pDdh != NULL)
{
ret = pDdh->bAppOwned;
- GlobalUnlock((HGLOBAL)hData);
+ GlobalUnlock(hData);
}
return ret;
}
@@ -1507,7 +1496,7 @@
}
else
{
- ERR("Wrong count: %lu / %d\n", size, sizeof(BITMAP) +
count);
+ ERR("Wrong count: %u / %d\n", size, count);
}
} else ERR("No bitmap header\n");
break;
@@ -1605,7 +1594,7 @@
WCHAR buf1[256];
WCHAR buf2[256];
- pServer = (WDML_SERVER*)HeapAlloc(GetProcessHeap(), 0, sizeof(WDML_SERVER));
+ pServer = HeapAlloc(GetProcessHeap(), 0, sizeof(WDML_SERVER));
if (pServer == NULL) return NULL;
pServer->hszService = hszService;
@@ -1719,7 +1708,7 @@
{
WDML_CONV* pConv;
- /* no converstation yet, add it */
+ /* no conversation yet, add it */
pConv = HeapAlloc(GetProcessHeap(), 0, sizeof(WDML_CONV));
if (!pConv) return NULL;
@@ -1732,6 +1721,7 @@
pConv->transactions = NULL;
pConv->hUser = 0;
pConv->wStatus = (side == WDML_CLIENT_SIDE) ? ST_CLIENT : 0L;
+ pConv->wStatus |= pInstance->wStatus;
/* check if both side of the conversation are of the same instance */
if (GetWindowThreadProcessId(hwndClient, NULL) ==
GetWindowThreadProcessId(hwndServer, NULL) &&
WDML_GetInstanceFromWnd(hwndClient) == WDML_GetInstanceFromWnd(hwndServer))
@@ -1742,6 +1732,8 @@
pConv->next = pInstance->convs[side];
pInstance->convs[side] = pConv;
+
+ TRACE("pConv->wStatus %04x\n", pConv->wStatus);
return pConv;
}
@@ -1834,7 +1826,8 @@
{
if (wCmd == EC_DISABLE)
{
- FIXME("EC_DISABLE is not implemented\n");
+ pConv->wStatus |= ST_BLOCKED;
+ TRACE("EC_DISABLE: conv %p status flags %04x\n", pConv,
pConv->wStatus);
return TRUE;
}
@@ -1847,18 +1840,28 @@
return FALSE;
}
+ if (wCmd == EC_ENABLEALL)
+ {
+ pConv->wStatus &= ~ST_BLOCKED;
+ TRACE("EC_ENABLEALL: conv %p status flags %04x\n", pConv,
pConv->wStatus);
+ }
+
while (pConv->transactions)
{
WDML_XACT *pXAct = pConv->transactions;
- WDML_UnQueueTransaction(pConv, pXAct);
if (pConv->wStatus & ST_CLIENT)
{
- /*WDML_ClientHandle(pConv, pXAct);*/
- FIXME("Client delayed transaction queue handling is not
supported\n");
+ /* transaction should be in the queue until handled */
+ WDML_ClientHandle(pConv, pXAct, 0, NULL);
+ WDML_UnQueueTransaction(pConv, pXAct);
}
else
+ {
+ /* transaction should be removed from the queue before handling */
+ WDML_UnQueueTransaction(pConv, pXAct);
WDML_ServerHandle(pConv, pXAct);
+ }
WDML_FreeTransaction(pConv->instance, pXAct, TRUE);
@@ -1875,16 +1878,45 @@
BOOL ret = FALSE;
WDML_CONV *pConv;
- TRACE("(%ld, %p, %04x)\n", idInst, hConv, wCmd);
-
- EnterCriticalSection(&WDML_CritSect);
-
- pConv = WDML_GetConv(hConv, TRUE);
-
- if (pConv && pConv->instance->instanceID == idInst)
- ret = WDML_EnableCallback(pConv, wCmd);
-
- LeaveCriticalSection(&WDML_CritSect);
+ TRACE("(%d, %p, %04x)\n", idInst, hConv, wCmd);
+
+ if (hConv)
+ {
+ pConv = WDML_GetConv(hConv, TRUE);
+
+ if (pConv && pConv->instance->instanceID == idInst)
+ ret = WDML_EnableCallback(pConv, wCmd);
+ }
+ else
+ {
+ WDML_INSTANCE *pInstance = WDML_GetInstance(idInst);
+
+ if (!pInstance)
+ return FALSE;
+
+ TRACE("adding flags %04x to instance %p\n", wCmd, pInstance);
+ pInstance->wStatus |= wCmd;
+
+ if (wCmd == EC_DISABLE)
+ {
+ pInstance->wStatus |= ST_BLOCKED;
+ TRACE("EC_DISABLE: inst %p status flags %04x\n", pInstance,
pInstance->wStatus);
+ }
+ else if (wCmd == EC_ENABLEALL)
+ {
+ pInstance->wStatus &= ~ST_BLOCKED;
+ TRACE("EC_ENABLEALL: inst %p status flags %04x\n", pInstance,
pInstance->wStatus);
+ }
+
+ ret = TRUE;
+
+ for (pConv = pInstance->convs[WDML_CLIENT_SIDE]; pConv != NULL; pConv =
pConv->next)
+ {
+ ret = WDML_EnableCallback(pConv, wCmd);
+ if (ret && wCmd == EC_QUERYWAITING) break;
+ }
+ }
+
return ret;
}
@@ -1900,16 +1932,19 @@
/* FIXME: should do better checking */
if (pConv == NULL || pConv->magic != WDML_CONV_MAGIC) return NULL;
+ if (!pConv->instance || pConv->instance->threadID != GetCurrentThreadId())
+ {
+ WARN("wrong thread ID\n");
+ pConv->instance->lastError = DMLERR_INVALIDPARAMETER; /* FIXME: check */
+ return NULL;
+ }
+
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");
- return NULL;
- }
return pConv;
}
@@ -1930,7 +1965,7 @@
*
*/
BOOL WDML_PostAck(WDML_CONV* pConv, WDML_SIDE side, WORD appRetCode,
- BOOL fBusy, BOOL fAck, UINT pmt, LPARAM lParam, UINT oldMsg)
+ BOOL fBusy, BOOL fAck, UINT_PTR pmt, LPARAM lParam, UINT oldMsg)
{
DDEACK ddeAck;
HWND from, to;
@@ -1958,6 +1993,7 @@
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;
}
@@ -1970,18 +2006,11 @@
BOOL WINAPI DdeSetUserHandle(HCONV hConv, DWORD id, DWORD hUser)
{
WDML_CONV* pConv;
- BOOL ret = TRUE;
-
- TRACE("(%p,%lx,%lx)\n", hConv, id, hUser);
-
- EnterCriticalSection(&WDML_CritSect);
pConv = WDML_GetConv(hConv, FALSE);
if (pConv == NULL)
- {
- ret = FALSE;
- goto theError;
- }
+ return FALSE;
+
if (id == QID_SYNC)
{
pConv->hUser = hUser;
@@ -1998,12 +2027,10 @@
else
{
pConv->instance->lastError = DMLERR_UNFOUND_QUEUE_ID;
- ret = FALSE;
- }
- }
- theError:
- LeaveCriticalSection(&WDML_CritSect);
- return ret;
+ return FALSE;
+ }
+ }
+ return TRUE;
}
/******************************************************************
@@ -2094,15 +2121,13 @@
CONVINFO ci;
WDML_CONV* pConv;
- TRACE("(%p,%lx,%p)\n", hConv, id, lpConvInfo);
+ TRACE("(%p,%x,%p)\n", hConv, id, lpConvInfo);
if (!hConv)
{
FIXME("hConv is NULL\n");
return 0;
}
-
- EnterCriticalSection(&WDML_CritSect);
pConv = WDML_GetConv(hConv, FALSE);
if (pConv != NULL)
@@ -2120,7 +2145,7 @@
}
ret = 0;
}
- LeaveCriticalSection(&WDML_CritSect);
+
if (ret != 0)
memcpy(lpConvInfo, &ci, min((size_t)lpConvInfo->cb, sizeof(ci)));
return ret;
Modified: trunk/reactos/dll/win32/user32/misc/ddeclient.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/misc/ddec…
==============================================================================
--- trunk/reactos/dll/win32/user32/misc/ddeclient.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/user32/misc/ddeclient.c [iso-8859-1] Mon Apr 14 09:20:49 2008
@@ -1091,6 +1091,37 @@
LeaveCriticalSection(&WDML_CritSect);
return 0;
+}
+
+/*****************************************************************
+ * WDML_ClientHandle
+ */
+HDDEDATA WDML_ClientHandle(WDML_CONV *pConv, WDML_XACT *pXAct, DWORD dwTimeout, LPDWORD
pdwResult)
+{
+ HDDEDATA hDdeData;
+
+ if (!PostMessageW(pConv->hwndServer, pXAct->ddeMsg,
(WPARAM)pConv->hwndClient, pXAct->lParam))
+ {
+ WARN("Failed posting message %x to %p (error=0x%x)\n",
+ pXAct->ddeMsg, pConv->hwndServer, GetLastError());
+ pConv->wStatus &= ~ST_CONNECTED;
+ pConv->instance->lastError = DMLERR_POSTMSG_FAILED;
+ return 0;
+ }
+ pXAct->dwTimeout = dwTimeout;
+ /* FIXME: should set the app bits on *pdwResult */
+
+ if (dwTimeout == TIMEOUT_ASYNC)
+ {
+ if (pdwResult)
+ *pdwResult = MAKELONG(0, pXAct->xActID);
+
+ hDdeData = (HDDEDATA)1;
+ }
+ else
+ hDdeData = WDML_SyncWaitTransactionReply((HCONV)pConv, dwTimeout, pXAct,
pdwResult);
+
+ return hDdeData;
}
/*****************************************************************