Changeset 606 for trunk/dll/draglist.c


Ignore:
Timestamp:
Apr 13, 2007, 11:30:27 PM (18 years ago)
Author:
Gregg Young
Message:

Drag drop work around for number of files limitation in PM

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/dll/draglist.c

    r603 r606  
    3131
    3232#pragma alloc_text(DRAGLIST,DragOne,DoFileDrag,DragList,PickUp,DeleteDragitemStrHandles)
    33 
     33/* work around for DrgDeleteDraginfoStrHandles
     34which seems to fail with a large number of strings */
    3435BOOL DeleteDragitemStrHandles (PDRAGINFO pDInfo)
    3536{
    36     PDRAGITEM  pDItem = NULL;
     37    PDRAGITEM  pDItem;
    3738    ULONG cDitem;
    38     INT  i = 0;
     39    UINT  i = 0;
     40    APIRET rc;
     41
    3942    cDitem = DrgQueryDragitemCount(pDInfo);
    40      while (i < (INT) cDitem){
     43     for (; i < (UINT)cDitem; i++){
    4144         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);
     45     if (!pDItem)
     46        return FALSE;
     47     else {
     48        DrgDeleteStrHandle(pDItem->hstrType);
     49        DrgDeleteStrHandle(pDItem->hstrRMF);
     50        DrgDeleteStrHandle(pDItem->hstrContainerName);
     51        rc = DrgDeleteStrHandle(pDItem->hstrSourceName);
     52        if (!rc)
     53               Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
     54                        "DrgDeleteStrHandle");
     55        DrgDeleteStrHandle(pDItem->hstrTargetName);
    5056     }
    51      else
    52          return FALSE;
    53      i++;
    54     }
    55     return TRUE;
     57   } // for
     58   return TRUE;
    5659}
    5760
     
    99102      DItem.hstrContainerName = DrgAddStrHandle(szDir);
    100103      DItem.hstrSourceName = DrgAddStrHandle(szFile);
    101       if(!DItem.hstrSourceName)
     104      if (!DItem.hstrSourceName)
    102105         Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
    103106         "DrgQueryStrName");
     
    142145                        &fakeicon, 1L, VK_ENDDRAG,      /* End of drag indicator */
    143146                        (PVOID) NULL);  /* Reserved              */
    144         if(hDrop == NULLHANDLE){
    145         if(!DeleteDragitemStrHandles(pDInfo)) //)
     147        //if (hDrop == NULLHANDLE)
     148        if (!DeleteDragitemStrHandles(pDInfo)) //)
    146149            Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
    147150                      "DeleteDragistr");
    148151        DrgDeleteDraginfoStrHandles (pDInfo);
    149152        DrgFreeDraginfo(pDInfo);        /* Free DRAGINFO struct  */
    150         }
    151153        WinSetWindowPos(hwndCnr, HWND_TOP, 0, 0, 0, 0, SWP_ACTIVATE);
    152154      }
     
    174176  APIRET rc;
    175177
    176   fexceedpmdrglimit = FALSE;
     178  fExceedPMDrgLimit = 0;
    177179  if (!pciRec && directory && *directory)
    178180    return DragOne(hwndCnr, hwndObj, directory, moveok);
     
    267269          padiIcon[ulNumfiles].cyOffset = 0 + (ulNumfiles * 6);
    268270        }
    269         memset(ppDItem[ulNumfiles], 0, sizeof(DRAGITEM));
    270         ppDItem[ulNumfiles]->hwndItem = (hwndObj) ? hwndObj : hwndCnr;  /* Initialize DRAGITEM   */
    271         ppDItem[ulNumfiles]->hwndItem = hwndCnr;
    272         ppDItem[ulNumfiles]->ulItemID = (ULONG) pci;
    273         ppDItem[ulNumfiles]->hstrType = DrgAddStrHandle(DRT_UNKNOWN);
    274         ppDItem[ulNumfiles]->hstrRMF = DrgAddStrHandle(DRMDRFLIST);
    275         ppDItem[ulNumfiles]->hstrContainerName = DrgAddStrHandle(szBuffer);
    276         ppDItem[ulNumfiles]->hstrSourceName = DrgAddStrHandle(szFile);
    277         if (!ppDItem[ulNumfiles]->hstrSourceName)
    278         Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
    279                   "DrgAddStrHandle");
     271        memset(ppDItem[ulNumfiles], 0, sizeof(DRAGITEM));
     272        ppDItem[ulNumfiles]->hwndItem = (hwndObj) ? hwndObj : hwndCnr;  /* Initialize DRAGITEM   */
     273        ppDItem[ulNumfiles]->hwndItem = hwndCnr;
     274        ppDItem[ulNumfiles]->ulItemID = (ULONG) pci;
     275        ppDItem[ulNumfiles]->hstrType = DrgAddStrHandle(DRT_UNKNOWN);
     276        ppDItem[ulNumfiles]->hstrRMF = DrgAddStrHandle(DRMDRFLIST);
     277        ppDItem[ulNumfiles]->hstrContainerName = DrgAddStrHandle(szBuffer);
     278             ppDItem[ulNumfiles]->hstrSourceName = DrgAddStrHandle(szFile);
     279        if (!ppDItem[ulNumfiles]->hstrSourceName){
     280            DrgDeleteStrHandle(ppDItem[ulNumfiles]->hstrType);
     281            DrgDeleteStrHandle(ppDItem[ulNumfiles]->hstrRMF);
     282            DrgDeleteStrHandle(ppDItem[ulNumfiles]->hstrContainerName);
     283            DrgDeleteStrHandle(ppDItem[ulNumfiles]->hstrSourceName);
     284            xfree(ppDItem[ulNumfiles]);
     285            fExceedPMDrgLimit = ulNumfiles - 1;
     286            break;
     287        }
     288        /*Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
     289                  "DrgAddStrHandle");*/
    280290        ppDItem[ulNumfiles]->hstrTargetName = DrgAddStrHandle(szFile);
    281291        ppDItem[ulNumfiles]->fsControl = (isdir) ? DC_CONTAINER : 0;
     
    292302          rooting = TRUE;
    293303        }
    294         if(ulNumfiles >= 1500){
    295            pDInfo = DrgAllocDraginfo(ulNumfiles);
    296             fexceedpmdrglimit = TRUE;
    297              goto Thatsall;
    298         }
     304   //if (ulNumfiles >= 2000){
     305     // pDInfo = DrgAllocDraginfo(ulNumfiles);
     306     // fExceedPMDrgLimit = TRUE;
     307     // goto Thatsall;
     308     //   }
    299309        ulNumfiles++;
    300310        ppDItem[ulNumfiles] = NULL;
     
    329339        ppDItem[ulNumfiles]->hstrContainerName = DrgAddStrHandle(arcfile);
    330340        ppDItem[ulNumfiles]->hstrSourceName = DrgAddStrHandle(szFile);
    331         if(!ppDItem[ulNumfiles]->hstrSourceName)
    332         Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
    333                  "DrgAddStrHandle");
     341        if (!ppDItem[ulNumfiles]->hstrSourceName){
     342          DrgDeleteStrHandle(ppDItem[ulNumfiles]->hstrType);
     343          DrgDeleteStrHandle(ppDItem[ulNumfiles]->hstrRMF);
     344          DrgDeleteStrHandle(ppDItem[ulNumfiles]->hstrContainerName);
     345          DrgDeleteStrHandle(ppDItem[ulNumfiles]->hstrSourceName);
     346          xfree(ppDItem[ulNumfiles]);
     347          fExceedPMDrgLimit = ulNumfiles - 1;
     348          break;
     349       }
    334350        ppDItem[ulNumfiles]->hstrTargetName = DrgAddStrHandle(szFile);
    335351        ppDItem[ulNumfiles]->fsControl = DC_PREPARE;
     
    350366          ppDItem[ulNumfiles]->hstrContainerName = DrgAddStrHandle(arcfile);
    351367          ppDItem[ulNumfiles]->hstrSourceName = DrgAddStrHandle(szFile);
    352           if(!ppDItem[ulNumfiles]->hstrSourceName)
    353           Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
    354                  "DrgAddStrHandle");
     368          if (!ppDItem[ulNumfiles]->hstrSourceName){
     369            DrgDeleteStrHandle(ppDItem[ulNumfiles]->hstrType);
     370            DrgDeleteStrHandle(ppDItem[ulNumfiles]->hstrRMF);
     371            DrgDeleteStrHandle(ppDItem[ulNumfiles]->hstrContainerName);
     372            DrgDeleteStrHandle(ppDItem[ulNumfiles]->hstrSourceName);
     373            xfree(ppDItem[ulNumfiles]);
     374            fExceedPMDrgLimit = ulNumfiles - 1;
     375            break;
     376        }
    355377          ppDItem[ulNumfiles]->hstrTargetName = DrgAddStrHandle(szFile);
    356378          ppDItem[ulNumfiles]->fsControl = 0;
     
    359381            ppDItem[ulNumfiles]->fsControl |= DC_REMOVEABLEMEDIA;
    360382          ppDItem[ulNumfiles]->fsSupportedOps = DO_COPYABLE;
    361           if(ulNumfiles >= 1500){
    362               pDInfo = DrgAllocDraginfo(ulNumfiles);
    363               goto Thatsall;
    364           }
     383     //if (ulNumfiles >= 1000){
     384       // pDInfo = DrgAllocDraginfo(ulNumfiles);
     385       // fexceedpmdrglimit = TRUE;
     386       // goto Thatsall;
     387       //   }
    365388          ulNumfiles++;
    366389        }
     
    378401                     MPFROMSHORT(attribute));
    379402  }                                     // while
    380 
     403  if (fExceedPMDrgLimit)
     404    ulNumfiles = ulNumfiles - 1;
    381405  if (ulNumfiles) {
    382406    pDInfo = DrgAllocDraginfo(ulNumfiles);      /* Allocate DRAGINFO */
    383  Thatsall:
    384407    if (pDInfo) {
    385408      if ((arcfile && *arcfile) || (IsFullName(szBuffer) &&
     
    398421                       sizeof(DRAGITEM),        /* Size of DRAGITEM      */
    399422                       Select);         /* Index of DRAGITEM     */
    400         free(ppDItem[Select]);
     423        xfree(ppDItem[Select]);
    401424      }
    402425#ifdef __DEBUG_ALLOC__
    403426      _heap_check();
    404427#endif
    405       free(ppDItem);
     428      xfree(ppDItem);
    406429      ppDItem = NULL;
    407430      DosPostEventSem(CompactSem);
     
    431454                      padiIcon, ulNumIcon, VK_ENDDRAG,  /* End of drag indicator */
    432455                      (PVOID) NULL);    /* Reserved              */
    433       if(hDrop == NULLHANDLE){
    434           rc = DeleteDragitemStrHandles(pDInfo); //
    435       if(!rc)
     456      rc = DeleteDragitemStrHandles(pDInfo);
     457      if (!rc)
    436458          Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
    437459                    "DeleteDragistr");
    438460      DrgDeleteDraginfoStrHandles (pDInfo);
    439461      rc = DrgFreeDraginfo(pDInfo);             /* Free DRAGINFO struct  */
    440       if(!rc)
     462      if (!rc)
    441463      Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
    442464                "DrgFreeDraginfo");
    443       }
    444465      if (padiIcon && padiIcon != &diFakeIcon)
    445         free(padiIcon);
     466        xfree(padiIcon);
    446467      padiIcon = NULL;
    447468      WinSetWindowPos(hwndCnr, HWND_TOP, 0, 0, 0, 0, SWP_ACTIVATE);
     
    450471  }
    451472  if (ppDItem)
    452     free(ppDItem);
     473    xfree(ppDItem);
    453474  if (padiIcon && padiIcon != &diFakeIcon)
    454     free(padiIcon);
     475    xfree(padiIcon);
    455476  MarkAll(hwndCnr, TRUE, FALSE, TRUE);
    456477  return hDrop;
     
    543564        ppDItem[ulNumfiles]->hstrContainerName = DrgAddStrHandle(szBuffer);
    544565        ppDItem[ulNumfiles]->hstrSourceName = DrgAddStrHandle(szFile);
    545         if(!ppDItem[ulNumfiles]->hstrSourceName)
    546             Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
    547                   "DrgAddStrHandle");
     566        if (!ppDItem[ulNumfiles]->hstrSourceName){
     567            DrgDeleteStrHandle(ppDItem[ulNumfiles]->hstrType);
     568            DrgDeleteStrHandle(ppDItem[ulNumfiles]->hstrRMF);
     569            DrgDeleteStrHandle(ppDItem[ulNumfiles]->hstrContainerName);
     570            DrgDeleteStrHandle(ppDItem[ulNumfiles]->hstrSourceName);
     571            xfree(ppDItem[ulNumfiles]);
     572            fExceedPMDrgLimit = ulNumfiles - 1;
     573            break;
     574        }
    548575        ppDItem[ulNumfiles]->hstrTargetName = DrgAddStrHandle(szFile);
    549576        ppDItem[ulNumfiles]->fsControl = (isdir) ? DC_CONTAINER : 0;
     
    562589    }
    563590  }                                     // for
    564 
     591  if (fExceedPMDrgLimit)
     592    ulNumfiles = ulNumfiles - 1;
    565593  if (ulNumfiles) {
    566594    pDInfo = DrgAllocDraginfo(ulNumfiles);      /* Allocate DRAGINFO */
     
    597625                      padiIcon, ulNumIcon, VK_ENDDRAG,  /* End of drag indicator */
    598626                      (PVOID) NULL);    /* Reserved              */
    599       if(hDrop == NULLHANDLE){
    600       if(!DeleteDragitemStrHandles(pDInfo)) //)
    601           Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
    602                     "DeleteDragistr");
     627      if (!DeleteDragitemStrHandles(pDInfo))
     628        Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
     629                  "DeleteDragistr");
    603630      DrgDeleteDraginfoStrHandles (pDInfo);
    604       if(!DrgFreeDraginfo(pDInfo));             /* Free DRAGINFO struct  */
    605           Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
    606                     "DrgFreeDraginfo");
    607       }
    608       free(padiIcon);
     631      if (!DrgFreeDraginfo(pDInfo));            /* Free DRAGINFO struct  */
     632        Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
     633                  "DrgFreeDraginfo");
     634      xfree(padiIcon);
    609635      padiIcon = NULL;
    610636      WinSetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_ACTIVATE);
     
    676702        ditem.hstrContainerName = DrgAddStrHandle(szDir);
    677703        ditem.hstrSourceName = DrgAddStrHandle(szFile);
    678         if(!ditem.hstrSourceName)
     704        if (!ditem.hstrSourceName)
    679705        Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
    680706                 "DrgAddStrHandle");
Note: See TracChangeset for help on using the changeset viewer.