home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / WATCH2.ZIP / WATCH.C < prev    next >
Text File  |  1990-08-24  |  25KB  |  788 lines

  1. // WATCH.C
  2.  
  3. // SETUP DEFINES FOR APPROPRIATE INCLUDES FROM OS/2 HEADER FILE...
  4. #define INCL_PM
  5. #define INCL_WIN
  6. #define INCL_DOS
  7. #define INCL_DOSFILEMGR
  8. #define INCL_WINLISTBOXES
  9. #define INCL_WINHOOKS
  10. #define INCL_ERRORS
  11. #define INCL_WINHELP
  12.  
  13. // INDLUDE APPROPRIATE HEADER FILES...
  14. #include <os2.h>
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <process.h>
  18. #include <string.h>
  19. #include "watch.h"
  20.  
  21. // FUNCTION PROTOTYPES...
  22. int main (void);
  23. MRESULT EXPENTRY MainWndProc(HWND hWnd, USHORT msg, MPARAM mp1, MPARAM mp2);
  24. MRESULT EXPENTRY AboutDlgProc(HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2);
  25. MRESULT EXPENTRY LogFileDlgProc(HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2);
  26. static VOID ClearSelector(PSZ szSelectorString);
  27. void FAR PASCAL ClearMainList(HWND hwndListBox);
  28. BOOL OpenLogFile(HWND hwnd);
  29. VOID CloseLogFile(HWND hwnd);
  30. void FAR PASCAL WatchPaint(HWND hwnd);
  31. VOID WriteLogFileEntry(PSZ szSelectorString);
  32. VOID DosSaveConfiguration(HWND hwnd);
  33. VOID DosRestoreConfiguration(VOID);
  34.  
  35. // GLOBAL VARIABLE DEFINITIONS...
  36. BOOL fFirstPass       = TRUE;
  37. BOOL fLogFileOpen     = FALSE;
  38. BOOL fWatchLoadFailed = FALSE;
  39.  
  40. char     szLoadFailed[]     = "Watch/2 Failed to Load, Only One Instance Allowed !";
  41. char     szParentClass[]    = "ParentClass";
  42. char     szTitle[]          = "Watch/2 Debugging Aid";
  43. char     szLogFileSpec[255] = "\\watch.log";
  44. char     szLogFileHold[255] = "\\watch.log";
  45. char     szCfgFileSpec[]    = "watch.cfg";
  46. char     szFileStrOpen[]    = "Open Log File...\tCtrl+L";
  47. char     szFileStrClose[]   = "Close Log File\tCtrl+L";
  48. char     szFontStrLarge[]   = "Large ~Font\tCtrl+F";
  49. char     szFontStrSmall[]   = "Small ~Font\tCtrl+F";
  50.  
  51. char far *szSelectorString;
  52.  
  53. HAB      habMain;
  54.  
  55. HELPINIT hmiHelpData;
  56.  
  57. HFILE    pLogFile;
  58. HFILE    pCfgFile;
  59.  
  60. HMQ      hmqMain;
  61.  
  62. HSYSSEM  hSysSem;
  63.  
  64. HWND     hwndParentFrm;
  65. HWND     hwndParentWnd;
  66. HWND     hwndMainList;
  67. HWND     hwndHelpInstance;
  68.  
  69. int      iNumberInList;
  70.  
  71. SWP      swp;
  72. USHORT   usSelector;
  73. USHORT   usFileAction;
  74. USHORT   usBytesWritten;
  75.  
  76. // MAIN PROCEDURE
  77. int main()
  78. {
  79.   int   iSoundGen;
  80.   QMSG  qmsg;
  81.   ULONG ctlflags;
  82.  
  83.   habMain = WinInitialize((USHORT)NULL);
  84.  
  85.   hmqMain = WinCreateMsgQueue(habMain, 0);
  86.  
  87.   // SET POINTER TO HOURGLASS WHILE LOADING AND INITIALIZING...
  88.   WinSetPointer(HWND_DESKTOP,
  89.                 WinQuerySysPointer(HWND_DESKTOP,
  90.                                    SPTR_WAIT,
  91.                                    FALSE));
  92.  
  93.   if (!WinRegisterClass(habMain,
  94.                         (PCH)szParentClass,
  95.                         (PFNWP)MainWndProc,
  96.                         CS_SIZEREDRAW,
  97.                         0))
  98.      return(0);
  99.  
  100.   // INITIALIZE THE IPF DATA STRUCTURE...
  101.   hmiHelpData.cb                        = sizeof(HELPINIT);
  102.   hmiHelpData.ulReturnCode              = NULL;
  103.   hmiHelpData.pszTutorialName           = NULL;
  104.   hmiHelpData.phtHelpTable              = (PVOID)(0xffff0000 | IDM_WATCHHELPTABLE);
  105.   hmiHelpData.hmodAccelActionBarModule  = NULL;
  106.   hmiHelpData.idAccelTable              = IDM_WATCHMAIN;
  107.   hmiHelpData.idActionBar               = NULL;
  108.   hmiHelpData.pszHelpWindowTitle        = "Help for Watch/2 Debugging Aid";
  109.   hmiHelpData.hmodHelpTableModule       = NULL;
  110.   hmiHelpData.usShowPanelId             = NULL;
  111.   hmiHelpData.pszHelpLibraryName        = "WATCH.HLP"; 
  112.  
  113.   // ESTABLISH THE HELP INSTANCE...
  114.   hwndHelpInstance = WinCreateHelpInstance(habMain, &hmiHelpData);
  115.  
  116.   // INITIALIZE FRAME CONTROL FLAG WITH APPROPRIATE ATTRIBUTES...
  117.   ctlflags = FCF_TITLEBAR      | FCF_SYSMENU  | FCF_BORDER |
  118.              FCF_MINBUTTON     | FCF_MENU     | FCF_ICON   |
  119.              FCF_SHELLPOSITION | FCF_TASKLIST | FCF_ACCELTABLE;
  120.  
  121.   // INITIALIZE AND CREATE THE STANDARD PARENT WINDOW...
  122.   hwndParentFrm = WinCreateStdWindow(HWND_DESKTOP,
  123.                                      WS_SYNCPAINT,
  124.                                      &ctlflags,
  125.                                      (PCH)szParentClass,
  126.                                      NULL,
  127.                                      0L,
  128.                                      (HMODULE)NULL,
  129.                                      IDM_WATCHMAIN,
  130.                                      (HWND FAR *)&hwndParentWnd);
  131.  
  132.   // IF THE LOAD WAS COMPLETED SUCCESSFULLY, SOUND THE TRUMPET, CHANGE
  133.   // THE SIZE OF THE WINDOW AND DISPLAY THE WINDOW AT THE TOP LEFT
  134.   // CORNER OF THE DESKTOP...
  135.   if (!fWatchLoadFailed)
  136.      {
  137.        for (iSoundGen = 0; iSoundGen < 12; iSoundGen++)
  138.            DosBeep(((iSoundGen + 1) * 100), 1);
  139.        WinSetWindowText(hwndParentFrm,
  140.                         (PSZ)&szTitle);
  141.        DosRestoreConfiguration();
  142.        WinSetWindowPos(hwndParentFrm,
  143.                        HWND_TOP,
  144.                        swp.x,
  145.                        swp.y,
  146.                        500,
  147.                        153,
  148.                        SWP_SIZE | SWP_MOVE | SWP_SHOW);
  149.      }
  150.  
  151.   // ASSOCIATE THE HELP INSTANCE WITH THE APPLICATION'S PARENT WINDOW FRAME
  152.   if (hwndHelpInstance)
  153.       WinAssociateHelpInstance(hwndHelpInstance, hwndParentFrm);
  154.  
  155.   // SET POINTER BACK TO NORMAL SYSTEM ARROW POINTER...
  156.   WinSetPointer(HWND_DESKTOP,
  157.                 WinQuerySysPointer(HWND_DESKTOP,
  158.                                    SPTR_ARROW,
  159.                                    FALSE));
  160.  
  161.   // SET UP MESSAGE LOOP...
  162.   while (WinGetMsg(habMain, (PQMSG)&qmsg, (HWND)NULL, 0, 0))
  163.         WinDispatchMsg(habMain, (PQMSG)&qmsg);
  164.  
  165.   // CLEAN UP AND TERMINATE THE APPLICATION...
  166.   if (hwndHelpInstance)
  167.       WinDestroyHelpInstance(hwndHelpInstance);
  168.  
  169.   WinDestroyWindow(hwndParentFrm);
  170.   WinDestroyMsgQueue(hmqMain);
  171.   WinTerminate(habMain);                       
  172. }
  173.  
  174.  
  175.  
  176. // MAIN WINDOW MESSAGE PROCESSING PROCEDURE...
  177. MRESULT EXPENTRY MainWndProc(HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
  178. {
  179.   int iSoundGen;
  180.  
  181.   switch(msg)
  182.   {
  183.     case WM_CREATE:
  184.          if (DosCreateSem(CSEM_PUBLIC,
  185.                           &hSysSem,
  186.                           WATCH_SEMAPHORE))
  187.             {
  188.               DosBeep(300, 300);
  189.               WinMessageBox(HWND_DESKTOP,
  190.                             hwnd,
  191.                             (PCH)&szLoadFailed,
  192.                             (PCH)&szTitle,
  193.                             NULL,
  194.                             MB_OK | MB_ICONEXCLAMATION);
  195.               fWatchLoadFailed = TRUE;
  196.               WinPostMsg(hwnd, WM_QUIT, 0L, 0L);
  197.               break;
  198.             }
  199.          if (DosAllocShrSeg(81,
  200.                             WATCH_SEGMENT,
  201.                             &usSelector))
  202.             {
  203.               DosBeep(300, 300);
  204.               WinMessageBox(HWND_DESKTOP,
  205.                             hwnd,
  206.                             (PCH)&szLoadFailed,
  207.                             (PCH)&szTitle,
  208.                             NULL,
  209.                             MB_OK | MB_ICONEXCLAMATION);
  210.               fWatchLoadFailed = TRUE;
  211.               WinPostMsg(hwnd, WM_QUIT, 0L, 0L);
  212.               break;
  213.             }
  214.          // ALLOCATE THE SELECTOR STRING AND CLEAR IT IN PREPARATION
  215.          // FOR LOGGING...
  216.          szSelectorString = (char far *)((unsigned long)usSelector << 16);
  217.          ClearSelector(szSelectorString);
  218.          hwndMainList = WinCreateWindow(hwnd,
  219.                                         WC_LISTBOX,
  220.                                         "",
  221.                                         WS_SYNCPAINT,
  222.                                         0, 0, 0, 0,
  223.                                         hwnd,
  224.                                         HWND_TOP,
  225.                                         IDM_WATCHLIST,
  226.                                         NULL,
  227.                                         0);
  228.          // BROADCAST A NOTIFICATION TO ALL APPLICATIONS THAT WE
  229.          // ARE HERE AND READY TO RECEIVE MESSAGES FOR LOGGING...
  230.          WinBroadcastMsg(hwnd,
  231.                          WATCH_RECEIVE_HANDLE,
  232.                          MPFROMHWND(hwnd),
  233.                          0L,
  234.                          BMSG_FRAMEONLY | BMSG_POSTQUEUE);
  235.          return WinDefWindowProc(hwnd, msg, mp1, mp2);
  236.          break;
  237.     case WM_COMMAND:
  238.          switch(SHORT1FROMMP(mp1))
  239.          {
  240.            case IDM_WATCHCLEARMSGAREA:
  241.                 ClearMainList(hwndMainList);
  242.                 break;
  243.            case IDM_WATCHLOGTOFILE:
  244.                 if (!fLogFileOpen)
  245.                    WinDlgBox(HWND_DESKTOP,
  246.                              hwnd,
  247.                              (PFNWP)LogFileDlgProc,
  248.                              (HMODULE)NULL,
  249.                              IDM_WATCHLOGFILEDLG,
  250.                              NULL);
  251.                 else
  252.                    {
  253.                      CloseLogFile(hwnd);
  254.                    }
  255.                 break;
  256.            case IDM_WATCHTRUNCATEFILE:
  257.                 DosBufReset(pLogFile);
  258.                 DosClose(pLogFile);
  259.                 DosOpen((PSZ)szLogFileSpec,
  260.                         &pLogFile,
  261.                         &usFileAction,
  262.                         0L,
  263.                         0,
  264.                         0x12,
  265.                         0x41,
  266.                         0L);
  267.                 ClearMainList(hwndMainList);
  268.                 break;
  269.            case IDM_WATCHEXIT:
  270.                 WinPostMsg(hwnd, WATCH_PREPARE_SHUTDOWN, 0L, 0L);
  271.                 break;
  272.            case IDM_WATCHRESUME:
  273.                 break;
  274.            case IDM_WATCHABOUT:
  275.                 WinDlgBox(HWND_DESKTOP,
  276.                           hwnd,
  277.                           (PFNWP)AboutDlgProc,
  278.                           (HMODULE)NULL,
  279.                           IDM_WATCHABOUTDLG,
  280.                           NULL);
  281.                 break;
  282.            case IDM_CLIENTINSTALL:
  283.                 if (hwndHelpInstance)
  284.                     WinSendMsg(hwndHelpInstance,
  285.                                HM_DISPLAY_HELP,
  286.                                MPFROMP((MPARAM)IDM_CLIENTINSTALL_ALT),
  287.                                MPFROMSHORT((SHORT)HM_RESOURCEID));
  288.                 break;
  289.            case IDM_WATCHHELPFORHELP:
  290.                 if (hwndHelpInstance)
  291.                     WinSendMsg(hwndHelpInstance,
  292.                                HM_DISPLAY_HELP,
  293.                                0L,
  294.                                0L);
  295.                 break;
  296.            default:
  297.                 return WinDefWindowProc(hwnd, msg, mp1, mp2);
  298.                 break;
  299.          }
  300.          break;
  301.     case WM_PAINT:
  302.          WatchPaint(hwnd);
  303.          break;
  304.     case WM_ERASEBACKGROUND:
  305.          return(TRUE);
  306.          break;
  307.     case WM_CLOSE:
  308.          WinPostMsg(hwnd, WATCH_PREPARE_SHUTDOWN, 0L, 0L);
  309.          break;
  310.     case WATCH_REQUEST_HANDLE:
  311.          WinPostMsg(HWNDFROMMP(mp1),
  312.                     WATCH_RECEIVE_HANDLE,
  313.                     MPFROMHWND(hwnd),
  314.                     0L);
  315.          break;
  316.     case WATCH_REQUEST_ACTION:
  317.          szSelectorString[80] = '\0';
  318.          WinSendMsg(hwndMainList,
  319.                     LM_INSERTITEM,
  320.                     (MPARAM)-1L,
  321.                     (MPARAM)(PCH)szSelectorString);
  322.          WinSendMsg(hwndMainList,
  323.                     LM_SELECTITEM,
  324.                     (MPARAM)(iNumberInList - 1),
  325.                     (MPARAM)FALSE);
  326.          WinSendMsg(hwndMainList,
  327.                     LM_SELECTITEM,
  328.                     (MPARAM)iNumberInList++,
  329.                     (MPARAM)TRUE);
  330.          WinSendMsg(hwndMainList,
  331.                     LM_SETTOPINDEX,
  332.                     (MPARAM)(iNumberInList - 1),
  333.                     (MPARAM)TRUE);
  334.          if (fLogFileOpen)
  335.             {
  336.               szSelectorString[80] = '\0';
  337.               WriteLogFileEntry(szSelectorString);
  338.             }
  339.          ClearSelector(szSelectorString);
  340.          break;
  341.     case WATCH_PREPARE_SHUTDOWN:
  342.          DosCloseSem(hSysSem);
  343.          if (DosCreateSem(CSEM_PUBLIC,
  344.                           &hSysSem,
  345.                           WATCH_SEMAPHORE))
  346.             {
  347.               DosBeep(300, 300);
  348.               WinMessageBox(HWND_DESKTOP,
  349.                             hwnd,
  350.                             (PCH)"Cannot Shut Down while Clients remain Attached !",
  351.                             (PCH)&szTitle,
  352.                             NULL,
  353.                             MB_OK | MB_ICONEXCLAMATION);
  354.               DosOpenSem(&hSysSem, WATCH_SEMAPHORE);
  355.             }
  356.          else
  357.             {
  358.               DosFreeSeg(usSelector);
  359.               if (fLogFileOpen)
  360.                  {
  361.                    DosBufReset(pLogFile);
  362.                    DosClose(pLogFile);
  363.                  }
  364.               for (iSoundGen = 12; iSoundGen > 0; iSoundGen--)
  365.                   DosBeep(((iSoundGen - 1) * 100), 1);
  366.               WinPostMsg(hwnd, WM_QUIT, 0L, 0L);
  367.             }
  368.          DosSaveConfiguration(hwndParentFrm); 
  369.          break;
  370.     case HM_QUERY_KEYS_HELP:
  371.          return((MRESULT)IDM_WATCHKEYSHELP_ALT);
  372.          break;
  373.     case HM_ERROR:
  374.          if ((hwndHelpInstance && (ULONG)mp1) == HMERR_NO_MEMORY)
  375.             {
  376.               WinMessageBox(HWND_DESKTOP,
  377.                             HWND_DESKTOP,
  378.                             (PSZ)"Help Terminated due to Memory Allocation Error!",
  379.                             (PSZ)"Help Aborted",
  380.                             1,
  381.                             MB_OK | MB_APPLMODAL | MB_MOVEABLE);
  382.               WinDestroyHelpInstance(hwndHelpInstance);
  383.               break;
  384.             }
  385.          break;
  386.     default:
  387.          return WinDefWindowProc(hwnd, msg, mp1, mp2);
  388.          break;
  389.   }
  390.   return FALSE;
  391. }
  392.  
  393.  
  394.  
  395. // WINDOW PAINT PROCEDURE...
  396. void far PASCAL WatchPaint(HWND hwnd)
  397. {
  398.   HPS    hps;
  399.   RECTL  rectl;
  400.  
  401.   // IF THIS IS THE FIRST TIME THIS ROUTINE IS CALLED, SET UP THE
  402.   // LISTBOX USED FOR LOGGING MAIN DISPLAY OF MESSAGES...
  403.   if (fFirstPass)
  404.      {
  405.        WinQueryWindowRect(hwnd, &rectl);
  406.        WinSetWindowPos(hwndMainList,
  407.                        HWND_TOP,
  408.                        (SHORT)(rectl.xLeft),
  409.                        (SHORT)(rectl.yBottom),
  410.                        (SHORT)(rectl.xRight),
  411.                        (SHORT)(rectl.yTop),
  412.                        SWP_SIZE | SWP_MOVE | SWP_SHOW);
  413.        ClearMainList(hwndMainList);
  414.        fFirstPass = FALSE;
  415.      }
  416.  
  417.   // PAINT THE WINDOW AND LISTBOX...
  418.   hps = WinBeginPaint(hwnd, (HPS)NULL, (PWRECT)NULL);
  419.   GpiErase(hps);
  420.   WinEndPaint(hps);
  421. }
  422.  
  423.  
  424.  
  425. // CLEAR MAIN LIST BOX PROCEDURE...
  426. void far PASCAL ClearMainList(HWND hwndListBox)
  427. {
  428.   iNumberInList = 0;
  429.  
  430.   // DELETE ALL ITEMS CURRENTLY IN THE LIST BUFFER...
  431.   WinSendMsg(hwndListBox,
  432.              LM_DELETEALL,
  433.              (MPARAM)-1L,
  434.              (MPARAM)0L);
  435.  
  436.   // ADD THE BEGINNING OF LOG ITEM AS THE SOLE LISTBOX ITEM AND 
  437.   // SELECT IT...
  438.   WinSendMsg(hwndListBox,
  439.              LM_INSERTITEM,
  440.              (MPARAM)-1L,
  441.              (MPARAM)(PCH)"Beginning of Log...");
  442.   WinSendMsg(hwndListBox,
  443.              LM_SELECTITEM,
  444.              (MPARAM)iNumberInList++,
  445.              (MPARAM)TRUE);
  446. }
  447.  
  448.  
  449.  
  450.  
  451. // CLEAR SELECTOR STRING PROCEDURE...
  452. static VOID ClearSelector(PSZ szSelectorString)
  453. {
  454.   int iSelectorIndex;
  455.  
  456.   for (iSelectorIndex = 0; iSelectorIndex < 80; iSelectorIndex++)
  457.        szSelectorString[iSelectorIndex] = ' ';
  458. }
  459.  
  460.  
  461.  
  462. // DIALOG PROCESSING PROCEDURE FOR THE ABOUT DIALOG...
  463. MRESULT EXPENTRY AboutDlgProc(HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
  464. {
  465.   switch(msg)
  466.   {
  467.     case WM_COMMAND:
  468.          switch(SHORT1FROMMP(mp1))
  469.          {
  470.            case DID_OK:
  471.            case IDM_WATCHABOUT_OK:
  472.                 WinDismissDlg(hwnd, TRUE);
  473.                 break;
  474.            default:
  475.                 return(FALSE);
  476.                 break;
  477.          }
  478.     default:
  479.          return WinDefDlgProc(hwnd, msg, mp1, mp2);
  480.   }
  481.   return(FALSE);
  482. }
  483.  
  484.  
  485.  
  486. // DIALOG PROCESSING FOR THE LOG FILE DIALOG...
  487. MRESULT EXPENTRY LogFileDlgProc(HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
  488. {
  489.   switch(msg)
  490.   {
  491.     case WM_INITDLG:
  492.          // SAVE THE PREVIOUS FILE SPECIFICATION FOR POSSIBLE RESTORE...
  493.          strncpy(szLogFileHold, szLogFileSpec, 255);
  494.  
  495.          //SETUP THE INITIAL FILE SPECIFICATION GOING INTO THE DIALOG...
  496.          WinSendDlgItemMsg(hwnd,
  497.                            IDM_WATCHLOGFILENAME,
  498.                            EM_SETTEXTLIMIT,
  499.                            MPFROMSHORT(254),
  500.                            (MPARAM)NULL);
  501.          WinSetDlgItemText(hwnd,
  502.                            IDM_WATCHLOGFILENAME,
  503.                            (PSZ)szLogFileSpec);
  504.          break;
  505.     case WM_COMMAND:
  506.          switch(SHORT1FROMMP(mp1))
  507.          {
  508.            case IDM_WATCHLOGFILE_OK:
  509.                 if (!OpenLogFile(hwnd))
  510.                    WinMessageBox(HWND_DESKTOP,
  511.                                  hwnd,
  512.                                  (PCH)"DOS File Error encountered, File Not Opened......",
  513.                                  (PCH)"Dos File Error!",
  514.                                  NULL,
  515.                                  MB_OK | MB_ICONEXCLAMATION);
  516.                 else
  517.                    WinDismissDlg(hwnd, TRUE);
  518.                 break;
  519.  
  520.            // IF CANCEL IS SELECTED, RESTORE THE FILE NAME TO IT'S CONTENT
  521.            // TO WHAT IS WAS BEFORE CHOOSING THE OPEN LOG FILE OPTION FROM
  522.            // THE MENU AND RELEASE THE DIALOG...
  523.            case IDM_WATCHLOGFILE_CANCEL:
  524.                 strncpy(szLogFileSpec, szLogFileHold, 255);
  525.                 WinDismissDlg(hwnd, TRUE);
  526.                 break;
  527.          }
  528.          break;
  529.     default:
  530.       return WinDefDlgProc(hwnd, msg, mp1, mp2);
  531.   }
  532.   return FALSE;
  533. }
  534.  
  535.  
  536.  
  537. // OPEN DOS LOGGING FILE...
  538. BOOL OpenLogFile(HWND hwnd)
  539. {
  540.   MENUITEM miTemp;
  541.   HWND     hwndMenu;
  542.   int      iNumberOfListItems = 1;
  543.   SHORT    sItemID;
  544.   ULONG    ulEndOfFilePointer;
  545.   ULONG    ulBegOfFilePointer;
  546.   ULONG    ulRecords;
  547.   ULONG    ulCurrentRecord;
  548.   USHORT   usBytesRead;
  549.  
  550.   // GET THE LOG FILE NAME FROM THE DIALOG ID...
  551.   WinQueryDlgItemText(hwnd,
  552.                       IDM_WATCHLOGFILENAME,
  553.                       (USHORT)254,
  554.                       (PSZ)&szLogFileSpec);
  555.  
  556.   // ATTEMPT TO OPEN THE APPROPRIATE FILE...
  557.   if (DosOpen((PSZ)szLogFileSpec,
  558.               &pLogFile,
  559.               &usFileAction,
  560.               0L,
  561.               0,
  562.               0x11,
  563.               0x42,
  564.               0L))
  565.       return FALSE;
  566.   fLogFileOpen = TRUE;
  567.   // WE ARE NOW SUCCESSFULLY OPEN...
  568.   ClearMainList(hwndMainList);
  569.   ClearSelector(szSelectorString);
  570.   // IF FILE ALREADY EXISTED, READ THE CURRENT INFORMATION AND PLACE
  571.   // INTO LIST BOX...
  572.   DosChgFilePtr(pLogFile,
  573.                 0L,
  574.                 (USHORT)2,
  575.                 &ulEndOfFilePointer);
  576.   if (ulEndOfFilePointer != 0)
  577.      {
  578.      ClearMainList(hwndMainList);
  579.      DosChgFilePtr(pLogFile,
  580.                    0L,
  581.                    (USHORT)0,
  582.                    &ulBegOfFilePointer);
  583.      ulRecords = ulEndOfFilePointer / (ULONG)82;
  584.      for (ulCurrentRecord = 1; ulCurrentRecord <= ulRecords; ulCurrentRecord++)
  585.          {
  586.          // READ A SINGLE MESSAGE...
  587.          DosRead(pLogFile,
  588.                  (char far *)szSelectorString,
  589.                  (USHORT)80,
  590.                  &usBytesRead);
  591.          // ENSURE THE MESSAGE STRING IS NULL TERMINATED AND ADD THE 
  592.          // MESSAGE STRING AS AN ITEM IN THE LIST BOX...
  593.          szSelectorString[80] = '\0';
  594.          WinSendMsg(hwndMainList,
  595.                     LM_INSERTITEM,
  596.                     (MPARAM)-1L,
  597.                     (MPARAM)(PCH)szSelectorString);
  598.          WinSendMsg(hwndMainList,
  599.                     LM_SELECTITEM,
  600.                     (MPARAM)(iNumberInList - 1),
  601.                     (MPARAM)FALSE);
  602.          WinSendMsg(hwndMainList,
  603.                     LM_SELECTITEM,
  604.                     (MPARAM)iNumberInList++,
  605.                     (MPARAM)TRUE);
  606.          WinSendMsg(hwndMainList,
  607.                     LM_SETTOPINDEX,
  608.                     (MPARAM)(iNumberInList - 1),
  609.                     (MPARAM)TRUE);
  610.          // READ THE CARRIAGE RETURN AND LINE FEED TO ESTABLISH PROPER
  611.          // POSITION FOR NEXT MESSAGE...
  612.          DosRead(pLogFile,
  613.                  (char far *)szSelectorString,
  614.                  (USHORT)2,
  615.                  &usBytesRead);
  616.          }
  617.      }
  618.   
  619.   ClearSelector(szSelectorString);
  620.  
  621.   // ESTABLISH ADDRESSABILITY TO THE OPTIONS MENU SO IT CAN BE MODIFIED...
  622.   hwndMenu = WinWindowFromID(hwndParentFrm, FID_MENU);
  623.   WinSendMsg(hwndMenu,
  624.              MM_QUERYITEM,
  625.              MPFROM2SHORT(IDM_WATCHOPTIONS, FALSE),
  626.              MPFROMP((PSZ)&miTemp));
  627.   hwndMenu = miTemp.hwndSubMenu;
  628.   sItemID  = (SHORT)WinSendMsg(hwndMenu,
  629.                                MM_ITEMIDFROMPOSITION,
  630.                                MPFROMSHORT(1),
  631.                                (MPARAM)NULL);
  632.  
  633.   // RESET THE TEXT OF THE OPEN LOG FILE MENU TO READ CLOSE INSTEAD...
  634.   WinSendMsg(hwndMenu,
  635.              MM_SETITEMTEXT,
  636.              MPFROMSHORT(sItemID),
  637.              (MPARAM)(PSZ)&szFileStrClose);
  638.  
  639.   // ESTABLISH ADDRESSABILITY AND RESET THE ATTRIBUTES OF THE TRUNCATE OPTION...
  640.   sItemID  = (SHORT)WinSendMsg(hwndMenu,
  641.                                MM_ITEMIDFROMPOSITION,
  642.                                MPFROMSHORT(2),
  643.                                (MPARAM)NULL);
  644.   WinSendMsg(hwndMenu,
  645.              MM_SETITEMATTR,
  646.              MPFROM2SHORT(sItemID, FALSE),
  647.              MPFROM2SHORT(MIA_DISABLED, !MIA_DISABLED));
  648.  
  649.   return TRUE;
  650. }
  651.  
  652.  
  653. // WRITE THE LOG MESSAGE RECEIVED FROM THE CLIENT APPLICATION TO THE
  654. // DOS LOGGING FILE...
  655. VOID WriteLogFileEntry(PSZ szSelectorString)
  656. {
  657.   // ENSURE THE MESSAGE STRING IS NULL TERMINATED...
  658.   szSelectorString[80] = '\0';
  659.  
  660.   // WRITE THE ACTUAL STRING TO THE FILE...
  661.   DosWrite(pLogFile,
  662.            (char far *)szSelectorString,
  663.            (USHORT)80,
  664.            &usBytesWritten);
  665.  
  666.   // ADD A CARRIAGE RETURN AND LINE FEED TO THE DATA WRITTEN...
  667.   DosWrite(pLogFile,
  668.            (char far *)"\r\n",
  669.            (USHORT)2,
  670.            &usBytesWritten);
  671.   return;
  672. }
  673.  
  674.  
  675.  
  676.  
  677. // CLOSE DOS LOGGING FILE...
  678. VOID CloseLogFile(HWND hwnd)
  679. {
  680.   MENUITEM miTemp;
  681.   HWND     hwndMenu;
  682.   SHORT    sItemID;
  683.  
  684.   // FLUSH THE FILE BUFFERS, CLOSE THE FILE, AND SET THE FLAG TO
  685.   // INDICATE THAT NO LOGGING FILE IS CURRENTLY OPEN...
  686.   DosBufReset(pLogFile);
  687.   DosClose(pLogFile);
  688.   fLogFileOpen = FALSE;
  689.  
  690.   // ESTABLISH ADDRESSABILITY TO THE OPTIONS MENU SO IT CAN BE MODIFIED...
  691.   hwndMenu = WinWindowFromID(hwndParentFrm, FID_MENU);
  692.   WinSendMsg(hwndMenu,
  693.              MM_QUERYITEM,
  694.              MPFROM2SHORT(IDM_WATCHOPTIONS, FALSE),
  695.              MPFROMP((PSZ)&miTemp));
  696.   hwndMenu = miTemp.hwndSubMenu;
  697.   sItemID  = (SHORT)WinSendMsg(hwndMenu,
  698.                                MM_ITEMIDFROMPOSITION,
  699.                                MPFROMSHORT(1),
  700.                                (MPARAM)NULL);
  701.  
  702.   // RESET THE TEXT OF THE CLOSE LOG FILE MENU TO READ OPEN INSTEAD...
  703.   WinSendMsg(hwndMenu,
  704.              MM_SETITEMTEXT,
  705.              MPFROMSHORT(sItemID),
  706.              (MPARAM)(PSZ)&szFileStrOpen);
  707.  
  708.   // ESTABLISH ADDRESSABILITY AND RESET THE ATTRIBUTES OF THE TRUNCATE OPTION...
  709.   sItemID  = (SHORT)WinSendMsg(hwndMenu,
  710.                                MM_ITEMIDFROMPOSITION,
  711.                                MPFROMSHORT(2),
  712.                                (MPARAM)NULL);
  713.   WinSendMsg(hwndMenu,
  714.              MM_SETITEMATTR,
  715.              MPFROM2SHORT(sItemID, FALSE),
  716.              MPFROM2SHORT(MIA_DISABLED, MIA_DISABLED));
  717.  
  718.   return;
  719. }
  720.  
  721.  
  722. // SAVE THE CURRENT POSITION OF THE PARENT FRAME AND THE CURRENT LOG
  723. // FILE NAME... 
  724. VOID DosSaveConfiguration(HWND hwnd)
  725. {
  726.   USHORT usBytesWritten;
  727.  
  728.   WinQueryWindowPos(hwnd, &swp);
  729.   DosOpen((PSZ)szCfgFileSpec,
  730.           &pCfgFile,
  731.           &usFileAction,
  732.           0L,
  733.           0,
  734.           0x12,
  735.           0x41,
  736.           0L);
  737.   DosWrite(pCfgFile,
  738.            &swp.x,
  739.            2,
  740.            &usBytesWritten);
  741.   DosWrite(pCfgFile,
  742.            &swp.y,
  743.            2,
  744.            &usBytesWritten);
  745.   DosWrite(pCfgFile,
  746.            &szLogFileSpec,
  747.            255,
  748.            &usBytesWritten);
  749.   DosClose(pCfgFile);
  750.   return;
  751. }
  752.  
  753.  
  754. // INITIALIZE THE WINDOW POSITION AND THE FILE NAME LAST USED...
  755. VOID DosRestoreConfiguration()
  756. {
  757.   USHORT usBytesRead;
  758.  
  759.   if (DosOpen((PSZ)szCfgFileSpec,
  760.                &pCfgFile,
  761.                &usFileAction,
  762.                0L,
  763.                0,
  764.                0x01,
  765.                0x40,
  766.                0L))
  767.      {
  768.      swp.x = 10;
  769.      swp.y = 10;
  770.      return;
  771.      }
  772.   DosRead(pCfgFile,
  773.           &swp.x,
  774.           2,
  775.           &usBytesRead);
  776.   DosRead(pCfgFile,
  777.           &swp.y,
  778.           2,
  779.           &usBytesRead);
  780.   DosRead(pCfgFile,
  781.           &szLogFileSpec,
  782.           255,
  783.           &usBytesRead);
  784.   return;
  785. }
  786.  
  787. // END OF WATCH.C
  788.