Changeset 603 for trunk/dll/draglist.c


Ignore:
Timestamp:
Apr 6, 2007, 11:57:45 PM (18 years ago)
Author:
Gregg Young
Message:

Work around for PM drag/drop limit; more drag/drop error checking

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/dll/draglist.c

    r551 r603  
    1111  16 Oct 02 SHL DoFileDrag: don't free stack
    1212  26 Jul 06 SHL Check more run time errors
     13  06 Apr 07 GKY Work around PM DragInfo and DrgFreeDISH limits
     14  06 Apr 07 GKY Add DeleteDragitemStrHandles
     15  06 Apr 07 GKY Add some error checking in drag/drop
    1316
    1417***********************************************************************/
     
    2730static PSZ pszSrcFile = __FILE__;
    2831
    29 #pragma alloc_text(DRAGLIST,DragOne,DoFileDrag,DragList,PickUp)
     32#pragma alloc_text(DRAGLIST,DragOne,DoFileDrag,DragList,PickUp,DeleteDragitemStrHandles)
     33
     34BOOL DeleteDragitemStrHandles (PDRAGINFO pDInfo)
     35{
     36    PDRAGITEM  pDItem = NULL;
     37    ULONG cDitem;
     38    INT  i = 0;
     39    cDitem = DrgQueryDragitemCount(pDInfo);
     40     while (i < (INT) cDitem){
     41         pDItem = DrgQueryDragitemPtr(pDInfo, i);
     42     if (pDItem){
     43         DrgDeleteStrHandle(pDItem->hstrType);
     44         DrgDeleteStrHandle(pDItem->hstrRMF);
     45         DrgDeleteStrHandle(pDItem->hstrContainerName);
     46         DrgDeleteStrHandle(pDItem->hstrSourceName);
     47          //  Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
     48          //        "DrgAddStrHandle");
     49         DrgDeleteStrHandle(pDItem->hstrTargetName);
     50     }
     51     else
     52         return FALSE;
     53     i++;
     54    }
     55    return TRUE;
     56}
    3057
    3158HWND DragOne(HWND hwndCnr, HWND hwndObj, CHAR * filename, BOOL moveok)
     
    7299      DItem.hstrContainerName = DrgAddStrHandle(szDir);
    73100      DItem.hstrSourceName = DrgAddStrHandle(szFile);
     101      if(!DItem.hstrSourceName)
     102         Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
     103         "DrgQueryStrName");
    74104      DItem.hstrTargetName = DrgAddStrHandle(szFile);
    75105      DItem.fsControl = 0;
     
    112142                        &fakeicon, 1L, VK_ENDDRAG,      /* End of drag indicator */
    113143                        (PVOID) NULL);  /* Reserved              */
    114 
    115         DrgFreeDraginfo(pDInfo);        /* Free DRAGINFO struct  */
     144        if(hDrop == NULLHANDLE){
     145        if(!DeleteDragitemStrHandles(pDInfo)) //)
     146            Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
     147                      "DeleteDragistr");
     148        DrgDeleteDraginfoStrHandles (pDInfo);
     149        DrgFreeDraginfo(pDInfo);        /* Free DRAGINFO struct  */
     150        }
    116151        WinSetWindowPos(hwndCnr, HWND_TOP, 0, 0, 0, 0, SWP_ACTIVATE);
    117152      }
     
    137172  CHAR szFile[CCHMAXPATH], szBuffer[CCHMAXPATH];
    138173  DRAGIMAGE *padiIcon = NULL, *padiTest, diFakeIcon;
    139 
     174  APIRET rc;
     175
     176  fexceedpmdrglimit = FALSE;
    140177  if (!pciRec && directory && *directory)
    141178    return DragOne(hwndCnr, hwndObj, directory, moveok);
     
    238275        ppDItem[ulNumfiles]->hstrContainerName = DrgAddStrHandle(szBuffer);
    239276        ppDItem[ulNumfiles]->hstrSourceName = DrgAddStrHandle(szFile);
     277        if (!ppDItem[ulNumfiles]->hstrSourceName)
     278        Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
     279                  "DrgAddStrHandle");
    240280        ppDItem[ulNumfiles]->hstrTargetName = DrgAddStrHandle(szFile);
    241281        ppDItem[ulNumfiles]->fsControl = (isdir) ? DC_CONTAINER : 0;
     
    251291          ppDItem[ulNumfiles]->fsSupportedOps = DO_LINKABLE;
    252292          rooting = TRUE;
    253         }
     293        }
     294        if(ulNumfiles >= 1500){
     295            pDInfo = DrgAllocDraginfo(ulNumfiles);
     296            fexceedpmdrglimit = TRUE;
     297              goto Thatsall;
     298        }
    254299        ulNumfiles++;
    255300        ppDItem[ulNumfiles] = NULL;
     
    284329        ppDItem[ulNumfiles]->hstrContainerName = DrgAddStrHandle(arcfile);
    285330        ppDItem[ulNumfiles]->hstrSourceName = DrgAddStrHandle(szFile);
     331        if(!ppDItem[ulNumfiles]->hstrSourceName)
     332        Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
     333                 "DrgAddStrHandle");
    286334        ppDItem[ulNumfiles]->hstrTargetName = DrgAddStrHandle(szFile);
    287335        ppDItem[ulNumfiles]->fsControl = DC_PREPARE;
     
    302350          ppDItem[ulNumfiles]->hstrContainerName = DrgAddStrHandle(arcfile);
    303351          ppDItem[ulNumfiles]->hstrSourceName = DrgAddStrHandle(szFile);
     352          if(!ppDItem[ulNumfiles]->hstrSourceName)
     353          Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
     354                 "DrgAddStrHandle");
    304355          ppDItem[ulNumfiles]->hstrTargetName = DrgAddStrHandle(szFile);
    305356          ppDItem[ulNumfiles]->fsControl = 0;
     
    307358              (driveflags[toupper(*arcfile) - 'A'] & DRIVE_REMOVABLE))
    308359            ppDItem[ulNumfiles]->fsControl |= DC_REMOVEABLEMEDIA;
    309           ppDItem[ulNumfiles]->fsSupportedOps = DO_COPYABLE;
     360          ppDItem[ulNumfiles]->fsSupportedOps = DO_COPYABLE;
     361          if(ulNumfiles >= 1500){
     362              pDInfo = DrgAllocDraginfo(ulNumfiles);
     363              goto Thatsall;
     364          }
    310365          ulNumfiles++;
    311366        }
     
    326381  if (ulNumfiles) {
    327382    pDInfo = DrgAllocDraginfo(ulNumfiles);      /* Allocate DRAGINFO */
     383 Thatsall:
    328384    if (pDInfo) {
    329385      if ((arcfile && *arcfile) || (IsFullName(szBuffer) &&
     
    375431                      padiIcon, ulNumIcon, VK_ENDDRAG,  /* End of drag indicator */
    376432                      (PVOID) NULL);    /* Reserved              */
    377 
    378       DrgFreeDraginfo(pDInfo);          /* Free DRAGINFO struct  */
     433      if(hDrop == NULLHANDLE){
     434          rc = DeleteDragitemStrHandles(pDInfo); //
     435      if(!rc)
     436          Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
     437                    "DeleteDragistr");
     438      DrgDeleteDraginfoStrHandles (pDInfo);
     439      rc = DrgFreeDraginfo(pDInfo);             /* Free DRAGINFO struct  */
     440      if(!rc)
     441      Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
     442                "DrgFreeDraginfo");
     443      }
    379444      if (padiIcon && padiIcon != &diFakeIcon)
    380445        free(padiIcon);
     
    478543        ppDItem[ulNumfiles]->hstrContainerName = DrgAddStrHandle(szBuffer);
    479544        ppDItem[ulNumfiles]->hstrSourceName = DrgAddStrHandle(szFile);
     545        if(!ppDItem[ulNumfiles]->hstrSourceName)
     546            Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
     547                  "DrgAddStrHandle");
    480548        ppDItem[ulNumfiles]->hstrTargetName = DrgAddStrHandle(szFile);
    481549        ppDItem[ulNumfiles]->fsControl = (isdir) ? DC_CONTAINER : 0;
     
    529597                      padiIcon, ulNumIcon, VK_ENDDRAG,  /* End of drag indicator */
    530598                      (PVOID) NULL);    /* Reserved              */
    531 
    532       DrgFreeDraginfo(pDInfo);          /* Free DRAGINFO struct  */
     599      if(hDrop == NULLHANDLE){
     600      if(!DeleteDragitemStrHandles(pDInfo)) //)
     601          Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
     602                    "DeleteDragistr");
     603      DrgDeleteDraginfoStrHandles (pDInfo);
     604      if(!DrgFreeDraginfo(pDInfo));             /* Free DRAGINFO struct  */
     605          Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
     606                    "DrgFreeDraginfo");
     607      }
    533608      free(padiIcon);
    534609      padiIcon = NULL;
     
    601676        ditem.hstrContainerName = DrgAddStrHandle(szDir);
    602677        ditem.hstrSourceName = DrgAddStrHandle(szFile);
     678        if(!ditem.hstrSourceName)
     679        Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
     680                 "DrgAddStrHandle");
    603681        ditem.hstrTargetName = DrgAddStrHandle(szFile);
    604682        ditem.fsControl = 0;
Note: See TracChangeset for help on using the changeset viewer.