Changeset 97


Ignore:
Timestamp:
May 21, 2004, 5:21:41 PM (21 years ago)
Author:
root
Message:

Total drives >4GB better

File:
1 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified trunk/dirsize.c

    r12 r97  
     1
     2/***********************************************************************
     3
     4  $Id$
     5
     6  Directory sizes applet
     7
     8  Copyright (c) 1993-98 M. Kimes
     9  Copyright (c) 2004 Steven H.Levine
     10
     11  Revisions     11 Jun 02 SHL - Baseline
     12                06 Jan 04 SHL - Total drives >4GB better
     13
     14***********************************************************************/
     15
    116#define INCL_DOS
    217#define INCL_WIN
     
    823#include <string.h>
    924#include <ctype.h>
     25
    1026#include "dll\fm3dll.h"
    1127#include "dll\fm3dlg.h"
     
    1329
    1430
    15 MRESULT EXPENTRY DirMainProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2) {
    16 
     31MRESULT EXPENTRY DirMainProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2)
     32{
    1733  static CHAR curdir[4];
    1834
    19   switch(msg) {
     35  switch(msg)
     36  {
    2037    case WM_INITDLG:
    2138      *curdir = 0;
     
    2441
    2542    case UM_UNDO:
    26       WinSendDlgItemMsg(hwnd,DIRSIZE_LISTBOX,LM_DELETEALL,MPVOID,MPVOID);
    2743      {
    28         ULONG x,ulDriveMap,ulDriveNum;
    29         CHAR  dirname[] = " :\\";
    30         BOOL  first = TRUE;
    31 
    32         DosError(FERR_DISABLEHARDERR);
    33         DosQCurDisk(&ulDriveNum,&ulDriveMap);
    34         for(x = 2;x < 26;x++) {
    35           if((ulDriveMap & (1L << x)) && !(driveflags[x] & DRIVE_IGNORE)) {
    36             *dirname = (CHAR)x + 'A';
    37             WinSendDlgItemMsg(hwnd,DIRSIZE_LISTBOX,LM_INSERTITEM,
    38                               MPFROM2SHORT(LIT_END,0),MPFROMP(dirname));
    39             if(first) {
    40               WinSendDlgItemMsg(hwnd,DIRSIZE_LISTBOX,LM_SELECTITEM,
    41                                 MPFROMSHORT(0),MPFROMSHORT(TRUE));
    42               first = FALSE;
    43             }
    44           }
    45         }
     44        ULONG x;
     45        ULONG ulDriveMap;
     46        ULONG ulDriveNum;
     47        CHAR  dirname[] = " :\\";
     48        BOOL  first = TRUE;
     49
     50        WinSendDlgItemMsg(hwnd,DIRSIZE_LISTBOX,LM_DELETEALL,MPVOID,MPVOID);
     51
     52        DosError(FERR_DISABLEHARDERR);
     53        DosQCurDisk(&ulDriveNum,&ulDriveMap);
     54
     55        for (x = 2;x < 26;x++) {
     56          if ((ulDriveMap & (1L << x)) && !(driveflags[x] & DRIVE_IGNORE)) {
     57            *dirname = (CHAR)x + 'A';
     58            WinSendDlgItemMsg(hwnd,DIRSIZE_LISTBOX,LM_INSERTITEM,
     59                              MPFROM2SHORT(LIT_END,0),MPFROMP(dirname));
     60            if(first) {
     61              WinSendDlgItemMsg(hwnd,DIRSIZE_LISTBOX,LM_SELECTITEM,
     62                                MPFROMSHORT(0),MPFROMSHORT(TRUE));
     63              first = FALSE;
     64            }
     65          }
     66        }
    4667      }
    4768      return 0;
     
    4970    case UM_RESCAN:
    5071      {
    51         CHAR        FileSystem[CCHMAXPATH],s[CCHMAXPATH * 2];
    52         FSALLOCATE  fsa;
    53         ULONG       type;
    54         USHORT      percentused,percentfree;
    55         struct {
    56           ULONG serial;
    57           CHAR  volumelength;
    58           CHAR  volumelabel[CCHMAXPATH];
    59         }           volser;
    60         INT         removable;
    61 
    62         WinSetDlgItemText(hwnd,DIRSIZE_LABEL,"");
    63         WinSetDlgItemText(hwnd,DIRSIZE_UNITSFREE,"");
    64         WinSetDlgItemText(hwnd,DIRSIZE_UNITSUSED,"");
    65         WinSetDlgItemText(hwnd,DIRSIZE_UNITSIZE,"");
    66         WinSetDlgItemText(hwnd,DIRSIZE_PERCENT,"");
    67         WinSetDlgItemText(hwnd,DIRSIZE_BYTESUSED,"");
    68         WinSetDlgItemText(hwnd,DIRSIZE_BYTESFREE,"");
    69         WinSetDlgItemText(hwnd,DIRSIZE_IFS,"");
    70         WinSetDlgItemText(hwnd,DIRSIZE_LOCAL,"");
    71         WinSendDlgItemMsg(hwnd,DIRSIZE_SLIDER,SLM_SETSLIDERINFO,
    72                           MPFROM2SHORT(SMA_SLIDERARMPOSITION,
    73                                        SMA_INCREMENTVALUE),
    74                           MPFROMSHORT(0));
    75         removable = CheckDrive(toupper(*curdir),FileSystem,&type);
    76         if(removable != -1) {
    77           if(type & DRIVE_ZIPSTREAM)
    78             WinSetDlgItemText(hwnd,DIRSIZE_LOCAL,"Zipstream drive");
    79           else if(type & DRIVE_REMOTE)
    80             WinSetDlgItemText(hwnd,DIRSIZE_LOCAL,"Remote drive");
    81           else {
    82             sprintf(s,"Local drive%s",(removable) ? " (removable)" : "");
    83             WinSetDlgItemText(hwnd,DIRSIZE_LOCAL,s);
    84           }
    85           sprintf(s,"IFS:  %s",FileSystem);
    86           WinSetDlgItemText(hwnd,DIRSIZE_IFS,s);
    87           memset(&volser,0,sizeof(volser));
    88           DosError(FERR_DISABLEHARDERR);
    89           if(!DosQueryFSInfo(toupper(*curdir) - '@',FSIL_VOLSER,
    90                              &volser,(ULONG)sizeof(volser))) {
    91             sprintf(s,"Label:  %s",volser.volumelabel);
    92             WinSetDlgItemText(hwnd,DIRSIZE_LABEL,s);
    93           }
    94           if(!DosQueryFSInfo(toupper(*curdir) - '@',
    95              FSIL_ALLOC,&fsa,sizeof(FSALLOCATE))) {
    96             percentfree = (fsa.cUnitAvail && fsa.cUnit) ?
    97                            (fsa.cUnitAvail * 100) / fsa.cUnit :
    98                            0;
    99             if(!percentfree && fsa.cUnitAvail)
    100               percentfree = 1;
    101             percentused = 100 - percentfree;
    102             sprintf(s,"Units free:  %lu",fsa.cUnitAvail);
    103             WinSetDlgItemText(hwnd,DIRSIZE_UNITSFREE,s);
    104             sprintf(s,"Unit size:  %lu x %u = %lu",fsa.cSectorUnit,
    105                     fsa.cbSector,fsa.cSectorUnit * fsa.cbSector);
    106             WinSetDlgItemText(hwnd,DIRSIZE_UNITSIZE,s);
    107             sprintf(s,"Units used:  %lu",fsa.cUnit - fsa.cUnitAvail);
    108             WinSetDlgItemText(hwnd,DIRSIZE_UNITSUSED,s);
    109             sprintf(s,"Bytes free:  %lu",fsa.cUnitAvail *
    110                                            (fsa.cSectorUnit * fsa.cbSector));
    111             WinSetDlgItemText(hwnd,DIRSIZE_BYTESFREE,s);
    112             sprintf(s,"Bytes used:  %lu",(fsa.cUnit - fsa.cUnitAvail) *
    113                                            (fsa.cSectorUnit * fsa.cbSector));
    114             WinSetDlgItemText(hwnd,DIRSIZE_BYTESUSED,s);
    115             sprintf(s,"Percent used:  %u%%",percentused);
    116             WinSetDlgItemText(hwnd,DIRSIZE_PERCENT,s);
    117             WinSendDlgItemMsg(hwnd,DIRSIZE_SLIDER,SLM_SETSLIDERINFO,
    118                               MPFROM2SHORT(SMA_SLIDERARMPOSITION,
    119                                            SMA_INCREMENTVALUE),
    120                               MPFROMSHORT(percentused));
    121             WinShowWindow(WinWindowFromID(hwnd,DIRSIZE_SLIDER),TRUE);
    122           }
    123         }
    124         else {
    125           WinSetDlgItemText(hwnd,DIRSIZE_LOCAL,"Drive not ready.");
    126           WinShowWindow(WinWindowFromID(hwnd,DIRSIZE_SLIDER),FALSE);
    127         }
     72        CHAR        FileSystem[CCHMAXPATH];
     73        CHAR        s[CCHMAXPATH * 2];
     74        FSALLOCATE  fsa;
     75        ULONG       type;
     76        USHORT      percentused;
     77        USHORT      percentfree;
     78        struct {
     79          ULONG serial;
     80          CHAR  volumelength;
     81          CHAR  volumelabel[CCHMAXPATH];
     82        }           volser;
     83        INT         removable;
     84
     85        WinSetDlgItemText(hwnd,DIRSIZE_LABEL,"");
     86        WinSetDlgItemText(hwnd,DIRSIZE_UNITSFREE,"");
     87        WinSetDlgItemText(hwnd,DIRSIZE_UNITSUSED,"");
     88        WinSetDlgItemText(hwnd,DIRSIZE_UNITSIZE,"");
     89        WinSetDlgItemText(hwnd,DIRSIZE_PERCENT,"");
     90        WinSetDlgItemText(hwnd,DIRSIZE_BYTESUSED,"");
     91        WinSetDlgItemText(hwnd,DIRSIZE_BYTESFREE,"");
     92        WinSetDlgItemText(hwnd,DIRSIZE_IFS,"");
     93        WinSetDlgItemText(hwnd,DIRSIZE_LOCAL,"");
     94        WinSendDlgItemMsg(hwnd,DIRSIZE_SLIDER,SLM_SETSLIDERINFO,
     95                          MPFROM2SHORT(SMA_SLIDERARMPOSITION,
     96                                       SMA_INCREMENTVALUE),
     97                          MPFROMSHORT(0));
     98        removable = CheckDrive(toupper(*curdir),FileSystem,&type);
     99        if (removable != -1) {
     100          if (type & DRIVE_ZIPSTREAM)
     101            WinSetDlgItemText(hwnd,DIRSIZE_LOCAL,"Zipstream drive");
     102          else if (type & DRIVE_REMOTE)
     103            WinSetDlgItemText(hwnd,DIRSIZE_LOCAL,"Remote drive");
     104          else {
     105            sprintf(s,"Local drive%s",(removable) ? " (removable)" : "");
     106            WinSetDlgItemText(hwnd,DIRSIZE_LOCAL,s);
     107          }
     108          sprintf(s,"IFS:  %s",FileSystem);
     109          WinSetDlgItemText(hwnd,DIRSIZE_IFS,s);
     110          memset(&volser,0,sizeof(volser));
     111          DosError(FERR_DISABLEHARDERR);
     112          if (!DosQueryFSInfo(toupper(*curdir) - '@',FSIL_VOLSER,
     113                             &volser,(ULONG)sizeof(volser))) {
     114            sprintf(s,"Label:  %s",volser.volumelabel);
     115            WinSetDlgItemText(hwnd,DIRSIZE_LABEL,s);
     116          }
     117          if (!DosQueryFSInfo(toupper(*curdir) - '@',
     118             FSIL_ALLOC,&fsa,sizeof(FSALLOCATE))) {
     119            percentfree = fsa.cUnit ?
     120                            (fsa.cUnitAvail * 100) / fsa.cUnit :
     121                            0;
     122            if (!percentfree && fsa.cUnitAvail)
     123              percentfree = 1;
     124            percentused = 100 - percentfree;
     125            sprintf(s,"Units free:  %lu",fsa.cUnitAvail);
     126            WinSetDlgItemText(hwnd,DIRSIZE_UNITSFREE,s);
     127            sprintf(s,"Unit size:  %lu x %u = %lu",
     128                    fsa.cSectorUnit,
     129                    fsa.cbSector,
     130                    fsa.cSectorUnit * fsa.cbSector);
     131            WinSetDlgItemText(hwnd,DIRSIZE_UNITSIZE,s);
     132            sprintf(s,"Units used:  %lu",fsa.cUnit - fsa.cUnitAvail);
     133            WinSetDlgItemText(hwnd,DIRSIZE_UNITSUSED,s);
     134            sprintf(s,"Bytes free:  %.0f",
     135                    (float)fsa.cUnitAvail * (fsa.cSectorUnit * fsa.cbSector));
     136            WinSetDlgItemText(hwnd,DIRSIZE_BYTESFREE,s);
     137            sprintf(s,"Bytes used:  %.0f",
     138                    (float)(fsa.cUnit - fsa.cUnitAvail) *
     139                    (fsa.cSectorUnit * fsa.cbSector));
     140            WinSetDlgItemText(hwnd,DIRSIZE_BYTESUSED,s);
     141            sprintf(s,"Percent used:  %u%%",percentused);
     142            WinSetDlgItemText(hwnd,DIRSIZE_PERCENT,s);
     143            WinSendDlgItemMsg(hwnd,DIRSIZE_SLIDER,SLM_SETSLIDERINFO,
     144                              MPFROM2SHORT(SMA_SLIDERARMPOSITION,
     145                                           SMA_INCREMENTVALUE),
     146                              MPFROMSHORT(percentused));
     147            WinShowWindow(WinWindowFromID(hwnd,DIRSIZE_SLIDER),TRUE);
     148          }
     149        }
     150        else {
     151          WinSetDlgItemText(hwnd,DIRSIZE_LOCAL,"Drive not ready.");
     152          WinShowWindow(WinWindowFromID(hwnd,DIRSIZE_SLIDER),FALSE);
     153        }
    128154      }
    129155      return 0;
     
    131157    case WM_CONTROL:
    132158      switch(SHORT1FROMMP(mp1)) {
    133         case DIRSIZE_LISTBOX:
    134           switch(SHORT2FROMMP(mp1)) {
    135             case LN_ENTER:
    136               WinPostMsg(hwnd,WM_COMMAND,MPFROM2SHORT(DID_OK,0),MPVOID);
    137               break;
    138             case LN_SELECT:
    139               {
    140                 SHORT x;
    141 
    142                 x = (SHORT)WinSendDlgItemMsg(hwnd,DIRSIZE_LISTBOX,
    143                                              LM_QUERYSELECTION,
    144                                              MPFROMSHORT(LIT_FIRST),
    145                                              MPVOID);
    146                 if(x >= 0) {
    147                   WinSendDlgItemMsg(hwnd,DIRSIZE_LISTBOX,
    148                                     LM_QUERYITEMTEXT,
    149                                     MPFROM2SHORT(x,sizeof(curdir)),
    150                                     MPFROMP(curdir));
    151                   WinPostMsg(hwnd,UM_RESCAN,MPVOID,MPVOID);
    152                 }
    153               }
    154               break;
    155           }
    156           break;
     159        case DIRSIZE_LISTBOX:
     160          switch(SHORT2FROMMP(mp1)) {
     161            case LN_ENTER:
     162              WinPostMsg(hwnd,WM_COMMAND,MPFROM2SHORT(DID_OK,0),MPVOID);
     163              break;
     164            case LN_SELECT:
     165              {
     166                SHORT x;
     167
     168                x = (SHORT)WinSendDlgItemMsg(hwnd,DIRSIZE_LISTBOX,
     169                                             LM_QUERYSELECTION,
     170                                             MPFROMSHORT(LIT_FIRST),
     171                                             MPVOID);
     172                if (x >= 0) {
     173                  WinSendDlgItemMsg(hwnd,DIRSIZE_LISTBOX,
     174                                    LM_QUERYITEMTEXT,
     175                                    MPFROM2SHORT(x,sizeof(curdir)),
     176                                    MPFROMP(curdir));
     177                  WinPostMsg(hwnd,UM_RESCAN,MPVOID,MPVOID);
     178                }
     179              }
     180              break;
     181          }
     182          break;
    157183      }
    158184      return 0;
     
    160186    case WM_COMMAND:
    161187      switch(SHORT1FROMMP(mp1)) {
    162         case DID_CANCEL:
    163           WinDismissDlg(hwnd,0);
    164           break;
    165 
    166         case DID_OK:
    167           if(*curdir) {
    168             WinSetWindowPos(hwnd,HWND_TOP,0,0,0,0,SWP_HIDE);
    169             WinDlgBox(HWND_DESKTOP,hwnd,
    170                       DirSizeProc,FM3ModHandle,
    171                       DSZ_FRAME,curdir);
    172             WinSetWindowPos(hwnd,HWND_TOP,0,0,0,0,SWP_SHOW);
    173           }
    174           else
    175             DosBeep(50,100);
    176           break;
    177       }
    178       return 0;
    179   }
     188        case DID_CANCEL:
     189          WinDismissDlg(hwnd,0);
     190          break;
     191
     192        case DID_OK:
     193          if (*curdir) {
     194            WinSetWindowPos(hwnd,HWND_TOP,0,0,0,0,SWP_HIDE);
     195            WinDlgBox(HWND_DESKTOP,hwnd,
     196                      DirSizeProc,FM3ModHandle,
     197                      DSZ_FRAME,curdir);
     198            WinSetWindowPos(hwnd,HWND_TOP,0,0,0,0,SWP_SHOW);
     199          }
     200          else
     201            DosBeep(50,100);
     202          break;
     203      }
     204      return 0;
     205  } // switch
    180206  return WinDefDlgProc(hwnd,msg,mp1,mp2);
    181207}
     
    184210#ifdef NEVER
    185211
    186 VOID APIENTRY deinit (ULONG why) {
    187 
    188   if(fmprof)
     212VOID APIENTRY deinit (ULONG why)
     213{
     214  if (fmprof)
    189215    PrfCloseProfile(fmprof);
    190216  fmprof = (HINI)0;
     
    198224
    199225
    200 int main (int argc,char *argv[]) {
    201 
     226int main (int argc,char *argv[])
     227{
    202228  HAB         hab;
    203229  HMQ         hmq;
     
    209235  *fullname = 0;
    210236  for(x = 1;x < argc;x++) {
    211     if(!strchr("/;,`\'",*argv[x]) &&
     237    if (!strchr("/;,`\'",*argv[x]) &&
    212238       !*fullname &&
    213239       (IsRoot(argv[x]) ||
    214         IsFile(argv[x]) == 0)) {
    215       if(IsRoot(argv[x]))
    216         strcpy(fullname,argv[x]);
    217       else if(DosQueryPathInfo(argv[x],
    218                                FIL_QUERYFULLNAME,
    219                                fullname,
    220                                sizeof(fullname)))
    221         *fullname = 0;
     240        IsFile(argv[x]) == 0)) {
     241      if (IsRoot(argv[x]))
     242        strcpy(fullname,argv[x]);
     243      else if (DosQueryPathInfo(argv[x],
     244                               FIL_QUERYFULLNAME,
     245                               fullname,
     246                               sizeof(fullname)))
     247        *fullname = 0;
    222248    }
    223249  }
    224 #ifdef NEVER
    225   DosExitList(EXLST_ADD,deinit);
    226 #endif
     250
     251# ifdef NEVER
     252    DosExitList(EXLST_ADD,deinit);
     253# endif
     254
    227255  hab = WinInitialize(0);
    228   if(hab) {
     256  if (hab) {
    229257    hmq = WinCreateMsgQueue(hab,384);
    230     if(hmq) {
    231       if(InitFM3DLL(hab,argc,argv)) {
    232         if(!*fullname)
    233           rcl = WinDlgBox(HWND_DESKTOP,
    234                           HWND_DESKTOP,
    235                           DirMainProc,
    236                           0,
    237                           DIRSIZE_FRAME,
    238                           NULL);
    239         else
    240           rcl = WinDlgBox(HWND_DESKTOP,
    241                           HWND_DESKTOP,
    242                           DirSizeProc,
    243                           FM3ModHandle,
    244                           DSZ_FRAME,
    245                           fullname);
    246         if (rcl == DID_ERROR)
     258    if (hmq) {
     259      if (InitFM3DLL(hab,argc,argv)) {
     260        if (!*fullname)
     261          rcl = WinDlgBox(HWND_DESKTOP,
     262                          HWND_DESKTOP,
     263                          DirMainProc,
     264                          0,
     265                          DIRSIZE_FRAME,
     266                          NULL);
     267        else
     268          rcl = WinDlgBox(HWND_DESKTOP,
     269                          HWND_DESKTOP,
     270                          DirSizeProc,
     271                          FM3ModHandle,
     272                          DSZ_FRAME,
     273                          fullname);
     274        if (rcl == DID_ERROR)
    247275          rcl = WinGetLastError(hab);
    248276      }
     
    252280  }
    253281  return 0;
    254 }
    255 
     282
     283} // main
     284
Note: See TracChangeset for help on using the changeset viewer.