Handle CBR_BLOCK in EXECUTE and ADVISE DDE transactions.
authorDmitry Timoshkov <dmitry@codeweavers.com>
Tue, 1 Feb 2005 18:47:55 +0000 (18:47 +0000)
committerAlexandre Julliard <julliard@winehq.org>
Tue, 1 Feb 2005 18:47:55 +0000 (18:47 +0000)
dlls/user/dde/client.c
dlls/user/dde/dde_private.h
dlls/user/dde/misc.c
dlls/user/dde/server.c

index ccbfd59c074fbc675cbaafa79cd0f89357a9cd2e..a0a65d8618fb3c72597517e556ee1bf61c90d584 100644 (file)
@@ -166,7 +166,7 @@ HCONV WINAPI DdeConnect(DWORD idInst, HSZ hszService, HSZ hszTopic,
        hwndClient = CreateWindowA(WDML_szClientConvClassA, NULL, WS_POPUP, 0, 0, 0, 0, 0, 0, 0, 0);
     }
 
-    SetWindowLongA(hwndClient, GWL_WDML_INSTANCE, (DWORD)pInstance);
+    SetWindowLongPtrW(hwndClient, GWL_WDML_INSTANCE, (LONG_PTR)pInstance);
 
     if (hszService)
     {
@@ -1271,6 +1271,8 @@ static LRESULT CALLBACK WDML_ClientProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPA
     WDML_CONV* pConv = NULL;
     HSZ                hszSrv, hszTpc;
 
+    TRACE("%p %04x %08x %08lx\n", hwnd, iMsg, wParam , lParam);
+
     if (iMsg == WM_DDE_ACK &&
        /* in the initial WM_INITIATE sendmessage */
        ((pConv = WDML_GetConvFromWnd(hwnd)) == NULL || pConv->wStatus == XST_INIT1))
index ca8d27f32e30fe54b63fa2d14025f7e27668cb07..2e147ebc9244c473ea98cc981c040e6a237247dd 100644 (file)
@@ -173,7 +173,7 @@ extern CRITICAL_SECTION WDML_CritSect;              /* protection for instance list */
 /* header for the DDE Data objects */
 typedef struct tagDDE_DATAHANDLE_HEAD
 {
-    short      cfFormat;
+    WORD       cfFormat;
     WORD        bAppOwned;
 } DDE_DATAHANDLE_HEAD;
 
index 727d6f4533908e2ff725b625b543c720d76b0471..0013a4c6a8d1da559425ba58f8fb55c3909d7b4d 100644 (file)
@@ -1277,9 +1277,13 @@ HDDEDATA WINAPI DdeCreateDataHandle(DWORD idInst, LPBYTE pSrc, DWORD cb, DWORD c
     DDE_DATAHANDLE_HEAD*       pDdh;
     WCHAR psz[MAX_BUFFER_LEN];
 
-    GetAtomNameW(HSZ2ATOM(hszItem), psz, MAX_BUFFER_LEN);
+    if (!GetAtomNameW(HSZ2ATOM(hszItem), psz, MAX_BUFFER_LEN))
+    {
+        psz[0] = HSZ2ATOM(hszItem);
+        psz[1] = 0;
+    }
 
-    TRACE("(%ld,%p,cb %ld, cbOff %ld,%p <%s>,%x,%x)\n",
+    TRACE("(%ld,%p,cb %ld, cbOff %ld,%p <%s>,fmt %04x,%x)\n",
          idInst, pSrc, cb, cbOff, hszItem, debugstr_w(psz), wFmt, afCmd);
 
     if (afCmd != 0 && afCmd != HDATA_APPOWNED)
@@ -1309,6 +1313,7 @@ HDDEDATA WINAPI DdeCreateDataHandle(DWORD idInst, LPBYTE pSrc, DWORD cb, DWORD c
     }
     GlobalUnlock(hMem);
 
+    TRACE("=> %p\n", hMem);
     return (HDDEDATA)hMem;
 }
 
@@ -1416,7 +1421,7 @@ LPBYTE WINAPI DdeAccessData(HDDEDATA hData, LPDWORD pcbDataSize)
     {
        *pcbDataSize = GlobalSize(hMem) - sizeof(DDE_DATAHANDLE_HEAD);
     }
-    TRACE("=> %p (%lu)\n", pDdh + 1, GlobalSize(hMem) - sizeof(DDE_DATAHANDLE_HEAD));
+    TRACE("=> %p (%lu) fmt %04x\n", pDdh + 1, GlobalSize(hMem) - sizeof(DDE_DATAHANDLE_HEAD), pDdh->cfFormat);
     return (LPBYTE)(pDdh + 1);
 }
 
@@ -1491,8 +1496,8 @@ HDDEDATA        WDML_Global2DataHandle(HGLOBAL hMem, WINE_DDEHEAD* p)
             switch (pDd->cfFormat)
             {
             default:
-                FIXME("Unsupported format (%d) for data... assuming raw information\n",
-                      pDd->cfFormat);
+                FIXME("Unsupported format (%04x) for data %p, passing raw information\n",
+                      pDd->cfFormat, hMem);
                 /* fall thru */
             case 0:
             case CF_TEXT:
@@ -1550,7 +1555,8 @@ HGLOBAL WDML_DataHandle2Global(HDDEDATA hDdeData, BOOL fResponse, BOOL fRelease,
         switch (pDdh->cfFormat)
         {
         default:
-            FIXME("Unsupported format (%d) for data... passing raw information\n", pDdh->cfFormat);
+            FIXME("Unsupported format (%04x) for data %p, passing raw information\n",
+                   pDdh->cfFormat, hDdeData);
             /* fall thru */
         case 0:
         case CF_TEXT:
index c90c6a4c9d07c11db01d3639bb7766d779a3f357..0bb91b89b34d86c0753fdb0f3e18fe6068d91cef 100644 (file)
@@ -562,7 +562,7 @@ static      WDML_XACT*      WDML_ServerQueueRequest(WDML_CONV* pConv, LPARAM lParam)
 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 @@ static    WDML_QUEUE_STATE WDML_ServerHandleRequest(WDML_CONV* pConv, WDML_XACT* pX
     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 @@ static    WDML_QUEUE_STATE WDML_ServerHandleRequest(WDML_CONV* pConv, WDML_XACT* pX
            {
                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 @@ static      WDML_QUEUE_STATE WDML_ServerHandleAdvise(WDML_CONV* pConv, WDML_XACT* pXA
     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 @@ static    WDML_QUEUE_STATE WDML_ServerHandleAdvise(WDML_CONV* pConv, WDML_XACT* pXA
        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 @@ static     WDML_QUEUE_STATE WDML_ServerHandleAdvise(WDML_CONV* pConv, WDML_XACT* pXA
            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 @@ static     WDML_QUEUE_STATE WDML_ServerHandleExecute(WDML_CONV* pConv, WDML_XACT* pX
                                       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 @@ static      WDML_QUEUE_STATE WDML_ServerHandleExecute(WDML_CONV* pConv, WDML_XACT* pX
        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 @@ static LRESULT CALLBACK WDML_ServerConvProc(HWND hwndServer, UINT iMsg, WPARAM w
     WDML_CONV*         pConv;
     WDML_XACT*         pXAct = NULL;
 
+    TRACE("%p %04x %08x %08lx\n", hwndServer, iMsg, wParam , lParam);
+
     if (iMsg == WM_DESTROY)
     {
        EnterCriticalSection(&WDML_CritSect);