Annotation of mstools/samples/sdktools/perfmon/logoptns.c, revision 1.1

1.1     ! root        1:  
        !             2: //==========================================================================//
        !             3: //                                  Includes                                //
        !             4: //==========================================================================//
        !             5: 
        !             6: 
        !             7: #include "perfmon.h"       // basic defns, windows.h
        !             8: #include "logoptns.h"      // external declarations for this file
        !             9: 
        !            10: #include "dlgs.h"          // common dialog control IDs
        !            11: #include "log.h"           // for StartLog, SetLogTimer, CloseLog
        !            12: #include "fileutil.h"      // file utilities
        !            13: #include "utils.h"         // various utilities
        !            14: #include "playback.h"      // for PlayingBackLog
        !            15: #include "pmhelpid.h"      // Help IDs
        !            16: 
        !            17: 
        !            18: 
        !            19: //==========================================================================//
        !            20: //                                Local Data                                //
        !            21: //==========================================================================//
        !            22: 
        !            23: 
        !            24: DWORD          iIntervalMSecs ;
        !            25: BOOL           bNeedToRelogData ;
        !            26: BOOL           bNeedToStartLog ;
        !            27: BOOL           bNeedToSetTimer ;
        !            28: 
        !            29: static BOOL    LocalManualRefresh ;
        !            30: static BOOL    bStopButtonClicked ;
        !            31: extern HWND    hWndLogEntries ;
        !            32: 
        !            33: // This is a counter that is init. to 0.  It is incremened by 1
        !            34: // when the user clikc the cancel button.
        !            35: // It is set to -1 when we sent the cancell msg internally.
        !            36: int            bCancelled ;
        !            37: TCHAR          szmsgFILEOK[] = FILEOKSTRING ;
        !            38: DWORD          msgFILEOK ;
        !            39: 
        !            40: //==========================================================================//
        !            41: //                                   Macros                                 //
        !            42: //==========================================================================//
        !            43: 
        !            44: 
        !            45: #define LogOptionsOFNStyle                      \
        !            46:    (OFN_ENABLETEMPLATE | OFN_HIDEREADONLY |     \
        !            47:     OFN_SHOWHELP | OFN_ENABLEHOOK)
        !            48: 
        !            49: 
        !            50: 
        !            51: //==========================================================================//
        !            52: //                              Local Functions                             //
        !            53: //==========================================================================//
        !            54: 
        !            55: void EnableFileControls (HDLG hDlg, BOOL bEnable)
        !            56:    {
        !            57:    DialogEnable (hDlg, stc3, bEnable) ;
        !            58:    DialogEnable (hDlg, lst1, bEnable) ;
        !            59:    DialogEnable (hDlg, stc1, bEnable) ;
        !            60:    DialogEnable (hDlg, lst2, bEnable) ;
        !            61:    DialogEnable (hDlg, stc2, bEnable) ;
        !            62:    DialogEnable (hDlg, cmb1, bEnable) ;
        !            63:    DialogEnable (hDlg, stc4, bEnable) ;
        !            64:    DialogEnable (hDlg, cmb2, bEnable) ;
        !            65:    DialogEnable (hDlg, edt1, bEnable) ;
        !            66:    }
        !            67: 
        !            68: 
        !            69: //==========================================================================//
        !            70: //                              Message Handlers                            //
        !            71: //==========================================================================//
        !            72: 
        !            73: 
        !            74: void static OnInitDialog (HDLG hDlg)
        !            75:    {
        !            76:    PLOG           pLog ;
        !            77:    int            i ;
        !            78:    BOOL           DisplayManualRefresh ;
        !            79:    pLog = LogData (hWndLog) ;
        !            80: 
        !            81:    if (msgFILEOK == 0)
        !            82:       {
        !            83:       msgFILEOK = RegisterWindowMessage(szmsgFILEOK);
        !            84:       }
        !            85: 
        !            86:    bCancelled = 0 ;
        !            87: 
        !            88:    switch (pLog->iStatus)
        !            89:       {  // switch
        !            90:       case iPMStatusClosed:
        !            91: //         DialogEnable (hDlg, IDD_LOGOPTPAUSE, FALSE) ;
        !            92:          break ;
        !            93: 
        !            94:       case iPMStatusPaused:
        !            95:          EnableFileControls (hDlg, FALSE) ;
        !            96:          DialogSetText (hDlg, IDD_LOGOPTSTART, IDS_STOP) ;
        !            97: //         DialogSetText (hDlg, IDD_LOGOPTPAUSE, IDS_RESUME) ;
        !            98:          break ;
        !            99: 
        !           100:       case iPMStatusCollecting:
        !           101:          EnableFileControls (hDlg, FALSE) ;
        !           102:          DialogSetText (hDlg, IDD_LOGOPTSTART, IDS_STOP) ;
        !           103:          break ;
        !           104:       }  // switch
        !           105: 
        !           106:    for (i = 0 ;
        !           107:         i < NumIntervals ;
        !           108:         i++)
        !           109:       CBAddInt (DialogControl (hDlg, IDD_LOGOPTINTERVAL), aiIntervals [i]) ;
        !           110:    DialogSetInterval (hDlg, IDD_LOGOPTINTERVAL, pLog->iIntervalMSecs) ;
        !           111:    iIntervalMSecs = pLog->iIntervalMSecs ;
        !           112: 
        !           113:    LocalManualRefresh = pLog->bManualRefresh ;
        !           114:    DisplayManualRefresh = TRUE ;
        !           115: 
        !           116:    if (PlayingBackLog ())
        !           117:       {
        !           118:       DialogSetText (hDlg, IDD_LOGOPTSTART, IDS_CREATELOGFILE) ;
        !           119:       DisplayManualRefresh = FALSE ;
        !           120:       }
        !           121:    
        !           122:    if (LBNumItems (hWndLogEntries) == 0)
        !           123:       {
        !           124:       DialogEnable (hDlg, IDD_LOGOPTSTART, FALSE) ;
        !           125: //      DialogEnable (hDlg, IDD_LOGOPTPAUSE, FALSE) ;
        !           126:       }
        !           127: 
        !           128:    if (DisplayManualRefresh)
        !           129:       {
        !           130:       if (LocalManualRefresh)
        !           131:          {
        !           132:          DialogEnable (hDlg, IDD_LOGOPTINTERVAL, FALSE) ;
        !           133:          DialogEnable (hDlg, IDD_LOGOPTINTERVALTEXT, FALSE) ;
        !           134:          }
        !           135: 
        !           136:       CheckRadioButton (hDlg,
        !           137:          IDD_LOGOPTIONSMANUALREFRESH,
        !           138:          IDD_LOGOPTIONSPERIODIC,
        !           139:          LocalManualRefresh ? IDD_LOGOPTIONSMANUALREFRESH : 
        !           140:          IDD_LOGOPTIONSPERIODIC) ;
        !           141:       }
        !           142:    else
        !           143:       {
        !           144:       DialogEnable (hDlg, IDD_LOGOPTIONSMANUALREFRESH, FALSE) ;
        !           145:       CheckRadioButton (hDlg,
        !           146:          IDD_LOGOPTIONSMANUALREFRESH,
        !           147:          IDD_LOGOPTIONSPERIODIC,
        !           148:          IDD_LOGOPTIONSPERIODIC) ;
        !           149:       }
        !           150:    
        !           151: 
        !           152:    dwCurrentDlgID = HC_PM_idDlgOptionLog ;
        !           153:    
        !           154:    WindowCenter (hDlg) ;
        !           155:    }  // OnInitDialog
        !           156: 
        !           157: 
        !           158: void OnStart (HDLG hDlg)
        !           159: /*
        !           160:    Effect:        Handle any actions necessary when the user clicks on
        !           161:                   the "Start/Stop" button.
        !           162: 
        !           163:    Note:          This button could be displaying start or stop, depending
        !           164:                   on the situation.
        !           165: */     
        !           166:    {
        !           167:    PLOG           pLog ;
        !           168: 
        !           169:    pLog = LogData (hDlg) ;
        !           170:   
        !           171:    bStopButtonClicked = FALSE ;
        !           172:    switch (pLog->iStatus)
        !           173:       {  // switch
        !           174:       case iPMStatusClosed:
        !           175:          if (PlayingBackLog ())
        !           176:             {
        !           177:             bNeedToRelogData = TRUE ;
        !           178:             }
        !           179:          else
        !           180:             {
        !           181:             FLOAT eTimeInterval ;
        !           182: 
        !           183:             eTimeInterval = DialogFloat (hDlg, IDD_LOGOPTINTERVAL, NULL) ;
        !           184:             if (eTimeInterval > MAX_INTERVALSEC ||
        !           185:                 eTimeInterval < MIN_INTERVALSEC)
        !           186:                {
        !           187:                DlgErrorBox (hDlg, ERR_BADTIMEINTERVAL) ;
        !           188:                SetFocus (DialogControl (hDlg, IDD_LOGOPTINTERVAL)) ;
        !           189:                EditSetTextEndPos (hDlg, IDD_LOGOPTINTERVAL) ;
        !           190:                return ;
        !           191:                break ;
        !           192:                }
        !           193: 
        !           194:             eTimeInterval = eTimeInterval * (FLOAT) 1000.0 + (FLOAT) 0.5 ;
        !           195:             pLog->iIntervalMSecs = (DWORD) eTimeInterval ;
        !           196: 
        !           197:             iIntervalMSecs = pLog->iIntervalMSecs ;
        !           198:             bNeedToStartLog = TRUE ;
        !           199:             }
        !           200:          break ;
        !           201: 
        !           202:       case iPMStatusCollecting:
        !           203:       case iPMStatusPaused:
        !           204:          CloseLog (hWndLog, pLog) ;
        !           205:          bStopButtonClicked = TRUE ;
        !           206:          break ;
        !           207:       }  // switch
        !           208: 
        !           209: 
        !           210:    SimulateButtonPush (hDlg, IDD_OK) ;
        !           211:    }
        !           212: 
        !           213: 
        !           214: BOOL static OnOK (HDLG hDlg)
        !           215: /*
        !           216:    Effect:        Perform any hooked actions needed when the user selects
        !           217:                   OK in the log options dialog. In particular, if we are
        !           218:                   currently logging, record the need to relog and CANCEL 
        !           219:                   the dialog, never letting the real dialog proc get the
        !           220:                   OK. Remember, this is actually a file open dialog that
        !           221:                   we have perverted. If we let the OK through, the common
        !           222:                   dialog manager will try to open it and it will inform
        !           223:                   the user that the file is locked. This way, we let the
        !           224:                   user click OK, but the dialog thinks we cancelled.
        !           225: 
        !           226:    Called By:     LogOptionsHookProc only.
        !           227: 
        !           228:    Returns:       Whether the message was handled by this function or not.
        !           229: */
        !           230:    {  // OnOK
        !           231:    PLOG           pLog ;
        !           232: 
        !           233:    pLog = LogData (hWndLog) ;
        !           234:    if (pLog->iStatus == iPMStatusCollecting ||  
        !           235:        pLog->iStatus == iPMStatusPaused)
        !           236:       {
        !           237:       if (LocalManualRefresh != pLog->bManualRefresh)
        !           238:          {
        !           239:          if (!LocalManualRefresh)
        !           240:             {
        !           241:             FLOAT eTimeInterval ;
        !           242: 
        !           243:             eTimeInterval = DialogFloat (hDlg, IDD_LOGOPTINTERVAL, NULL) ;
        !           244: 
        !           245:             if (eTimeInterval > MAX_INTERVALSEC ||
        !           246:                 eTimeInterval < MIN_INTERVALSEC)
        !           247:                {
        !           248:                DlgErrorBox (hDlg, ERR_BADTIMEINTERVAL) ;
        !           249:                SetFocus (DialogControl (hDlg, IDD_LOGOPTINTERVAL)) ;
        !           250:                EditSetTextEndPos (hDlg, IDD_LOGOPTINTERVAL) ;
        !           251:                return (FALSE) ;
        !           252:                }
        !           253: 
        !           254:             eTimeInterval = eTimeInterval * (FLOAT) 1000.0 + (FLOAT) 0.5 ;
        !           255:             pLog->iIntervalMSecs = (DWORD) eTimeInterval ;
        !           256:             iIntervalMSecs = pLog->iIntervalMSecs ;
        !           257:             UpdateLogDisplay (hWndLog) ;
        !           258:             }
        !           259:          ToggleLogRefresh (hWndLog) ;
        !           260:          }
        !           261:       else
        !           262:          {
        !           263:          bNeedToSetTimer = TRUE ;
        !           264:          bCancelled = -1 ;
        !           265:          }
        !           266:       SimulateButtonPush (hDlg, IDD_CANCEL) ;
        !           267:       return TRUE ;
        !           268:       }
        !           269:    else
        !           270:       {
        !           271:       if (!LocalManualRefresh)
        !           272:          {
        !           273:          FLOAT eTimeInterval ;
        !           274: 
        !           275:          eTimeInterval = DialogFloat (hDlg, IDD_LOGOPTINTERVAL, NULL) ;
        !           276: 
        !           277:          if (eTimeInterval > MAX_INTERVALSEC ||
        !           278:              eTimeInterval < MIN_INTERVALSEC)
        !           279:             {
        !           280:             DlgErrorBox (hDlg, ERR_BADTIMEINTERVAL) ;
        !           281:             SetFocus (DialogControl (hDlg, IDD_LOGOPTINTERVAL)) ;
        !           282:             EditSetTextEndPos (hDlg, IDD_LOGOPTINTERVAL) ;
        !           283:             return (TRUE) ;
        !           284:             }
        !           285:          }
        !           286:       }
        !           287:       return FALSE ;
        !           288:    }  // OnOK
        !           289: 
        !           290: 
        !           291:          
        !           292: void OnPause (HDLG hDlg)
        !           293:    {
        !           294:    }
        !           295: 
        !           296: 
        !           297: 
        !           298: BOOL APIENTRY LogOptionsHookProc (HWND hDlg, 
        !           299:                                   UINT iMessage, 
        !           300:                                   WPARAM wParam, 
        !           301:                                   LPARAM lParam)
        !           302:    {
        !           303:    BOOL           bHandled ;
        !           304: 
        !           305:    bHandled = TRUE ;
        !           306: 
        !           307:    if (iMessage == msgFILEOK)
        !           308:       {
        !           309:       bHandled = OnOK (hDlg) ;
        !           310:       return (bHandled) ;
        !           311:       }
        !           312: 
        !           313:    switch (iMessage)
        !           314:       {
        !           315:       case WM_INITDIALOG:
        !           316:          OnInitDialog (hDlg) ;
        !           317:          break ;
        !           318: 
        !           319:       case WM_DESTROY:
        !           320: 
        !           321:          {
        !           322:          FLOAT eTimeInterval ;
        !           323: 
        !           324:          if (!bCancelled)
        !           325:             {
        !           326:             eTimeInterval = DialogFloat (hDlg, IDD_LOGOPTINTERVAL, NULL) ;
        !           327:             if (eTimeInterval > MAX_INTERVALSEC ||
        !           328:                 eTimeInterval < MIN_INTERVALSEC)
        !           329:                {
        !           330:                DlgErrorBox (hDlg, ERR_BADTIMEINTERVAL) ;
        !           331:                }
        !           332:             else
        !           333:                {
        !           334:                eTimeInterval = eTimeInterval * (FLOAT) 1000.0 + (FLOAT) 0.5 ;
        !           335:                iIntervalMSecs = (DWORD) eTimeInterval ;
        !           336:                }
        !           337:             }
        !           338: 
        !           339:          dwCurrentDlgID = 0 ;
        !           340:          bHandled = FALSE ;
        !           341:          }
        !           342:          break ;
        !           343: 
        !           344:       case WM_COMMAND:
        !           345:          switch (wParam)
        !           346:             {  // switch
        !           347:             case IDD_LOGOPTSTART:
        !           348:                OnStart (hDlg) ;
        !           349:                break ;
        !           350: 
        !           351:             case IDD_LOGOPTPAUSE:
        !           352:                OnPause (hDlg) ;
        !           353:                break ;
        !           354: 
        !           355:             case IDD_OK:
        !           356:                bHandled = OnOK (hDlg) ;
        !           357:                break ;
        !           358: 
        !           359:             case IDD_CANCEL:
        !           360:                bCancelled += 1 ;
        !           361:                bHandled = FALSE ;
        !           362:                break ;
        !           363: 
        !           364:             case IDD_LOGOPTIONSPERIODIC:
        !           365:                if (PlayingBackLog())
        !           366:                   {
        !           367:                   break ;
        !           368:                   }
        !           369:                // else fall thru to the following case...
        !           370:             case IDD_LOGOPTIONSMANUALREFRESH:
        !           371:                // check if the Manual refresh is currently checked.
        !           372:                // Then toggle the ManualRefresh button
        !           373:                LocalManualRefresh =
        !           374:                   IsDlgButtonChecked (hDlg, IDD_LOGOPTIONSMANUALREFRESH) ;
        !           375:                CheckRadioButton (hDlg,
        !           376:                   IDD_LOGOPTIONSMANUALREFRESH,
        !           377:                   IDD_LOGOPTIONSPERIODIC,
        !           378:                   LocalManualRefresh ? IDD_LOGOPTIONSPERIODIC :
        !           379:                   IDD_LOGOPTIONSMANUALREFRESH) ;
        !           380: 
        !           381:                DialogEnable (hDlg, IDD_LOGOPTINTERVAL, LocalManualRefresh) ;
        !           382:                DialogEnable (hDlg, IDD_LOGOPTINTERVALTEXT, LocalManualRefresh) ;
        !           383:                LocalManualRefresh = !LocalManualRefresh ;
        !           384:                break ;
        !           385: 
        !           386:             case ID_HELP:
        !           387:                CallWinHelp (dwCurrentDlgID) ;
        !           388:                break ;
        !           389: 
        !           390:             default:
        !           391:                bHandled = FALSE ;
        !           392:                break ;
        !           393:             }  // switch
        !           394:          break;
        !           395: 
        !           396:       default:
        !           397:          bHandled = FALSE ;
        !           398:          break;            
        !           399:       }  // switch
        !           400: 
        !           401:    return (bHandled) ;
        !           402:    }  // LogOptionsHookProc
        !           403: 
        !           404: 
        !           405: BOOL DisplayLogOptions (HWND hWndParent,
        !           406:                         HWND hWndLog)
        !           407: 
        !           408:    {  // DisplayLogOptions
        !           409:    TCHAR          szFilePath [FilePathLen + 1] ;
        !           410:    TCHAR          szFileTitle [FilePathLen + 1] ;
        !           411:    TCHAR          szFileDirectory [FilePathLen + 1] ;
        !           412:    TCHAR          szCaption [WindowCaptionLen + 1] ;
        !           413:    OPENFILENAME   ofn ;
        !           414:    PLOG           pLog ;
        !           415:    int            RetCode ;
        !           416:    int            PrevLogSize ;
        !           417:    BOOL           bSameFile ;
        !           418: 
        !           419:    TCHAR szFilter[LongTextLen] ;
        !           420:    int   StringLength ;
        !           421: 
        !           422:    StringLoad (IDS_SAVELOGFILE, szFilter) ;
        !           423:    StringLength = lstrlen (szFilter) + 1 ;
        !           424:    LoadString (hInstance, IDS_SAVELOGFILEEXT,
        !           425:       &szFilter[StringLength], sizeof(szFilter)-StringLength) ;
        !           426:    StringLength += lstrlen (&szFilter[StringLength]) ;
        !           427:    szFilter[StringLength+1] = szFilter[StringLength+2] = TEXT('\0') ;
        !           428: 
        !           429:    // This dialog is used to change attributes for an existing log file,
        !           430:    // and to select the name of a log file to open. Therefore we have 
        !           431:    // different options in these cases.
        !           432: 
        !           433:    pLog = LogData (hWndLog) ;
        !           434:    if (!strempty (pLog->szFilePath))
        !           435:       {
        !           436:       FileNameExtension (pLog->szFilePath, szFileTitle) ;
        !           437:       FileDriveDirectory (pLog->szFilePath, szFileDirectory) ;
        !           438:       lstrcpy (szFilePath, szFileTitle) ;
        !           439:       }
        !           440:    else
        !           441:       {
        !           442:       szFileTitle[0] = szFileDirectory[0] = TEXT('\0') ;
        !           443:       StringLoad (IDS_SAVELOGFILEEXT, szFilePath) ;
        !           444:       }
        !           445: 
        !           446:    StringLoad (IDS_LOGOPTIONS, szCaption) ;
        !           447: 
        !           448:    ofn.lStructSize = sizeof(OPENFILENAME) ; 
        !           449:    ofn.hwndOwner = hWndParent ;
        !           450:    ofn.hInstance = hInstance ;
        !           451:    ofn.lpstrFilter = szFilter;
        !           452:    ofn.lpstrCustomFilter = (LPTSTR) NULL;
        !           453:    ofn.nMaxCustFilter = 0L;
        !           454:    ofn.nFilterIndex = 1L;
        !           455:    ofn.lpstrFile = szFilePath ;
        !           456:    ofn.nMaxFile = FilePathLen ;
        !           457:    ofn.lpstrFileTitle = szFileTitle ;
        !           458:    ofn.nMaxFileTitle = FilePathLen ;
        !           459:    ofn.lpstrInitialDir = szFileDirectory ;
        !           460:    ofn.lpstrTitle = (LPTSTR) szCaption ;
        !           461:    ofn.Flags = LogOptionsOFNStyle  ;
        !           462:    ofn.nFileOffset = 0;
        !           463:    ofn.nFileExtension = 0;
        !           464:    ofn.lpstrDefExt = (LPTSTR) NULL;
        !           465:    ofn.lpfnHook = (LPOFNHOOKPROC) LogOptionsHookProc ;
        !           466:    ofn.lpTemplateName = idDlgLogOptions ;
        !           467: 
        !           468:    bNeedToRelogData = FALSE;
        !           469:    bNeedToStartLog = FALSE ;
        !           470:    bNeedToSetTimer = FALSE ;
        !           471:    bStopButtonClicked = FALSE ;
        !           472: 
        !           473:    if (GetSaveFileName(&ofn) && !bStopButtonClicked)
        !           474:       {
        !           475:       pLog = LogData (hWndLog) ;
        !           476: 
        !           477:       // save previous log file name & size
        !           478:       // so we can reset if error 
        !           479:       PrevLogSize = pLog->lFileSize ;
        !           480:       
        !           481:       lstrcpy (szFileTitle, pLog->szFilePath) ;
        !           482: 
        !           483:       bSameFile = pstrsamei (pLog->szFilePath, ofn.lpstrFile) ;
        !           484: 
        !           485:       if (!bSameFile)
        !           486:          {
        !           487:          lstrcpy (pLog->szFilePath, ofn.lpstrFile) ;
        !           488:          }
        !           489: 
        !           490:       pLog->iIntervalMSecs = iIntervalMSecs ;
        !           491:       
        !           492:       if (bNeedToStartLog)
        !           493:          {
        !           494:          pLog->bManualRefresh = LocalManualRefresh ;
        !           495:          StartLog (hWndLog, pLog, bSameFile) ;
        !           496:          }
        !           497:       else if (bNeedToRelogData)
        !           498:          {
        !           499:          bNeedToRelogData = FALSE ;
        !           500:          SetHourglassCursor() ;
        !           501:          ReLog (hWndLog, bSameFile) ;
        !           502:          SetArrowCursor() ;
        !           503:          }
        !           504:       else if (LocalManualRefresh != pLog->bManualRefresh)
        !           505:          {
        !           506:          ToggleLogRefresh (hWndLog) ;
        !           507:          }
        !           508: 
        !           509:       if (!pLog->hFile)
        !           510:          {
        !           511:          if (bNeedToStartLog)
        !           512:             {
        !           513:             // if we get here, that means StartLog has detected
        !           514:             // problem, just restore the old stuff..
        !           515:             pLog->lFileSize = PrevLogSize ;
        !           516:             lstrcpy (pLog->szFilePath, szFileTitle) ;
        !           517:             }
        !           518:          // verify if this is a good log file and setup the file size
        !           519:          else if ((RetCode = CreateLogFile (pLog, FALSE, bSameFile)) != 0)
        !           520:             {
        !           521:             DlgErrorBox (hWndLog, RetCode, pLog->szFilePath);
        !           522:             pLog->lFileSize = PrevLogSize ;
        !           523:             lstrcpy (pLog->szFilePath, szFileTitle) ;
        !           524:             }
        !           525:          else
        !           526:             {
        !           527:             // unfortunately, we have to close this file.
        !           528:             // Otherwise, when we do StartLog, the common dialog
        !           529:             // will complain that this file is already in-used.
        !           530:             CloseHandle (pLog->hFile) ;
        !           531:             }
        !           532:          pLog->hFile = 0 ;
        !           533:          }
        !           534: 
        !           535:       UpdateLogDisplay (hWndLog) ;
        !           536:       }
        !           537: 
        !           538: 
        !           539:    // Remember, we faked out GetSaveFileName to return FALSE. See OnOK doc.
        !           540:    if (bNeedToSetTimer)
        !           541:       {
        !           542:       SetLogTimer (hWndLog, iIntervalMSecs) ;
        !           543:       UpdateLogDisplay (hWndLog) ;
        !           544:       }
        !           545: 
        !           546:    return (TRUE) ;
        !           547:    }  // DisplayLogOptions
        !           548: 
        !           549: 
        !           550: 
        !           551: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.