home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: OtherApp / OtherApp.zip / PHONEAT4.ZIP / PHONEAT4.MOD < prev    next >
Text File  |  1992-08-13  |  30KB  |  606 lines

  1. MODULE PhoneAt4;
  2.  
  3.  
  4. (*# call(same_ds => off) *)
  5. (*# data(heap_size=> 3000) *)
  6. (*# data(stack_size=> 8192) *)
  7.  
  8.  
  9. IMPORT Dos, Str, Lib, Process, OS2DEF, Win, Gpi, Vio, IO, FIO;
  10.  
  11. FROM OS2IO  IMPORT In, Out;
  12.  
  13. FROM OS2DEF IMPORT HDC, HRGN, HAB, HPS, HBITMAP, HWND, HMODULE, HSEM,
  14.                    POINTL, RECTL, PID, TID, LSET, NULL,
  15.                    COLOR, NullVar, NullStr, BOOL;
  16.  
  17.  
  18. TYPE
  19.   PhoneRec      = RECORD
  20.                     Name        : ARRAY [1..40] OF CHAR;
  21.                     Number      : ARRAY [1..40] OF CHAR;
  22.                     Voice       : BOOLEAN;
  23.                     Reserv      : ARRAY [1..943] OF CHAR;
  24.                   END;
  25.  
  26.  
  27. CONST
  28.   WindowId       = 1;
  29.   ClassName      = 'PhoneAtt';
  30.   Fname          = 'PHONEATT.DIR';
  31.  
  32.   ID_RESOURCE    =   1;
  33.   TID_DIAL       =   1;
  34.   MNU_DIAL       =  10;
  35.  
  36.   DLG_PHONEPOP   = 100;
  37.   DLG_PHONEBOOK  = 200;
  38.   DLG_ENTRY      = 300;
  39.   DLG_DIAL       = 400;
  40.   LIS_PHONEBOOK  = 201;
  41.   BUT_DIAL       = 202;
  42.   BUT_ADD        = 203;
  43.   BUT_DELETE     = 204;
  44.   BUT_CANCEL     = 205;
  45.   BUT_CHANGE     = 206;
  46.   BUT_OK         = 305;
  47.   ENT_NAME       = 303;
  48.   ENT_PHONE      = 304;
  49.   BUT_VOICE      = 306;
  50.   BUT_DATA       = 307;
  51.  
  52.   TXT_TEXT       = 401;
  53.  
  54.  
  55. (*# save,
  56.     data(volatile => on) *)
  57.  
  58.  
  59. VAR
  60.   Hab            : HAB;
  61.   IOAdr          : CARDINAL;
  62.   WinRect        : RECTL;
  63.   Client         : HWND;
  64.   Frame          : HWND;
  65.   Popping        : BOOLEAN;
  66.   PhoneVar       : PhoneRec;
  67.  
  68. (*# restore *)
  69.  
  70.   TmpStr         : ARRAY [1..10] OF CHAR;
  71.   OK             : BOOLEAN;
  72.  
  73.  
  74. PROCEDURE PlayTone(Ch : CHAR; Len : CHAR; Tempo : CARDINAL);
  75.   VAR
  76.     Duration    : CARDINAL;
  77.   BEGIN
  78.     Duration := (ORD(Len) - 48) * Tempo;
  79.     CASE Ch OF
  80.       | 'p' : Dos.Sleep(LONGCARD(Duration));          (* pause *)
  81.       | 'a' : Dos.Beep(220, Duration);
  82.       | 'b' : Dos.Beep(233, Duration);
  83.       | 'h' : Dos.Beep(247, Duration);
  84.       | 'c' : Dos.Beep(262, Duration);
  85.       | 'd' : Dos.Beep(294, Duration);
  86.       | '4' : Dos.Beep(311, Duration);      (* bE *)
  87.       | 'e' : Dos.Beep(330, Duration);
  88.       | 'f' : Dos.Beep(349, Duration);
  89.       | 'g' : Dos.Beep(392, Duration);
  90.       | 'A' : Dos.Beep(440, Duration);
  91.       | 'B' : Dos.Beep(466, Duration);
  92.       | 'H' : Dos.Beep(494, Duration);
  93.       | 'C' : Dos.Beep(523, Duration);
  94.       | '2' : Dos.Beep(554, Duration);      (* #C *)
  95.       | 'D' : Dos.Beep(587, Duration);
  96.       | '3' : Dos.Beep(622, Duration);      (* #D *)
  97.       | 'E' : Dos.Beep(659, Duration);
  98.       | 'F' : Dos.Beep(698, Duration);
  99.       | 'G' : Dos.Beep(784, Duration);
  100.       | '1' : Dos.Beep(932, Duration);      (* Högt B *)
  101.  
  102.     END;
  103.   END PlayTone;
  104.  
  105.  
  106. PROCEDURE Melody;
  107.   CONST
  108.     BeetViol    = 'CpgCEGpHpC';
  109.     BeetViolLen = '1142211111';
  110.   VAR
  111.     Count       : CARDINAL;
  112.   BEGIN
  113.     FOR Count := 1 TO Str.Length(BeetViol) DO
  114.       PlayTone(BeetViol[Count], BeetViolLen[Count], 133);
  115.     END;
  116.   END Melody;
  117.  
  118.  
  119. PROCEDURE ScanModem;
  120.   VAR
  121.     Count          : CARDINAL;
  122.     Sts            : SHORTCARD;
  123.     PopMode        : CARDINAL;
  124.     Temp           : CARDINAL;
  125.     InfoSeg        : CARDINAL;
  126.     LInfoSeg       : CARDINAL;
  127.     CurrentSession : POINTER TO SHORTCARD;
  128.   BEGIN
  129.     Dos.GetInfoSeg(InfoSeg,LInfoSeg);
  130.     CurrentSession := [InfoSeg:24];
  131.     LOOP
  132.       Out(IOAdr + 4, SHORTCARD({0,1,3}));
  133.       FOR Count := 1 TO 100 DO
  134.         Sts := In(IOAdr + 6);
  135.         IF (6 IN BITSET(Sts)) AND (Sts <> 0) AND (Sts <> 255) AND (NOT Popping) THEN
  136.           IF CurrentSession^ <> 1 THEN
  137.             Temp := 0;
  138.             IF Vio.PopUp(Temp, 0) = 0 THEN
  139.               IO.WrStr('╔═══════════════════════╗');   IO.WrLn;
  140.               IO.WrStr('║ The phone is ringing! ║');   IO.WrLn;
  141.               IO.WrStr('╚═══════════════════════╝');   IO.WrLn;
  142.               Melody;
  143.               IO.WrStr('Press any key to exit...');
  144.               Sts := 0;
  145.               WHILE (Sts < 100) AND (NOT IO.KeyPressed()) DO
  146.                 Dos.Sleep(100);
  147.                 INC(Sts);
  148.               END;
  149.               Vio.EndPopUp(0);
  150.             END;
  151.           ELSE
  152.             Win.PostMsg(Client,Win.WM_USER,0,0);
  153.             Melody;
  154.           END;
  155.         END;
  156.         Dos.Sleep(100);
  157.       END;
  158.     END;
  159.   END ScanModem;
  160.  
  161.  
  162. PROCEDURE SendStr(Txt : ARRAY OF CHAR);
  163.   VAR
  164.     Count       : CARDINAL;
  165.   BEGIN
  166.     IF Str.Length(Txt) > 0 THEN
  167.       FOR Count := 0 TO Str.Length(Txt) - 1 DO
  168.         Out(IOAdr, SHORTCARD(ORD(Txt[Count])));
  169.         Dos.Sleep(100);
  170.       END;
  171.     END;
  172.   END SendStr;
  173.  
  174.  
  175. (*# save,
  176.     call(near_call=>off, reg_param=>(), reg_saved=>(di,si,ds,es,st1,st2)) *)
  177.  
  178.  
  179. PROCEDURE Dialling(hwnd         : HWND;
  180.                    msg          : CARDINAL;
  181.                    mp1,
  182.                    mp2          : Win.MPARAM) : Win.MRESULT;
  183.  VAR
  184.    TmpStr       : ARRAY [1..25] OF CHAR;
  185.    CharCell     : Vio.CHARCELL;
  186.    OK           : BOOLEAN;
  187.  BEGIN
  188.    CASE msg OF
  189.       | Win.WM_INITDLG  : IF Str.Length(PhoneVar.Name) > 20 THEN
  190.                             Str.Slice(TmpStr, PhoneVar.Name, 0, 20);
  191.                             Str.Concat(TmpStr, TmpStr, '...');
  192.                           ELSE
  193.                             Str.Copy(TmpStr, PhoneVar.Name);
  194.                           END;
  195.                           Win.SetWindowText(Win.WindowFromID(hwnd, TXT_TEXT),
  196.                                             TmpStr);
  197.                           Win.StartTimer(Hab,
  198.                                          hwnd,
  199.                                          TID_DIAL,
  200.                                          500);
  201.       | Win.WM_TIMER    : CASE CARDINAL(mp1) OF
  202.                             | TID_DIAL    : Win.StopTimer(Hab,
  203.                                                           hwnd,
  204.                                                           TID_DIAL);
  205.                                             IF Str.Length(PhoneVar.Number) > 0 THEN
  206.                                               SendStr('ATD');
  207.                                               SendStr(PhoneVar.Number);
  208.                                               SendStr(CHR(13));
  209.                                               IF PhoneVar.Voice THEN
  210.                                                 Win.MessageBox(Win.HWND_DESKTOP,
  211.                                                                hwnd,
  212.                                                                "Press OK to pick phone!",
  213.                                                                ClassName,
  214.                                                                0,
  215.                                                                Win.MB_OK + Win.MB_ICONEXCLAMATION);
  216.                                                 SendStr(CHR(13));
  217.                                               END;
  218.                                             END;
  219.                                             Win.DismissDlg(hwnd,
  220.                                                            Win.MPARAM(TRUE));
  221.                               ELSE          RETURN Win.DefDlgProc(hwnd, msg, mp1, mp2);
  222.                           END;
  223.         ELSE              RETURN Win.DefDlgProc(hwnd, msg, mp1, mp2);
  224.    END;
  225.    RETURN Win.MPARAM(FALSE);
  226.  END Dialling;
  227.  
  228.  
  229. PROCEDURE AddPhone(hwnd         : HWND;
  230.                    msg          : CARDINAL;
  231.                    mp1,
  232.                    mp2          : Win.MPARAM) : Win.MRESULT;
  233.   BEGIN
  234.     CASE msg OF
  235.       | Win.WM_INITDLG  : Win.SendMsg(Win.WindowFromID(hwnd, ENT_NAME),
  236.                                       Win.EM_SETTEXTLIMIT,
  237.                                       Win.MPARAM(SIZE(PhoneVar.Name)),
  238.                                       NULL);
  239.                           Win.SendMsg(Win.WindowFromID(hwnd, ENT_PHONE),
  240.                                       Win.EM_SETTEXTLIMIT,
  241.                                       Win.MPARAM(SIZE(PhoneVar.Number)),
  242.                                       NULL);
  243.                           Win.SetWindowText(Win.WindowFromID(hwnd, ENT_NAME),
  244.                                             PhoneVar.Name);
  245.                           Win.SetWindowText(Win.WindowFromID(hwnd, ENT_PHONE),
  246.                                             PhoneVar.Number);
  247.                           IF PhoneVar.Voice THEN
  248.                             Win.SendMsg(Win.WindowFromID(hwnd, BUT_VOICE),
  249.                                         Win.BM_SETCHECK,
  250.                                         Win.MPARAM(1),
  251.                                         NULL);
  252.                           ELSE
  253.                             Win.SendMsg(Win.WindowFromID(hwnd, BUT_DATA),
  254.                                         Win.BM_SETCHECK,
  255.                                         Win.MPARAM(1),
  256.                                         NULL);
  257.                           END;
  258.       | Win.WM_CONTROL  : CASE CARDINAL(mp1 MOD 65536) OF
  259.                             | BUT_VOICE  : PhoneVar.Voice := TRUE;
  260.                             | BUT_DATA   : PhoneVar.Voice := FALSE;
  261.                               ELSE         RETURN Win.DefDlgProc(hwnd, msg, mp1, mp2);
  262.                           END;
  263.       | Win.WM_COMMAND  : CASE Win.COMMANDMSG(mp2).cmd OF
  264.                             | BUT_OK           : Win.QueryWindowText(Win.WindowFromID(hwnd, ENT_NAME),
  265.                                                                      SIZE(PhoneVar.Name),
  266.                                                                      PhoneVar.Name);
  267.                                                  Win.QueryWindowText(Win.WindowFromID(hwnd, ENT_PHONE),
  268.                                                                      SIZE(PhoneVar.Number),
  269.                                                                      PhoneVar.Number);
  270.                                                  Win.DismissDlg(hwnd,
  271.                                                                 Win.MPARAM(BUT_OK));
  272.                             | BUT_CANCEL       : Win.DismissDlg(hwnd,
  273.                                                                 Win.MPARAM(BUT_CANCEL));
  274.                               ELSE               RETURN Win.DefDlgProc(hwnd, msg, mp1, mp2);
  275.                           END;
  276.         ELSE              RETURN Win.DefDlgProc(hwnd, msg, mp1, mp2);
  277.     END;
  278.     RETURN Win.MPARAM(FALSE);
  279.   END AddPhone;
  280.  
  281.  
  282. PROCEDURE PhoneBook(hwnd        : HWND;
  283.                     msg         : CARDINAL;
  284.                     mp1,
  285.                     mp2         : Win.MPARAM) : Win.MRESULT;
  286.   VAR
  287.     PhoneFile   : FIO.File;
  288.     Result      : CARDINAL;
  289.     Selection   : LONGCARD;
  290.     Error       : ARRAY [1..80] OF CHAR;
  291.   BEGIN
  292.     CASE msg OF
  293.       | Win.WM_INITDLG  : PhoneFile := FIO.Open(Fname);
  294.                           IF FIO.IOresult() = 0 THEN
  295.                             FIO.Seek(PhoneFile, 1024);
  296.                             WHILE FIO.RdBin(PhoneFile, PhoneVar, SIZE(PhoneRec)) = SIZE(PhoneRec) DO
  297.                               Win.SendDlgItemMsg(hwnd,
  298.                                                  LIS_PHONEBOOK,
  299.                                                  Win.LM_INSERTITEM,
  300.                                                  Win.LIT_END,
  301.                                                  Win.MPARAM(ADR(PhoneVar.Name)));
  302.                             END;
  303.                             FIO.Close(PhoneFile);
  304.                             Win.SendDlgItemMsg(hwnd,
  305.                                                LIS_PHONEBOOK,
  306.                                                Win.LM_SELECTITEM,
  307.                                                0,
  308.                                                Win.MPARAM(TRUE));
  309.                           END;
  310.       | Win.WM_COMMAND  : CASE Win.COMMANDMSG(mp2).cmd OF
  311.                             | BUT_OK          : Win.DismissDlg(hwnd,
  312.                                                                Win.MPARAM(TRUE));
  313.                             | BUT_DELETE      : IF Win.MessageBox(Win.HWND_DESKTOP,
  314.                                                                   hwnd,
  315.                                                                   "Are you sure you want to delete this entry?",
  316.                                                                   ClassName,
  317.                                                                   0,
  318.                                                                   Win.MB_YESNO + Win.MB_ICONEXCLAMATION) = Win.MBID_YES THEN
  319.                                                   Selection := Win.SendDlgItemMsg(hwnd,
  320.                                                                                   LIS_PHONEBOOK,
  321.                                                                                   Win.LM_QUERYSELECTION,
  322.                                                                                   NULL,
  323.                                                                                   NULL);
  324.                                                   PhoneFile := FIO.Open(Fname);
  325.                                                   IF FIO.IOresult() = 0 THEN
  326.                                                     FIO.Seek(PhoneFile,(Selection + 1) * SIZE(PhoneVar) + 1024);
  327.                                                     WHILE FIO.RdBin(PhoneFile, PhoneVar, SIZE(PhoneVar)) = SIZE(PhoneVar) DO
  328.                                                       FIO.Seek(PhoneFile, FIO.GetPos(PhoneFile) - 2 * SIZE(PhoneVar));
  329.                                                       FIO.WrBin(PhoneFile, PhoneVar, SIZE(PhoneVar));
  330.                                                       FIO.Seek(PhoneFile, FIO.GetPos(PhoneFile) + SIZE(PhoneVar));
  331.                                                     END;
  332.                                                     FIO.Seek(PhoneFile, FIO.GetPos(PhoneFile) - SIZE(PhoneVar));
  333.                                                     IF FIO.GetPos(PhoneFile) >= 1024 THEN
  334.                                                       FIO.Truncate(PhoneFile);
  335.                                                     END;
  336.                                                     FIO.Close(PhoneFile);
  337.                                                     Win.SendDlgItemMsg(hwnd,
  338.                                                                        LIS_PHONEBOOK,
  339.                                                                        Win.LM_DELETEITEM,
  340.                                                                        Selection,
  341.                                                                        NULL);
  342.                                                     Win.SendDlgItemMsg(hwnd,
  343.                                                                        LIS_PHONEBOOK,
  344.                                                                        Win.LM_SELECTITEM,
  345.                                                                        Selection,
  346.                                                                        Win.MPARAM(TRUE));
  347.                                                   END;
  348.                                                 END;
  349.                           | BUT_DIAL        :   Error := 'Can not read phonebook entry!';
  350.                                                 Selection := Win.SendDlgItemMsg(hwnd,
  351.                                                                                 LIS_PHONEBOOK,
  352.                                                                                 Win.LM_QUERYSELECTION,
  353.                                                                                 NULL,
  354.                                                                                 NULL);
  355.                                                 PhoneFile := FIO.Open(Fname);
  356.                                                 IF FIO.IOresult() = 0 THEN
  357.                                                   FIO.Seek(PhoneFile, Selection * SIZE(PhoneVar) + 1024);
  358.                                                   IF FIO.IOresult() = 0 THEN
  359.                                                     IF FIO.RdBin(PhoneFile, PhoneVar, SIZE(PhoneVar)) = SIZE(PhoneVar) THEN
  360.                                                       Error := '';
  361.                                                       Win.DlgBox(Win.HWND_DESKTOP,
  362.                                                                  hwnd,
  363.                                                                  Dialling,
  364.                                                                  NULL,
  365.                                                                  DLG_DIAL,
  366.                                                                  ADR(Dos.NULL));
  367.                                                     END;
  368.                                                   END;
  369.                                                   FIO.Close(PhoneFile);
  370.                                                 END;
  371.                                                 IF Str.Length(Error) > 0 THEN
  372.                                                   Win.MessageBox(Win.HWND_DESKTOP,
  373.                                                                  hwnd,
  374.                                                                  Error,
  375.                                                                  ClassName,
  376.                                                                  0,
  377.                                                                  Win.MB_OK + Win.MB_ICONEXCLAMATION);
  378.                                                 END;
  379.                             | BUT_CHANGE      : Selection := Win.SendDlgItemMsg(hwnd,
  380.                                                                                 LIS_PHONEBOOK,
  381.                                                                                 Win.LM_QUERYSELECTION,
  382.                                                                                 NULL,
  383.                                                                                 NULL);
  384.                                                 IF Selection <> LONGCARD(Win.LIT_NONE) THEN
  385.                                                   PhoneFile := FIO.Open(Fname);
  386.                                                   IF FIO.IOresult() <> 0 THEN
  387.                                                     PhoneFile := FIO.Create(Fname);
  388.                                                     FIO.WrCharRep(PhoneFile, CHR(0), 1024);
  389.                                                   END;
  390.                                                   IF FIO.IOresult() = 0 THEN
  391.                                                     FIO.Seek(PhoneFile,Selection * SIZE(PhoneVar) + 1024);
  392.                                                     IF FIO.IOresult() = 0 THEN
  393.                                                       IF FIO.RdBin(PhoneFile,PhoneVar,SIZE(PhoneVar)) = SIZE(PhoneVar) THEN
  394.                                                         Win.DlgBox(Win.HWND_DESKTOP,
  395.                                                                    hwnd,
  396.                                                                    AddPhone,
  397.                                                                    NULL,
  398.                                                                    DLG_ENTRY,
  399.                                                                    ADR(Dos.NULL));
  400.                                                         FIO.Seek(PhoneFile,Selection * SIZE(PhoneVar) + 1024);
  401.                                                         FIO.WrBin(PhoneFile, PhoneVar, SIZE(PhoneVar));
  402.                                                         IF FIO.IOresult() = 0 THEN
  403.                                                           Win.SendDlgItemMsg(hwnd,
  404.                                                                              LIS_PHONEBOOK,
  405.                                                                              Win.LM_DELETEITEM,
  406.                                                                              Selection,
  407.                                                                              NULL);
  408.                                                           Win.SendDlgItemMsg(hwnd,
  409.                                                                              LIS_PHONEBOOK,
  410.                                                                              Win.LM_INSERTITEM,
  411.                                                                              Selection,
  412.                                                                              Win.MPARAM(ADR(PhoneVar.Name)));
  413.                                                           Win.SendDlgItemMsg(hwnd,
  414.                                                                              LIS_PHONEBOOK,
  415.                                                                              Win.LM_SELECTITEM,
  416.                                                                              Selection,
  417.                                                                              Win.MPARAM(TRUE));
  418.                                                         END;
  419.                                                         RETURN Win.MPARAM(FALSE);
  420.                                                       END;
  421.                                                     END;
  422.                                                     FIO.Close(PhoneFile);
  423.                                                   END;
  424.                                                   Win.COMMANDMSG(mp2).cmd := BUT_ADD;
  425.                                                   Win.SendMsg(hwnd, Win.WM_COMMAND, mp1, mp2);
  426.                                                 END;
  427.                             | BUT_ADD         : PhoneVar.Name     := '';
  428.                                                 PhoneVar.Number   := '';
  429.                                                 PhoneVar.Voice    := TRUE;
  430.                                                 Result := Win.DlgBox(Win.HWND_DESKTOP,
  431.                                                                      hwnd,
  432.                                                                      AddPhone,
  433.                                                                      NULL,
  434.                                                                      DLG_ENTRY,
  435.                                                                      ADR(Dos.NULL));
  436.                                                 IF Result = BUT_OK THEN
  437.                                                   PhoneFile := FIO.Append(Fname);
  438.                                                   IF FIO.IOresult() <> 0 THEN
  439.                                                     PhoneFile := FIO.Create(Fname);
  440.                                                     FIO.WrCharRep(PhoneFile, CHR(0), 1024);
  441.                                                   END;
  442.                                                   IF FIO.IOresult() = 0 THEN
  443.                                                     FIO.WrBin(PhoneFile, PhoneVar, SIZE(PhoneVar));
  444.                                                     FIO.Close(PhoneFile);
  445.                                                     Selection := Win.SendDlgItemMsg(hwnd,
  446.                                                                                     LIS_PHONEBOOK,
  447.                                                                                     Win.LM_INSERTITEM,
  448.                                                                                     Win.LIT_END,
  449.                                                                                     Win.MPARAM(ADR(PhoneVar.Name)));
  450.                                                     Win.SendDlgItemMsg(hwnd,
  451.                                                                        LIS_PHONEBOOK,
  452.                                                                        Win.LM_SELECTITEM,
  453.                                                                        Selection,
  454.                                                                        Win.MPARAM(TRUE));
  455.                                                   END;
  456.                                                 END;
  457.                               ELSE              RETURN Win.DefDlgProc(hwnd, msg, mp1, mp2);
  458.                           END;
  459.       | Win.WM_CONTROL  : CASE CARDINAL(mp1 DIV 65536) OF
  460.                             | Win.LN_ENTER : Win.COMMANDMSG(mp2).cmd := BUT_DIAL;
  461.                                              msg := Win.WM_COMMAND;
  462.                                              mp2 := 1;
  463.                                              Win.PostMsg(hwnd, msg, mp1, mp2);
  464.                               ELSE           RETURN Win.DefDlgProc(hwnd, msg, mp1, mp2);
  465.                           END;
  466.         ELSE              RETURN Win.DefDlgProc(hwnd, msg, mp1, mp2);
  467.     END;
  468.     RETURN Win.MPARAM(FALSE);
  469.   END PhoneBook;
  470.  
  471.  
  472.  
  473. PROCEDURE PopMess(hwnd       : HWND;
  474.                   msg        : CARDINAL;
  475.                   mp1,
  476.                   mp2        : Win.MPARAM) : Win.MRESULT;
  477.  VAR
  478.    LineCtrl     : SHORTCARD;
  479.    SpeedDiv     : CARDINAL;
  480.  BEGIN
  481.    CASE msg OF
  482.      | Win.WM_COMMAND  : CASE Win.COMMANDMSG(mp2).cmd OF
  483.                            | BUT_OK : Win.DismissDlg(hwnd, Win.MPARAM(TRUE));
  484.                              ELSE     RETURN Win.DefDlgProc(hwnd, msg, mp1, mp2);
  485.                          END;
  486.        ELSE              RETURN Win.DefDlgProc(hwnd, msg, mp1, mp2);
  487.    END;
  488.    RETURN Win.MPARAM(FALSE);
  489.  END PopMess;
  490.  
  491.  
  492. PROCEDURE WindowProc(hwnd       : HWND;
  493.                      msg        : CARDINAL;
  494.                      mp1,
  495.                      mp2        : Win.MPARAM) : Win.MRESULT;
  496.   VAR
  497.     Rc          : RECTL;
  498.     Hps         : HPS;
  499.     Hbm         : HBITMAP;
  500.     Swp         : POINTER TO Win.SWP;
  501.     BitmapPoint : POINTL;
  502.     BitmapRect  : POINTER TO RECTL;
  503.   BEGIN
  504.     CASE msg OF
  505.       | Win.WM_PAINT            : Hps := Win.BeginPaint(hwnd, NULL, Rc);
  506.                                   BitmapPoint.x := 0;
  507.                                   BitmapPoint.y := 0;
  508.                                   BitmapRect    := [0:0];
  509.                                   Hbm := Gpi.LoadBitmap(Hps, NULL, ID_RESOURCE, WinRect.xRight - WinRect.xLeft, WinRect.yTop - WinRect.yBottom);
  510.                                   Win.DrawBitmap(Hps, Hbm, BitmapRect^, BitmapPoint, 0, 0, Win.DBM_STRETCH);
  511.                                   Win.EndPaint(Hps);
  512.       | Win.WM_SIZE             : WinRect.xRight := WinRect.xLeft   + LONGINT(mp2 MOD 65536);
  513.                                   WinRect.yTop   := WinRect.yBottom + LONGINT(mp2 DIV 65536);
  514.                                   BitmapRect     := [0:0];
  515.                                   Win.InvalidateRect(hwnd, BitmapRect^, B_FALSE);
  516.       | Win.WM_COMMAND          : CASE Win.COMMANDMSG(mp2).cmd OF
  517.                                     | MNU_DIAL       : Win.DlgBox(Win.HWND_DESKTOP,
  518.                                                                   hwnd,
  519.                                                                   PhoneBook,
  520.                                                                   NULL,
  521.                                                                   DLG_PHONEBOOK,
  522.                                                                   ADR(Dos.NULL));
  523.                                   END;
  524.       | Win.WM_USER             : Popping := TRUE;
  525.                                   Win.MessageBox(Win.HWND_DESKTOP,
  526.                                                  hwnd,
  527.                                                  "Phone is ringing!",
  528.                                                  ClassName,
  529.                                                  0,
  530.                                                  Win.MB_OK + Win.MB_ICONEXCLAMATION);
  531.                                   Popping := FALSE;
  532.         ELSE                      RETURN Win.DefWindowProc(hwnd, msg, mp1, mp2);
  533.     END;
  534.     RETURN Win.MPARAM(FALSE);
  535.   END WindowProc;
  536.  
  537.  
  538. (*# restore *)
  539.  
  540.  
  541.  
  542. PROCEDURE Main;
  543.   VAR
  544.     Hmq         : Win.HMQ;
  545.     Qmsg        : Win.QMSG;
  546.     Createfl    : LSET;
  547.     r           : Win.MRESULT;
  548.   BEGIN
  549.     Hab := Win.Initialize(NULL);
  550.     Hmq := Win.CreateMsgQueue(Hab, 0);
  551.  
  552.     Win.RegisterClass(Hab,
  553.                       ADR(ClassName),
  554.                       WindowProc,
  555.                       0,
  556.                       0);
  557.  
  558.     Createfl := Win.FCF_TITLEBAR   + Win.FCF_SYSMENU + Win.FCF_MINMAX +
  559.                 Win.FCF_SIZEBORDER + Win.FCF_SHELLPOSITION +
  560.                 Win.FCF_TASKLIST   + Win.FCF_ICON    + Win.FCF_MENU;
  561.  
  562.     Frame := Win.CreateStdWindow(Win.HWND_DESKTOP,
  563.                                  Win.WS_MAXIMIZED,
  564.                                  Createfl,
  565.                                  ADR(ClassName),
  566.                                  ' - Phone Attentioning utility',
  567.                                  Win.WS_VISIBLE + Win.WS_CLIPCHILDREN,
  568.                                  NULL,
  569.                                  WindowId,
  570.                                  Client);
  571.  
  572.     Win.SetWindowPos(Frame,
  573.                      Win.HWND_TOP,
  574.                      10,
  575.                      10,
  576.                      200,
  577.                      200,
  578.                      Win.SWP_MINIMIZE + Win.SWP_SHOW + Win.SWP_SIZE);
  579.  
  580.     Process.StartProcess(ScanModem,8192,1);
  581.     Process.StartScheduler;
  582.  
  583.     WHILE(Win.GetMsg(Hab, Qmsg, HWND(NULL), 0, 0)) DO
  584.       r := Win.DispatchMsg(Hab, Qmsg);
  585.     END;
  586.  
  587.     Process.StopScheduler;
  588.  
  589.     Win.DestroyWindow(Frame);
  590.     Win.DestroyMsgQueue(Hmq);
  591.     Win.Terminate(Hab);
  592.   END Main;
  593.  
  594.  
  595. BEGIN
  596.   IOAdr       := 3F8H;
  597.   Popping     := FALSE;
  598.   FIO.IOcheck := FALSE;
  599.   IF Lib.ParamCount() > 0 THEN
  600.     Lib.ParamStr(TmpStr, 1);
  601.     Str.Caps(TmpStr);
  602.     IOAdr := CARDINAL(Str.StrToCard(TmpStr, 16, OK));
  603.   END;
  604.   Main;
  605. END PhoneAt4.
  606.