Changeset 751 for trunk/dll/filldir.c


Ignore:
Timestamp:
Aug 2, 2007, 11:05:48 PM (13 years ago)
Author:
Steven Levine
Message:

Sync rest of code with CNRITEM mods
Sync code with ARCITEM mods
Get compare dialog working
Still some issues with status display
Still some issues with directory sizes tree display
Heap check diagnostic code mostly enabled

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/dll/filldir.c

    r745 r751  
    3333  23 Jul 07 SHL Sync with CNRITEM updates (ticket#24)
    3434  29 Jul 07 SHL Add CNRITEM free and remove support (ticket#24)
     35  02 Aug 07 SHL Add FileAttrToString
    3536
    3637***********************************************************************/
     
    4748#include <ctype.h>
    4849#include <time.h>
     50#include <malloc.h>                     // _heapchk
    4951
    5052#include "fm3dll.h"
     
    5456
    5557#pragma alloc_text(FILLDIR,FillInRecordFromFFB,FillInRecordFromFSA,IDFile)
    56 #pragma alloc_text(FILLDIR1,ProcessDirectory,FillDirCnr,FillTreeCnr)
     58#pragma alloc_text(FILLDIR1,ProcessDirectory,FillDirCnr,FillTreeCnr,FileAttrToString)
    5759#pragma alloc_text(EMPTYCNR,EmptyCnr)
     60
     61/**
     62 * Return display string given standard file attribute mask
     63 * @param fileAttr attribute mask in FILEFINDBUF format
     64 * @return fixed length string for display
     65 */
     66
     67const PSZ FileAttrToString(ULONG fileAttr)
     68{
     69  // From os2win.h
     70  // FILE_ATTRIBUTE_READONLY    0x00000001
     71  // FILE_ATTRIBUTE_HIDDEN      0x00000002
     72  // FILE_ATTRIBUTE_SYSTEM      0x00000004
     73  //                            0x00000008
     74  // FILE_ATTRIBUTE_DIRECTORY   0x00000010
     75  // FILE_ATTRIBUTE_ARCHIVE     0x00000020
     76
     77  static CHAR *apszAttrString[] = {
     78  // RHSDA
     79    "-----",
     80    "R----",
     81    "-H---",
     82    "RH---",
     83    "--S--",
     84    "R-S--",
     85    "-HS--",
     86    "RHS--",
     87    "---D-",
     88    "R--D-",
     89    "-H-D-",
     90    "RH-D-",
     91    "--SD-",
     92    "R-SD-",
     93    "-HSD-",
     94    "RHSD-",
     95    "----A",
     96    "R---A",
     97    "-H--A",
     98    "RH--A",
     99    "--S-A",
     100    "R-S-A",
     101    "-HS-A",
     102    "RHS-A",
     103    "---DA",
     104    "R--DA",
     105    "-H-DA",
     106    "RH-DA",
     107    "--SDA",
     108    "R-SDA",
     109    "-HSDA",
     110    "RHSDA"
     111  };
     112
     113  fileAttr = ((fileAttr & 0x30) >> 1) | (fileAttr & 7); // Drop don't care bit from index
     114
     115  return apszAttrString[fileAttr];
     116
     117}
    58118
    59119static HPOINTER IDFile(PSZ p)
     
    175235  /* fill in a container record from a FILEFINDBUF4 structure */
    176236
    177   CHAR attrstring[] = "RHS\0DA";
    178237  CHAR *p;
    179238  HPOINTER hptr;
    180   UINT x;
    181   UINT y;
    182239
    183240  pci->hwndCnr = hwndCnr;
     
    194251    if (pszDirectory[c - 1] != '\\')
    195252      c2++;
    196     pci->pszFileName = xmalloc(c + c2,
    197                                pszSrcFile,
    198                                __LINE__);
     253    pci->pszFileName = xmalloc(c + c2, pszSrcFile, __LINE__);
    199254    memcpy(pci->pszFileName, pszDirectory, c + 1);
    200255    p = pci->pszFileName + c - 1;
     
    249304    }
    250305  }
    251   // If still need subject - fixme to just point NullStr
    252306  if (!pci->pszSubject)
    253     pci->pszSubject = xstrdup(NullStr, pszSrcFile, __LINE__);
     307    pci->pszSubject = NullStr;
    254308
    255309  /* load the object's longname */
     
    297351    }
    298352  }
    299   // If still need long name set - fixme to just point to NullStr
    300353  if (!pci->pszLongname)
    301     pci->pszLongname = xstrdup(NullStr, pszSrcFile, __LINE__);
     354    pci->pszLongname = NullStr;
    302355
    303356  /* do anything required to case of filename */
     
    385438  pci->cbFile = pffb->cbFile;
    386439  pci->attrFile = pffb->attrFile;
    387   /* build attribute string for display */
    388   y = 0;
    389   for (x = 0; x < 6; x++) {
    390     if (attrstring[x]) {
    391       pci->szDispAttr[y++] =
    392         (CHAR) ((pci->attrFile & (1 << x)) ? attrstring[x] : '-');
    393     }
    394   }
    395   pci->szDispAttr[5] = 0;
    396   pci->pszDispAttr = pci->szDispAttr;
     440  pci->pszDispAttr = FileAttrToString(pci->attrFile);
    397441  pci->rc.pszIcon = pci->pszDisplayName;
    398442  pci->rc.hptrIcon = hptr;
     
    428472{
    429473  HPOINTER hptr;
    430   CHAR attrstring[] = "RHS\0DA";
    431474  CHAR *p;
    432   INT x;
    433   INT y;
    434475
    435476  /* fill in a container record from a FILESTATUS4 structure */
     
    481522    }
    482523  }
    483   // If still need subject buffer - fixme to just point to NullStr
    484524  if (!pci->pszSubject)
    485     pci->pszSubject = xstrdup(NullStr, pszSrcFile, __LINE__);
     525    pci->pszSubject = NullStr;
    486526
    487527  pci->pszLongname = 0;
     
    530570    }
    531571  }
    532   // If still need long name set - fixme to just point to NullStr
    533572  if (!pci->pszLongname)
    534     pci->pszLongname = xstrdup(NullStr, pszSrcFile, __LINE__);
     573    pci->pszLongname = NullStr;
    535574
    536575  if (fForceUpper)
     
    607646  pci->cbFile = pfsa4->cbFile;
    608647  pci->attrFile = pfsa4->attrFile;
    609   y = 0;
    610   for (x = 0; x < 6; x++)
    611     if (attrstring[x])
    612       pci->szDispAttr[y++] = (CHAR) ((pci->attrFile & (1 << x)) ?
    613                                      attrstring[x] : '-');
    614   pci->szDispAttr[5] = 0;
    615   pci->pszDispAttr = pci->szDispAttr;
     648  pci->pszDispAttr = FileAttrToString(pci->attrFile);
    616649  pci->rc.pszIcon = pci->pszDisplayName;
    617650  pci->rc.hptrIcon = hptr;
     
    677710  PCNRITEM pci;
    678711  PCNRITEM pciFirst;
    679   PCNRITEM pcit;
    680712  RECORDINSERT ri;
    681713  PBYTE pByte;
     
    802834                    ok = FALSE;
    803835                    ullTotalBytes = 0;
    804                     if (WinIsWindow((HAB) 0, hwndCnr)) {
    805                       pci = pciFirst;
    806                       while (pci) {
    807                         pcit = (PCNRITEM) pci->rc.preccNextRecord;
    808                         WinSendMsg(hwndCnr,
    809                                    CM_FREERECORD,
    810                                    MPFROMP(&pci), MPFROMSHORT(1));
    811                         pci = pcit;
    812                       }
    813                     }
     836                    if (WinIsWindow((HAB) 0, hwndCnr))
     837                      FreeCnrItemList(hwndCnr, pciFirst);
    814838                  }
    815839                }
     
    907931                ok = FALSE;
    908932                ullTotalBytes = 0;
    909                 if (WinIsWindow((HAB) 0, hwndCnr)) {
    910                   pci = pciFirst;
    911                   while (pci) {
    912                     pcit = (PCNRITEM) pci->rc.preccNextRecord;
    913                     WinSendMsg(hwndCnr, CM_FREERECORD,
    914                                MPFROMP(&pci), MPFROMSHORT(1));
    915                     pci = pcit;
    916                   }
    917                 }
     933                if (WinIsWindow((HAB) 0, hwndCnr))
     934                  FreeCnrItemList(hwndCnr, pciFirst);
    918935              }
    919936            }
     
    977994  DosPostEventSem(CompactSem);
    978995
     996#if 1 // fixme to disable or to be configurable
     997  {
     998    int state = _heapchk();
     999    if (state != _HEAPOK)
     1000      Runtime_Error(pszSrcFile, __LINE__, "heap corrupted %d", state);
     1001  }
     1002#endif
     1003
    9791004} // FillDirCnr
    9801005
     
    10321057    pciFirst = WinSendMsg(hwndCnr,
    10331058                          CM_ALLOCRECORD,
    1034                           MPFROMLONG(EXTRA_RECORD_BYTES2),
     1059                          MPFROMLONG(EXTRA_RECORD_BYTES),
    10351060                          MPFROMLONG((ULONG) numtoinsert));
    10361061  }
     
    11521177              pci->rc.pszIcon = pci->pszDisplayName;
    11531178              pci->attrFile = FILE_DIRECTORY;
    1154               strcpy(pci->szDispAttr, "----D-");
    1155               pci->pszDispAttr = pci->szDispAttr;
     1179              pci->pszDispAttr = FileAttrToString(pci->attrFile);
    11561180              driveserial[x] = -1;
    11571181            }
     
    11651189            pci->rc.pszIcon = pci->pszDisplayName;
    11661190            pci->attrFile = FILE_DIRECTORY;
    1167             strcpy(pci->szDispAttr, "----D-");
    1168             pci->pszDispAttr = pci->szDispAttr;
     1191            pci->pszDispAttr = FileAttrToString(pci->attrFile);
    11691192          }
    11701193          SelectDriveIcon(pci);
     
    11761199          pci->rc.pszIcon = pci->pszFileName;
    11771200          pci->attrFile = FILE_DIRECTORY;
    1178           strcpy(pci->szDispAttr, "----D-");
    1179           pci->pszDispAttr = pci->szDispAttr;
     1201          pci->pszDispAttr = FileAttrToString(pci->attrFile);
    11801202          driveserial[x] = -1;
    11811203        }
     
    11881210        pci->rc.pszIcon = pci->pszDisplayName;
    11891211        pci->attrFile = FILE_DIRECTORY;
    1190         strcpy(pci->szDispAttr, "----D-");
    1191         pci->pszDispAttr = pci->szDispAttr;
     1212        pci->pszDispAttr = FileAttrToString(pci->attrFile);
    11921213        driveflags[x] |= (DRIVE_REMOVABLE | DRIVE_NOLONGNAMES);
    11931214        driveserial[x] = -1;
     
    12531274    pciParent = WinSendMsg(hwndCnr,
    12541275                           CM_ALLOCRECORD,
    1255                            MPFROMLONG(EXTRA_RECORD_BYTES2), MPFROMLONG(1));
     1276                           MPFROMLONG(EXTRA_RECORD_BYTES), MPFROMLONG(1));
    12561277    if (pciParent) {
    12571278      pciParent->flags |= RECFLAGS_ENV;
    12581279      pciParent->pszFileName = xstrdup(GetPString(IDS_ENVVARSTEXT), pszSrcFile, __LINE__);
    1259       //pciParent->pszFileName = pciParent->szFileName;
    12601280      pciParent->rc.hptrIcon = hptrEnv;
    12611281      pciParent->rc.pszIcon = pciParent->pszFileName;
    1262       strcpy(pciParent->szDispAttr, "------");
    1263       pciParent->pszDispAttr = pciParent->szDispAttr;
     1282      pciParent->pszDispAttr = FileAttrToString(0);
    12641283      memset(&ri, 0, sizeof(RECORDINSERT));
    12651284      ri.cb = sizeof(RECORDINSERT);
     
    12891308            pci = WinSendMsg(hwndCnr,
    12901309                             CM_ALLOCRECORD,
    1291                              MPFROMLONG(EXTRA_RECORD_BYTES2),
     1310                             MPFROMLONG(EXTRA_RECORD_BYTES),
    12921311                             MPFROMLONG(1));
    12931312            if (pci) {
     
    12981317              pci->rc.hptrIcon = hptrEnv;
    12991318              pci->rc.pszIcon = pci->pszFileName;
    1300               strcpy(pci->szDispAttr, "------");
    1301               pci->pszDispAttr = pci->szDispAttr;
     1319              pci->pszDispAttr = FileAttrToString(0);
    13021320              memset(&ri, 0, sizeof(RECORDINSERT));
    13031321              ri.cb = sizeof(RECORDINSERT);
     
    13121330                Win_Error2(hwndCnr, HWND_DESKTOP, pszSrcFile, __LINE__,
    13131331                           IDS_CMINSERTERRTEXT);
    1314                 WinSendMsg(hwndCnr, CM_FREERECORD, MPFROMP(&pci),
    1315                            MPFROMSHORT(1));
     1332                FreeCnrItem(hwndCnr, pci);
    13161333              }
    13171334            }
     
    13241341      }
    13251342      else
    1326         WinSendMsg(hwndCnr,
    1327                    CM_FREERECORD, MPFROMP(&pciParent), MPFROMSHORT(1));
     1343        FreeCnrItem(hwndCnr, pciParent);
    13281344    }
    13291345  } // if show env
     
    14801496  PFIELDINFO pfi;
    14811497
     1498#if 1 // fixme to disable or to be configurable
     1499  {
     1500    int state = _heapchk();
     1501    if (state != _HEAPOK)
     1502      Runtime_Error(pszSrcFile, __LINE__, "heap corrupted %d", state);
     1503  }
     1504#endif
     1505
    14821506  // Remove all records
    14831507  RemoveCnrItems(hwnd, NULL, 0, CMA_FREE);
     
    14911515    Win_Error(hwnd, HWND_DESKTOP, pszSrcFile, __LINE__,"CM_REMOVEDETAILFIELDINFO hwnd %x", hwnd);
    14921516  }
    1493 
    1494   // DbgMsg(pszSrcFile, __LINE__, "EmptyCnr hwnd %p emptied", hwnd);
    14951517}
    14961518
    14971519/**
    14981520 * Free storage associated with container item
     1521 * Caller is responsible for correcting pointers
    14991522 */
    15001523
    1501 static VOID FreeCnrItemData(PCNRITEM pci)
     1524VOID FreeCnrItemData(PCNRITEM pci)
    15021525{
    15031526  // DbgMsg(pszSrcFile, __LINE__, "FreeCnrItemData %p", pci);
     
    15181541 */
    15191542
    1520 VOID FreeCnrItem(HWND hwnd, PCNRITEM pci)
     1543INT FreeCnrItem(HWND hwnd, PCNRITEM pci)
    15211544{
     1545  INT remaining;
     1546
    15221547  // DbgMsg(pszSrcFile, __LINE__, "FreeCnrItem hwnd %x pci %p", hwnd, pci);
    15231548
    15241549  FreeCnrItemData(pci);
    15251550
    1526   if ((INT)WinSendMsg(hwnd, CM_FREERECORD, MPFROMP(&pci), MPFROMSHORT(1)) == -1) {
     1551  remaining = (INT)WinSendMsg(hwnd, CM_FREERECORD, MPFROMP(&pci), MPFROMSHORT(1));
     1552  if (remaining == -1) {
    15271553    // Win_Error2(hwnd, HWND_DESKTOP, pszSrcFile, __LINE__,IDS_CMFREEERRTEXT);
    15281554    Win_Error(hwnd, HWND_DESKTOP, pszSrcFile, __LINE__,"CM_FREERECORD hwnd %x pci %p", hwnd, pci);
    15291555  }
     1556  return remaining;
    15301557}
    15311558
    15321559/**
    1533  * Remove item from container and free associated storage
     1560 * Free container item list and associated storage
    15341561 */
    15351562
    1536 VOID RemoveCnrItems(HWND hwnd, PCNRITEM pci, USHORT usCnt, USHORT usFlags)
     1563VOID FreeCnrItemList(HWND hwnd, PCNRITEM pciFirst)
    15371564{
     1565  PCNRITEM pci = pciFirst;
     1566  PCNRITEM pciNext;
     1567
     1568  while (pci) {
     1569    pciNext = (PCNRITEM) pci->rc.preccNextRecord;
     1570    if (FreeCnrItem(hwnd, pci) == -1)
     1571      break;                            // Avoid cascading errors
     1572    pci = pciNext;
     1573  }
     1574}
     1575
     1576/**
     1577 * Remove item(s) from container and free associated storage if requested
     1578 * @returns count of items remaining in container or -1 if error
     1579 */
     1580
     1581INT RemoveCnrItems(HWND hwnd, PCNRITEM pci, USHORT usCnt, USHORT usFlags)
     1582{
     1583  INT remaining;
     1584
    15381585  if (usCnt == 0) {
    1539     if (pci != NULL)
     1586    if (pci != NULL) {
    15401587      Runtime_Error(pszSrcFile, __LINE__, "pci not NULL");
     1588      remaining = -1;
     1589    }
    15411590    else {
    15421591      for (;;) {
    15431592        pci = (PCNRITEM)WinSendMsg(hwnd, CM_QUERYRECORD, MPVOID,
    15441593                                   MPFROM2SHORT(CMA_FIRST, CMA_ITEMORDER));
    1545         if (!pci)
    1546           break;
     1594        if (!pci) {
     1595          remaining = 0;
     1596          break;                        // Done
     1597        }
    15471598        else if ((INT)pci == -1) {
    15481599          Win_Error(hwnd, HWND_DESKTOP, pszSrcFile, __LINE__,"CM_QUERYRECORD");
     1600          remaining = -1;
    15491601          break;
    15501602        }
    1551         else
    1552           RemoveCnrItems(hwnd, pci, 1, usFlags);
    1553       }
    1554     }
    1555   }
    1556   else if (usCnt != 1)
     1603        else {
     1604          remaining = RemoveCnrItems(hwnd, pci, 1, usFlags);
     1605          if (remaining == -1)
     1606            break;
     1607        }
     1608      } // for
     1609    }
     1610  }
     1611  else if (usCnt != 1) {
    15571612    Runtime_Error(pszSrcFile, __LINE__, "count not 1");
     1613    remaining = -1;
     1614  }
    15581615  else {
    15591616    // DbgMsg(pszSrcFile, __LINE__, "RemoveCnrItems %p %u %s", pci, usCnt, pci->pszFileName);
    15601617
    1561     FreeCnrItemData(pci);
    1562 
    1563     if ((INT)WinSendMsg(hwnd, CM_REMOVERECORD, MPFROMP(&pci), MPFROM2SHORT(usCnt, CMA_FREE)) == -1) {
     1618    if (usFlags & CMA_FREE)
     1619      FreeCnrItemData(pci);
     1620
     1621    remaining = (INT)WinSendMsg(hwnd, CM_REMOVERECORD, MPFROMP(&pci), MPFROM2SHORT(usCnt, usFlags));
     1622    if (remaining == -1) {
    15641623      // Win_Error2(hwnd, HWND_DESKTOP, pszSrcFile, __LINE__,IDS_CMREMOVEERRTEXT);
    15651624      Win_Error(hwnd, HWND_DESKTOP, pszSrcFile, __LINE__,"CM_REMOVERECORD hwnd %x pci %p", hwnd, pci);
    15661625    }
    15671626  }
     1627  return remaining;
    15681628}
    15691629
Note: See TracChangeset for help on using the changeset viewer.