Changeset 1335 for trunk/dll/objcnr.c


Ignore:
Timestamp:
Dec 13, 2008, 12:49:02 AM (17 years ago)
Author:
Steven Levine
Message:

Ticket 26: Add exception handlers to all threads using xbeginthread

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/dll/objcnr.c

    r1225 r1335  
    77
    88  Copyright (c) 1993-98 M. Kimes
    9   Copyright (c) 2005, 2007 Steven H. Levine
     9  Copyright (c) 2005, 2008 Steven H. Levine
    1010
    1111  24 May 05 SHL Rework for CNRITEM.szSubject
     
    2222  14 Aug 07 SHL Revert ProcessDir DosSleep to 0
    2323  29 Feb 08 GKY Use xfree where appropriate
     24  10 Dec 08 SHL Integrate exception handler support
    2425
    2526***********************************************************************/
     
    2829#include <string.h>
    2930#include <ctype.h>
    30 #include <process.h>                    // _beginthread
     31// #include <process.h>                 // _beginthread
    3132
    3233#define INCL_DOS
     
    5354#include "misc.h"                       // PostMsg
    5455#include "fortify.h"
     56#include "excputil.h"                   // xbeginthread
    5557
    5658typedef struct
     
    7880
    7981static VOID ProcessDir(HWND hwndCnr,
    80                        CHAR *filename,
    81                        PCNRITEM pciParent,
    82                        CHAR *stopflag)
     82                       CHAR *filename,
     83                       PCNRITEM pciParent,
     84                       CHAR *stopflag)
    8385{
    8486  CHAR maskstr[CCHMAXPATH], *endpath, *p;
     
    104106  ulFindCnt = 1;
    105107  rc = xDosFindFirst(filename, &hdir,
    106                      FILE_NORMAL | FILE_READONLY | FILE_ARCHIVED |
    107                      FILE_SYSTEM | FILE_HIDDEN | MUST_HAVE_DIRECTORY,
    108                      pffbArray, ulBufBytes, &ulFindCnt, FIL_STANDARDL);
     108                     FILE_NORMAL | FILE_READONLY | FILE_ARCHIVED |
     109                     FILE_SYSTEM | FILE_HIDDEN | MUST_HAVE_DIRECTORY,
     110                     pffbArray, ulBufBytes, &ulFindCnt, FIL_STANDARDL);
    109111  if (!rc)
    110112    DosFindClose(hdir);
     
    115117  if ((!rc && (pffbArray->attrFile & FILE_DIRECTORY))) {
    116118    pciP = WinSendMsg(hwndCnr,
    117                       CM_ALLOCRECORD,
    118                       MPFROMLONG(EXTRA_RECORD_BYTES),
    119                       MPFROMLONG(1));
     119                      CM_ALLOCRECORD,
     120                      MPFROMLONG(EXTRA_RECORD_BYTES),
     121                      MPFROMLONG(1));
    120122    if (!pciP) {
    121123      Win_Error(hwndCnr, HWND_DESKTOP, pszSrcFile, __LINE__, "CM_ALLOCRECORD");
     
    132134      p = strrchr(pciP->pszFileName, '\\');
    133135      if (!p)
    134         pciP->pszDisplayName = pciP->pszFileName;
     136        pciP->pszDisplayName = pciP->pszFileName;
    135137      else if (*(p + 1))
    136         p++;
     138        p++;
    137139      pciP->pszDisplayName = p;
    138140    }
     
    147149    free(pffbArray);
    148150    Dos_Error(MB_ENTER, rc, HWND_DESKTOP, pszSrcFile, __LINE__,
    149               GetPString(IDS_CANTFINDDIRTEXT), filename);
     151              GetPString(IDS_CANTFINDDIRTEXT), filename);
    150152    return;
    151153  }
     
    177179  ulFindCnt = ulFindMax;
    178180  rc = xDosFindFirst(maskstr, &hdir,
    179                      FILE_NORMAL | FILE_READONLY | FILE_ARCHIVED |
    180                      FILE_SYSTEM | FILE_HIDDEN | MUST_HAVE_DIRECTORY,
    181                      pffbArray, ulBufBytes, &ulFindCnt, FIL_STANDARDL);
     181                     FILE_NORMAL | FILE_READONLY | FILE_ARCHIVED |
     182                     FILE_SYSTEM | FILE_HIDDEN | MUST_HAVE_DIRECTORY,
     183                     pffbArray, ulBufBytes, &ulFindCnt, FIL_STANDARDL);
    182184  if (!rc) {
    183185    PFILEFINDBUF3L pffbFile;
     
    187189      pffbFile = pffbArray;
    188190      for (x = 0; x < ulFindCnt; x++) {
    189         if (*stopflag)
    190           break;
    191         if ((pffbFile->attrFile & FILE_DIRECTORY) &&
    192             // Skip . and ..
    193             (pffbFile->achName[0] != '.' ||
    194              (pffbFile->achName[1] &&
    195               (pffbFile->achName[1] != '.' || pffbFile->achName[2])))) {
    196           strcpy(endpath, pffbFile->achName);
    197           ProcessDir(hwndCnr, maskstr, pciP, stopflag);
    198         }
    199         if (!pffbFile->oNextEntryOffset)
    200           break;
    201         pffbFile = (PFILEFINDBUF3L)((PBYTE)pffbFile + pffbFile->oNextEntryOffset);
     191        if (*stopflag)
     192          break;
     193        if ((pffbFile->attrFile & FILE_DIRECTORY) &&
     194            // Skip . and ..
     195            (pffbFile->achName[0] != '.' ||
     196             (pffbFile->achName[1] &&
     197              (pffbFile->achName[1] != '.' || pffbFile->achName[2])))) {
     198          strcpy(endpath, pffbFile->achName);
     199          ProcessDir(hwndCnr, maskstr, pciP, stopflag);
     200        }
     201        if (!pffbFile->oNextEntryOffset)
     202          break;
     203        pffbFile = (PFILEFINDBUF3L)((PBYTE)pffbFile + pffbFile->oNextEntryOffset);
    202204      } // for
    203205      DosSleep(0);                      // Let's others at same priority get some work done
    204206      if (*stopflag)
    205         break;
     207        break;
    206208      ulFindCnt = ulFindMax;
    207209      rc = xDosFindNext(hdir, pffbArray, ulBufBytes, &ulFindCnt, FIL_STANDARDL);
     
    212214  if (rc && rc != ERROR_NO_MORE_FILES) {
    213215    Dos_Error(MB_ENTER, rc, HWND_DESKTOP, pszSrcFile, __LINE__,
    214               GetPString(IDS_CANTFINDDIRTEXT), filename);
     216              GetPString(IDS_CANTFINDDIRTEXT), filename);
    215217  }
    216218
    217219  free(pffbArray);
    218220  WinSendMsg(hwndCnr, CM_INVALIDATERECORD, MPFROMP(&pciP),
    219              MPFROM2SHORT(1, 0));
     221             MPFROM2SHORT(1, 0));
    220222}
    221223
     
    242244      WinCancelShutdown(hmq, TRUE);
    243245      ProcessDir(dirsize->hwndCnr, dirsize->filename, (PCNRITEM) NULL,
    244                 dirsize->stopflag);
     246                dirsize->stopflag);
    245247      DosPostEventSem(CompactSem);
    246248      WinDestroyMsgQueue(hmq);
     
    249251  }
    250252  PostMsg(WinQueryWindow(dirsize->hwndCnr, QW_PARENT), UM_CONTAINER_FILLED,
    251           MPVOID, MPVOID);
     253          MPVOID, MPVOID);
    252254  free(dirsize);
    253255# ifdef FORTIFY
     
    265267      Runtime_Error(pszSrcFile, __LINE__, "objcnrwnd set");
    266268      WinSetWindowPos(objcnrwnd, HWND_TOP, 0, 0, 0, 0,
    267                       SWP_RESTORE | SWP_SHOW | SWP_ACTIVATE | SWP_ZORDER);
     269                      SWP_RESTORE | SWP_SHOW | SWP_ACTIVATE | SWP_ZORDER);
    268270      WinDismissDlg(hwnd, 0);
    269271      break;
     
    291293      dirsize = xmalloc(sizeof(DIRSIZE), pszSrcFile, __LINE__);
    292294      if (!dirsize) {
    293         WinDismissDlg(hwnd, 0);
    294         break;
     295        WinDismissDlg(hwnd, 0);
     296        break;
    295297      }
    296298      dirsize->stopflag = (CHAR *)&data->stopflag;
    297299      dirsize->filename = data->dirname;
    298300      dirsize->hwndCnr = WinWindowFromID(hwnd, OBJCNR_CNR);
    299       if (_beginthread(FillCnrsThread, NULL, 65536 * 8, (PVOID) dirsize) ==
    300           -1) {
    301         Runtime_Error(pszSrcFile, __LINE__,
    302                       GetPString(IDS_COULDNTSTARTTHREADTEXT));
    303         free(dirsize);
     301      if (xbeginthread(FillCnrsThread,
     302                       65536 * 8,
     303                       dirsize,
     304                       pszSrcFile,
     305                       __LINE__) == -1)
     306      {
     307        free(dirsize);
    304308#       ifdef FORTIFY
    305         Fortify_LeaveScope();
     309        Fortify_LeaveScope();
    306310#        endif
    307         WinDismissDlg(hwnd, 0);
    308         break;
     311        WinDismissDlg(hwnd, 0);
     312        break;
    309313      }
    310314      else
    311         data->working = TRUE;
     315        data->working = TRUE;
    312316    }
    313317    PostMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
     
    322326      cnri.cb = sizeof(CNRINFO);
    323327      WinSendDlgItemMsg(hwnd, OBJCNR_CNR, CM_QUERYCNRINFO,
    324                         MPFROMP(&cnri), MPFROMLONG(sizeof(CNRINFO)));
     328                        MPFROMP(&cnri), MPFROMLONG(sizeof(CNRINFO)));
    325329      cnri.cyLineSpacing = 0;
    326330      cnri.cxTreeIndent = 12L;
    327331      cnri.pszCnrTitle = GetPString(IDS_WORKINGTEXT);
    328332      cnri.flWindowAttr = CV_TREE | CV_FLOW |
    329         CA_CONTAINERTITLE | CA_TITLESEPARATOR | CA_TREELINE;
     333        CA_CONTAINERTITLE | CA_TITLESEPARATOR | CA_TREELINE;
    330334      if (WinQueryWindowUShort(hwnd, QWS_ID) == QTREE_FRAME)
    331         cnri.flWindowAttr |= CV_MINI;
     335        cnri.flWindowAttr |= CV_MINI;
    332336      WinSendDlgItemMsg(hwnd, OBJCNR_CNR, CM_SETCNRINFO, MPFROMP(&cnri),
    333                         MPFROMLONG(CMA_FLWINDOWATTR | CMA_LINESPACING |
    334                                    CMA_CXTREEINDENT));
     337                        MPFROMLONG(CMA_FLWINDOWATTR | CMA_LINESPACING |
     338                                   CMA_CXTREEINDENT));
    335339    }
    336340    return 0;
     
    340344//      WinEnableWindowUpdate(WinWindowFromID(hwnd,OBJCNR_CNR),TRUE);
    341345    WinSendDlgItemMsg(hwnd, OBJCNR_CNR, CM_INVALIDATERECORD, MPVOID,
    342                       MPFROM2SHORT(0, CMA_ERASE | CMA_INVALIDATE));
     346                      MPFROM2SHORT(0, CMA_ERASE | CMA_INVALIDATE));
    343347    data = INSTDATA(hwnd);
    344348    if (data) {
    345349      data->working = FALSE;
    346350      if (data->dying)
    347         WinDismissDlg(hwnd, 0);
     351        WinDismissDlg(hwnd, 0);
    348352      {
    349         PCNRITEM pci;
    350         USHORT id;
    351 
    352         id = WinQueryWindowUShort(hwnd, QWS_ID);
    353         pci = (PCNRITEM) WinSendDlgItemMsg(hwnd, OBJCNR_CNR,
    354                                            CM_QUERYRECORD,
    355                                            MPVOID,
    356                                            MPFROM2SHORT(CMA_FIRST,
    357                                                         CMA_ITEMORDER));
    358         if (pci && (INT) pci != -1) {
    359           ExpandAll(WinWindowFromID(hwnd, OBJCNR_CNR), TRUE, pci);
    360           if (id == QTREE_FRAME)
    361             pci = (PCNRITEM) WinSendDlgItemMsg(hwnd, OBJCNR_CNR,
    362                                                CM_QUERYRECORD,
    363                                                MPFROMP(pci),
    364                                                MPFROM2SHORT(CMA_FIRSTCHILD,
    365                                                             CMA_ITEMORDER));
    366         }
    367         if ((!pci || (INT) pci == -1) && id == QTREE_FRAME) {
    368           Notify(GetPString(IDS_NODIRSUNDERTEXT));
    369           WinDismissDlg(hwnd, 0);
    370           break;
    371         }
     353        PCNRITEM pci;
     354        USHORT id;
     355
     356        id = WinQueryWindowUShort(hwnd, QWS_ID);
     357        pci = (PCNRITEM) WinSendDlgItemMsg(hwnd, OBJCNR_CNR,
     358                                           CM_QUERYRECORD,
     359                                           MPVOID,
     360                                           MPFROM2SHORT(CMA_FIRST,
     361                                                        CMA_ITEMORDER));
     362        if (pci && (INT) pci != -1) {
     363          ExpandAll(WinWindowFromID(hwnd, OBJCNR_CNR), TRUE, pci);
     364          if (id == QTREE_FRAME)
     365            pci = (PCNRITEM) WinSendDlgItemMsg(hwnd, OBJCNR_CNR,
     366                                               CM_QUERYRECORD,
     367                                               MPFROMP(pci),
     368                                               MPFROM2SHORT(CMA_FIRSTCHILD,
     369                                                            CMA_ITEMORDER));
     370        }
     371        if ((!pci || (INT) pci == -1) && id == QTREE_FRAME) {
     372          Notify(GetPString(IDS_NODIRSUNDERTEXT));
     373          WinDismissDlg(hwnd, 0);
     374          break;
     375        }
    372376      }
    373377    }
     
    379383      if (SHORT2FROMMP(mp1) == CN_ENTER) {
    380384
    381         PCNRITEM pci = (PCNRITEM) ((PNOTIFYRECORDENTER) mp2)->pRecord;
    382 
    383         if (pci && (INT) pci != -1)
    384           WinSendDlgItemMsg(hwnd, DID_OK, BM_CLICK, MPVOID, MPVOID);
     385        PCNRITEM pci = (PCNRITEM) ((PNOTIFYRECORDENTER) mp2)->pRecord;
     386
     387        if (pci && (INT) pci != -1)
     388          WinSendDlgItemMsg(hwnd, DID_OK, BM_CLICK, MPVOID, MPVOID);
    385389      }
    386390      break;
     
    393397      if (hwndHelp) {
    394398
    395         USHORT id;
    396 
    397         id = WinQueryWindowUShort(hwnd, QWS_ID);
    398 
    399         if (id == QTREE_FRAME)
    400           WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
    401                      MPFROM2SHORT(HELP_QUICKTREE, 0),
    402                      MPFROMSHORT(HM_RESOURCEID));
    403         else
    404           WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
    405                      MPFROM2SHORT(HELP_OBJECTPATH, 0),
    406                      MPFROMSHORT(HM_RESOURCEID));
     399        USHORT id;
     400
     401        id = WinQueryWindowUShort(hwnd, QWS_ID);
     402
     403        if (id == QTREE_FRAME)
     404          WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
     405                     MPFROM2SHORT(HELP_QUICKTREE, 0),
     406                     MPFROMSHORT(HM_RESOURCEID));
     407        else
     408          WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
     409                     MPFROM2SHORT(HELP_OBJECTPATH, 0),
     410                     MPFROMSHORT(HM_RESOURCEID));
    407411      }
    408412      break;
     
    413417      if (data) {
    414418
    415         PCNRITEM pci;
    416 
    417         if (data->working) {
    418           Runtime_Error(pszSrcFile, __LINE__, "working unexpected");
    419           break;
    420         }
    421         if (SHORT1FROMMP(mp1) == OBJCNR_DESKTOP) {
    422           WinDismissDlg(hwnd, 2);
    423           break;
    424         }
    425         pci = (PCNRITEM) WinSendDlgItemMsg(hwnd, OBJCNR_CNR,
    426                                            CM_QUERYRECORDEMPHASIS,
    427                                            MPFROMLONG(CMA_FIRST),
    428                                            MPFROMSHORT(CRA_CURSORED));
    429         if (pci && (INT) pci != -1)
    430           strcpy(data->dirname, pci->pszFileName);
    431         WinDismissDlg(hwnd, 1);
     419        PCNRITEM pci;
     420
     421        if (data->working) {
     422          Runtime_Error(pszSrcFile, __LINE__, "working unexpected");
     423          break;
     424        }
     425        if (SHORT1FROMMP(mp1) == OBJCNR_DESKTOP) {
     426          WinDismissDlg(hwnd, 2);
     427          break;
     428        }
     429        pci = (PCNRITEM) WinSendDlgItemMsg(hwnd, OBJCNR_CNR,
     430                                           CM_QUERYRECORDEMPHASIS,
     431                                           MPFROMLONG(CMA_FIRST),
     432                                           MPFROMSHORT(CRA_CURSORED));
     433        if (pci && (INT) pci != -1)
     434          strcpy(data->dirname, pci->pszFileName);
     435        WinDismissDlg(hwnd, 1);
    432436      }
    433437      break;
     
    436440      data = INSTDATA(hwnd);
    437441      if (data) {
    438         if (data->working) {
    439           data->dying = (CHAR)TRUE;
    440           data->stopflag = (CHAR)0xff;
    441           break;
    442         }
    443         WinDismissDlg(hwnd, 0);
     442        if (data->working) {
     443          data->dying = (CHAR)TRUE;
     444          data->stopflag = (CHAR)0xff;
     445          break;
     446        }
     447        WinDismissDlg(hwnd, 0);
    444448      }
    445449      break;
Note: See TracChangeset for help on using the changeset viewer.