Changeset 618 for trunk/dll/avl.c


Ignore:
Timestamp:
Apr 20, 2007, 9:19:03 PM (18 years ago)
Author:
Steven Levine
Message:

Add more drag/drop error checking
Use FreeDragInfoData
Sync with NumItemsToUnhilite AcceptOneDrop GetOneDrop mods

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/dll/avl.c

    r603 r618  
    2626  01 Nov 06 SHL Turn off leftover debug code
    2727  06 Apr 07 GKY Work around PM DragInfo and DrgFreeDISH limit
     28  19 Apr 07 SHL Use FreeDragInfoData
     29  19 Apr 07 SHL Add more drag/drop error checking
    2830
    2931***********************************************************************/
     
    548550  PFNWP pfnOldProc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
    549551
    550   PDRAGITEM pditem;
    551   PDRAGINFO pdinfo;
     552  PDRAGITEM pDItem;
     553  PDRAGINFO pDInfo;
    552554  BOOL ok;
    553555
     
    568570
    569571      if (cur_ndx != LIT_NONE) {
    570         pdinfo = DrgAllocDraginfo(1);
    571         if (pdinfo) {
    572           pdinfo->usOperation = DO_DEFAULT;
    573           pdinfo->hwndSource = hwnd;
     572        pDInfo = DrgAllocDraginfo(1);
     573        if (pDInfo) {
     574          pDInfo->usOperation = DO_DEFAULT;
     575          pDInfo->hwndSource = hwnd;
    574576
    575577          memset(&ditem, 0, sizeof(DRAGITEM));
     
    593595          dimage.cxOffset = -16;
    594596          dimage.cyOffset = 0;
    595           DrgSetDragitem(pdinfo, &ditem, sizeof(DRAGITEM), 0);  /* Index of DRAGITEM */
    596           hwndDrop = DrgDrag(hwnd, pdinfo, &dimage, 1,  /* One DRAGIMAGE */
     597          DrgSetDragitem(pDInfo, &ditem, sizeof(DRAGITEM), 0);  /* Index of DRAGITEM */
     598          hwndDrop = DrgDrag(hwnd, pDInfo, &dimage, 1,  /* One DRAGIMAGE */
    597599                             VK_ENDDRAG, NULL);
    598600          if (!hwndDrop)
    599601            Win_Error(hwnd, hwnd, pszSrcFile, __LINE__, "DrgDrag");
    600602
    601           DrgFreeDraginfo(pdinfo);
     603          DrgFreeDraginfo(pDInfo);
    602604          // WinSetWindowPos(hwnd,HWND_TOP,0,0,0,0,SWP_ACTIVATE);
    603605        }
     
    623625      // fprintf(stderr, "DRAGOVER posted 0x%x WM_BUTTON1CLICK x y %d %d\n", hwnd, ptl2.x, ptl2.y);
    624626    }
    625     pdinfo = (PDRAGINFO) mp1;           /* Get DRAGINFO pointer */
    626     if (pdinfo) {
    627       DrgAccessDraginfo(pdinfo);
    628       pditem = DrgQueryDragitemPtr(pdinfo, 0);
    629       /* Check valid rendering mechanisms and data format */
    630       ok = DrgVerifyRMF(pditem, DRM_LBOX, NULL);
    631       DrgFreeDraginfo(pdinfo);
    632       if (ok) {
    633       }
    634     }
    635     return ok ? MRFROM2SHORT(DOR_DROP, DO_MOVE) : MRFROM2SHORT(DOR_NEVERDROP,
    636                                                                0);
     627    pDInfo = (PDRAGINFO) mp1;           /* Get DRAGINFO pointer */
     628    if (pDInfo) {
     629      if (!DrgAccessDraginfo(pDInfo)) {
     630        Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
     631                  "DrgAccessDraginfo");
     632      }
     633      else {
     634        pDItem = DrgQueryDragitemPtr(pDInfo, 0);
     635        /* Check valid rendering mechanisms and data format */
     636        ok = DrgVerifyRMF(pDItem, DRM_LBOX, NULL);
     637        DrgFreeDraginfo(pDInfo);
     638      }
     639    }
     640    return ok ? MRFROM2SHORT(DOR_DROP, DO_MOVE) :
     641                MRFROM2SHORT(DOR_NEVERDROP, 0);
    637642
    638643  case DM_DRAGLEAVE:
     
    652657  case DM_DROP:
    653658    ok = FALSE;
    654     // fprintf(stderr, "DROP\n");
    655     fflush(stderr);
    656659    if (emphasized) {
    657660      emphasized = FALSE;
    658661      // DrawTargetEmphasis(hwnd, emphasized);
    659662    }
    660     pdinfo = (PDRAGINFO) mp1;           /* Get DRAGINFO pointer */
    661     if (pdinfo) {
    662       DrgAccessDraginfo(pdinfo);
    663       pditem = DrgQueryDragitemPtr(pdinfo, 0);
    664       if (!pditem)
    665         Win_Error(hwnd, hwnd, pszSrcFile, __LINE__, "DM_DROP");
    666       /* Check valid rendering mechanisms and data */
    667       ok = DrgVerifyRMF(pditem, DRM_LBOX, NULL)
    668         && ~pditem->fsControl & DC_PREPARE;
    669       if (ok) {
    670         // ret = FullDrgName(pditem,buffer,buflen);
    671         /* note: targetfail is returned to source for all items */
    672         DrgSendTransferMsg(pdinfo->hwndSource, DM_ENDCONVERSATION,
    673                            MPFROMLONG(pditem->ulItemID),
    674                            MPFROMLONG(DMFL_TARGETSUCCESSFUL));
    675       }
    676       DeleteDragitemStrHandles(pdinfo); //
    677       DrgDeleteDraginfoStrHandles(pdinfo);
    678       DrgFreeDraginfo(pdinfo);
     663    pDInfo = (PDRAGINFO) mp1;           /* Get DRAGINFO pointer */
     664    if (pDInfo) {
     665      if (!DrgAccessDraginfo(pDInfo)) {
     666        Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
     667                  "DrgAccessDraginfo");
     668      }
     669      else {
     670        pDItem = DrgQueryDragitemPtr(pDInfo, 0);
     671        if (!pDItem)
     672          Win_Error(hwnd, hwnd, pszSrcFile, __LINE__, "DM_DROP");
     673        /* Check valid rendering mechanisms and data */
     674        ok = DrgVerifyRMF(pDItem, DRM_LBOX, NULL)
     675                          && ~pDItem->fsControl & DC_PREPARE;
     676        if (ok) {
     677          // ret = FullDrgName(pDItem,buffer,buflen);
     678          /* note: targetfail is returned to source for all items */
     679          DrgSendTransferMsg(pDInfo->hwndSource, DM_ENDCONVERSATION,
     680                             MPFROMLONG(pDItem->ulItemID),
     681                             MPFROMLONG(DMFL_TARGETSUCCESSFUL));
     682        }
     683        FreeDragInfoData(hwnd, pDInfo);
     684      }
    679685    }
    680686    return 0;
    681   }                                     // switch
     687  } // switch
    682688  return pfnOldProc ? pfnOldProc(hwnd, msg, mp1, mp2) :
    683689    WinDefWindowProc(hwnd, msg, mp1, mp2);
Note: See TracChangeset for help on using the changeset viewer.