home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 December / simtel1292_SIMTEL_1292_Walnut_Creek.iso / msdos / pibterm / pibt41s2.arc / PIBDIALC.MOD < prev    next >
Text File  |  1988-02-07  |  34KB  |  975 lines

  1. (*----------------------------------------------------------------------*)
  2. (*  Signal_Connection -- indicate connection made for redial, list dial *)
  3. (*----------------------------------------------------------------------*)
  4.  
  5. PROCEDURE Signal_Connection;
  6.  
  7. (*----------------------------------------------------------------------*)
  8. (*                                                                      *)
  9. (*     Procedure:  Signal_Connection                                    *)
  10. (*                                                                      *)
  11. (*     Purpose:    Indicates connection made                            *)
  12. (*                                                                      *)
  13. (*     Calling Sequence:                                                *)
  14. (*                                                                      *)
  15. (*        Signal_Connection;                                            *)
  16. (*                                                                      *)
  17. (*     Calls:   Save_Screen                                             *)
  18. (*              Restore_Screen                                          *)
  19. (*              Draw_Menu_Frame                                         *)
  20. (*              Reset_Global_Colors                                     *)
  21. (*              Dialer_Carrier_Detect                                   *)
  22. (*              Read_Kbd                                                *)
  23. (*                                                                      *)
  24. (*----------------------------------------------------------------------*)
  25.  
  26. VAR
  27.    Local_Save : Saved_Screen_Ptr;
  28.    Ch         : CHAR;
  29.  
  30. BEGIN (* Signal_Connection *)
  31.  
  32.    Save_Partial_Screen( Local_Save, 10, 10, 60, 14 );
  33.    Draw_Menu_Frame( 10, 10, 60, 14, Menu_Frame_Color,
  34.                     Menu_Title_Color + Blink,
  35.                     Menu_Text_Color, '' );
  36.  
  37.    TextColor( Menu_Text_Color + Blink );
  38.  
  39.    WRITELN('Connection established!!');
  40.    WRITE  ('Hit ESC key to continue');
  41.  
  42.    REPEAT
  43.       Menu_Beep;
  44.       DELAY( 3 * Tenth_Of_A_Second_Delay );
  45.    UNTIL ( PibTerm_KeyPressed  OR  ( NOT Dialer_Carrier_Detect ) );
  46.  
  47.    IF PibTerm_KeyPressed THEN
  48.       BEGIN
  49.          Read_Kbd( Ch );
  50.          IF ( Ch = CHR( ESC ) ) AND PibTerm_KeyPressed THEN
  51.             Read_Kbd( Ch );
  52.       END;
  53.  
  54.    Restore_Screen_And_Colors( Local_Save );
  55.  
  56. END   (* Signal_Connection *);
  57.  
  58. (*----------------------------------------------------------------------*)
  59. (*                  Dial_A_Number --- dial phone number                 *)
  60. (*----------------------------------------------------------------------*)
  61.  
  62. PROCEDURE Dial_A_Number(     Re_Dial : BOOLEAN;
  63.                          VAR Quit    : BOOLEAN );
  64.  
  65. (*----------------------------------------------------------------------*)
  66. (*                                                                      *)
  67. (*     Procedure:  Dial_A_Number                                        *)
  68. (*                                                                      *)
  69. (*     Purpose:    Dials phone number                                   *)
  70. (*                                                                      *)
  71. (*     Calling Sequence:                                                *)
  72. (*                                                                      *)
  73. (*        Dial_A_Number(     Re_Dial : BOOLEAN;                         *)
  74. (*                       VAR Quit    : BOOLEAN );                       *)
  75. (*                                                                      *)
  76. (*           Re_Dial --- TRUE to re-dial last number                    *)
  77. (*           Quit    --- TRUE if Esc key hit to stop dialing            *)
  78. (*                                                                      *)
  79. (*     Calls:   Send_Modem_Command                                      *)
  80. (*              Save_Screen                                             *)
  81. (*              Restore_Screen                                          *)
  82. (*              Draw_Menu_Frame                                         *)
  83. (*              Reset_Global_Colors                                     *)
  84. (*              Dialer_Carrier_Detect                                   *)
  85. (*              Display_Phone_Numbers                                   *)
  86. (*              TimeOfDay                                               *)
  87. (*              TimeDiff                                                *)
  88. (*                                                                      *)
  89. (*----------------------------------------------------------------------*)
  90.  
  91. VAR
  92.    Dial_Title   : FileStr;
  93.    OK_Redial    : BOOLEAN;
  94.    Ch           : CHAR;
  95.    Timed_Out    : BOOLEAN;
  96.    STimer       : LONGINT;
  97.    Modem_Mess   : AnyStr;
  98.    New_Baud     : INTEGER;
  99.    Ierr         : INTEGER;
  100.    Qerr         : BOOLEAN;
  101.    SNumber      : STRING[100];
  102.    Inumber      : INTEGER;
  103.    Modem_Buzy   : BOOLEAN;
  104.    Modem_NoC    : BOOLEAN;
  105.    Modem_Conn   : BOOLEAN;
  106.    T            : LONGINT;
  107.    TOD          : LONGINT;
  108.    IY           : INTEGER;
  109.    I            : INTEGER;
  110.    J            : INTEGER;
  111.    TS           : STRING[9];
  112.    TSO          : STRING[9];
  113.    ESC_Hit      : BOOLEAN;
  114.    Local_Save_3 : Saved_Screen_Ptr;
  115.    Local_Save_5 : Saved_Screen_Ptr;
  116.    Got_Num      : BOOLEAN;
  117.    CR_Str       : STRING[1];
  118.    Do_Baud      : BOOLEAN;
  119.  
  120. (*----------------------------------------------------------------------*)
  121. (*  Convert_Entry_To_Number --- convert dialing entry to phone number   *)
  122. (*----------------------------------------------------------------------*)
  123.  
  124. PROCEDURE Convert_Entry_To_Number;
  125.  
  126. VAR
  127.    I: INTEGER;
  128.    
  129. BEGIN (* Convert_Entry_To_Number *)
  130.  
  131.                                    (* Check for manual dial *)
  132.  
  133.    IF UpCase( SNumber[1] ) = 'M' THEN
  134.       BEGIN
  135.          Manual_Dial := TRUE;
  136.          IF LENGTH( SNumber ) > 1 THEN
  137.             SNumber     := COPY( SNumber, 2, LENGTH( SNumber ) - 1 )
  138.          ELSE
  139.             SNumber     := '';
  140.       END;
  141.                                    (* Check for prefix *)
  142.  
  143.    IF SNumber[1] IN ['+','-','!','@','#'] THEN
  144.       BEGIN
  145.          Prefix_Str := Phone_Prefix_Nos[ POS( SNumber[1], '+-!@#' ) ];
  146.          IF LENGTH( SNumber ) > 1 THEN
  147.             SNumber    := COPY( SNumber, 2, LENGTH( SNumber ) - 1 )
  148.          ELSE
  149.             SNumber     := '';
  150.       END;
  151.  
  152.    IF SNumber[LENGTH(SNumber)] IN ['+','-','!','@','#'] THEN
  153.       BEGIN
  154.          Postfix_Str := Phone_Prefix_Nos[ POS( SNumber[LENGTH(SNumber)],
  155.                                                '+-!@#' ) ];
  156.          IF LENGTH( SNumber ) > 1 THEN
  157.             SNumber    := COPY( SNumber, 1, ( LENGTH( SNumber ) - 1 ) )
  158.          ELSE
  159.             SNumber     := '';
  160.       END;
  161.  
  162.    IF Manual_Dial THEN
  163.       BEGIN
  164.          Phone_Number       := SNumber;
  165.          Phone_Entry_Number := -1;
  166.          FOR I := 1 TO 25 DO
  167.             Phone_Entry_Data.Phone_Name[I] := ' ';
  168.          FOR I := 1 TO 15 DO
  169.             Phone_Entry_Data.Phone_Number[I] := ' ';
  170.          FOR I := 1 TO 9 DO
  171.             Phone_Entry_Data.Phone_Script[I] := ' ';
  172.          J := 0;
  173.          FOR I := ( 16 - LENGTH( SNumber ) ) TO 15 DO
  174.             BEGIN
  175.                J := J + 1;
  176.                Phone_Entry_Data.Phone_Number[I] := SNumber[J];
  177.             END;
  178.       END
  179.    ELSE
  180.       BEGIN
  181.          Inumber := 2;
  182.          VAL( SNumber, Inumber, Ierr );
  183.          IF ( Ierr = 0 ) AND
  184.             ( INumber >  0 ) AND
  185.             ( INumber <= Dialing_Dir_Size) THEN
  186.             BEGIN
  187.                Phone_Entry_Data   := Dialing_Directory^[ INumber ];
  188.                Phone_Number       := Phone_Entry_Data.Phone_Number;
  189.                Phone_Entry_Number := INumber;
  190.                IF ( NOT Dialer_Carrier_Detect ) THEN
  191.                   Reset_Comm_Params( Phone_Entry_Data , INumber );
  192.             END
  193.          ELSE
  194.             BEGIN
  195.                WRITELN;
  196.                WRITE('Bad phone number, dialing cancelled.');
  197.                ClrEol;
  198.                Window_Delay;
  199.                Quit := TRUE;
  200.                Phone_Entry_Number := -1;
  201.             END;
  202.       END;
  203.  
  204. END   (* Convert_Entry_To_Number *);
  205.  
  206. (*----------------------------------------------------------------------*)
  207. (*            Perform_The_Dial --- perform actual dialing               *)
  208. (*----------------------------------------------------------------------*)
  209.  
  210. PROCEDURE Perform_The_Dial;
  211.  
  212. VAR
  213.    Int_Ch  : INTEGER;
  214.    CNumber : AnyStr;
  215.    I       : INTEGER;
  216.    ConMess : AnyStr;
  217.  
  218. (*----------------------------------------------------------------------*)
  219.  
  220. PROCEDURE Append_A_Char(  VAR  S: AnyStr;
  221.                               Ch: CHAR    );
  222.  
  223. VAR
  224.    L: INTEGER;
  225.  
  226. BEGIN (* Append_A_Char *)
  227.  
  228.    L := ORD( S[0] );
  229.  
  230.    IF ( L < 255 ) THEN
  231.       BEGIN
  232.          L    := L + 1;
  233.          S[L] := Ch;
  234.          S[0] := CHR( L );
  235.       END
  236.    ELSE
  237.       BEGIN
  238.          MOVE( S[2], S[1], 254 );
  239.          S[255] := Ch;
  240.       END;
  241.  
  242. END   (* Append_A_Char *);
  243.  
  244. (*----------------------------------------------------------------------*)
  245.  
  246. PROCEDURE Do_Baud_Detection;
  247.  
  248. VAR
  249.    I: INTEGER;
  250.  
  251. BEGIN (* Do_Baud_Detection *)
  252.  
  253.    STimer     := TimeOfDay;
  254.    IY         := 0;
  255.                                    (* Wait for connect message *)
  256.    REPEAT
  257.  
  258.       Async_Receive_With_TimeOut( One_Second , Int_Ch );
  259.  
  260.       IF ( Int_Ch <> TimeOut ) THEN
  261.          Append_A_Char( Modem_Mess , CHR( Int_Ch ) );
  262.  
  263.       Timed_Out := ( TimeDiff( Stimer , TimeOfDay ) > 5.0 ) OR
  264.                    ( Int_Ch = TimeOut );
  265.  
  266.       IY     := POS( Modem_Connect , Modem_Mess );
  267.  
  268.    UNTIL( Timed_Out OR ( IY > 0 ) );
  269.  
  270.                                    (* If connect found, read chars *)
  271.                                    (* up to next CR, if any.       *)
  272.    IF ( IY > 0 ) THEN
  273.       BEGIN
  274.  
  275.          DELETE( Modem_Mess, 1, IY - 1 );
  276.  
  277.          REPEAT
  278.  
  279.             Async_Receive_With_TimeOut( One_Second , Int_Ch );
  280.  
  281.             IF ( Int_Ch <> TimeOut ) THEN
  282.                Append_A_Char( Modem_Mess , CHR( Int_Ch ) );
  283.  
  284.             Timed_Out := ( Int_Ch = TimeOut );
  285.  
  286.          UNTIL( Timed_Out OR ( Int_Ch = CR ) );
  287.  
  288.       END;
  289.  
  290.                                    (* If connect message found, look for *)
  291.                                    (* any following digits, indicating   *)
  292.                                    (* baud rate of connection.           *)
  293.  
  294.    IY     := POS( Modem_Connect , Modem_Mess );
  295.  
  296.    IF ( IY > 0 ) THEN
  297.       BEGIN
  298.  
  299.          I             := IY + LENGTH( Modem_Connect );
  300.  
  301.          Append_A_Char( Modem_Mess , CHR( CR ) );
  302.  
  303.          New_Baud      := 0;
  304.          Do_Baud       := TRUE;
  305.  
  306.          WHILE( Do_Baud ) DO
  307.             BEGIN
  308.                IF Modem_Mess[I] IN ['0'..'9'] THEN
  309.                   New_Baud := New_Baud * 10 + ORD( Modem_Mess[I] ) -
  310.                                               ORD('0')
  311.                ELSE IF Modem_Mess[I] = CHR( CR ) THEN
  312.                   Do_Baud := FALSE;
  313.                I := I + 1;
  314.                IF ( I > LENGTH( Modem_Mess ) ) THEN
  315.                   Do_Baud := FALSE;
  316.             END;
  317.  
  318.          FOR I := 1 TO N_Baud_Rates DO
  319.             IF ( New_Baud = Baud_Rates[I] ) THEN
  320.                BEGIN
  321.                   IF ( New_Baud <> Baud_Rate ) THEN
  322.                      BEGIN
  323.                         Reset_Comm_Port := TRUE;
  324.                         Baud_Rate       := New_Baud;
  325.                         Async_Reset_Port( Comm_Port, Baud_Rate, Parity,
  326.                                           Data_Bits, Stop_Bits );
  327.                      END;
  328.                END;
  329.  
  330.       END;
  331.  
  332. END   (* Do_Baud_Detection *);
  333.  
  334. (*----------------------------------------------------------------------*)
  335.  
  336. BEGIN (* Perform_The_Dial *)
  337.                                    (* Nothing back from modem yet *)
  338.    Modem_Mess  := '';
  339.  
  340.    IF ( LENGTH( Phone_Number ) > 0 ) AND ( NOT Quit ) THEN
  341.       BEGIN  (* Phone number gotten *)
  342.  
  343.          IF ( NOT Manual_Dial ) THEN
  344.             Dial_Title := TRIM( Dial_Title + ' ' +
  345.                                 Phone_Entry_Data.Phone_Name );
  346.  
  347.          Draw_Menu_Frame( 10, 10, 70, 17, Menu_Frame_Color, Menu_Title_Color,
  348.                           Menu_Text_Color, Dial_Title );
  349.  
  350.          GoToXY( 1 , 1 );
  351.                                    (* Purge receive to avoid *)
  352.                                    (* false modem messages   *)
  353.          Async_Purge_Buffer;
  354.                                    (* Get number to dial     *)
  355.  
  356.          CNumber := Prefix_Str + Phone_Number + Postfix_Str;
  357.  
  358.          I := POS( ' ' , CNumber );
  359.  
  360.          WHILE( I > 0 ) DO
  361.             BEGIN
  362.                DELETE( CNumber, I, 1 );
  363.                I := POS( ' ' , CNumber );
  364.             END;
  365.                                    (* Display if dialing/redialing *)
  366.          IF OK_Redial THEN
  367.             BEGIN
  368.                TextColor( Menu_Text_Color_2 );
  369.                WRITE('Re-dialing  : ');
  370.                TextColor( Menu_Text_Color );
  371.                WRITE( CNumber );
  372.             END
  373.          ELSE
  374.             BEGIN
  375.                TextColor( Menu_Text_Color_2 );
  376.                WRITE('Dialing     : ');
  377.                TextColor( Menu_Text_Color );
  378.                WRITE( CNumber );
  379.             END;
  380.  
  381.          ClrEol;
  382.                                    (* Make sure serial output uncorked *)
  383.          Clear_XOFF_Received;
  384.                                    (* Issue complete dialing command *)
  385.  
  386.          Send_Modem_Command( Modem_Dial               +
  387.                              Prefix_Str               +
  388.                              Phone_Number             +
  389.                              Postfix_Str              +
  390.                              Modem_Dial_End );
  391.  
  392.          STimer          := TimeOfDay;
  393.          Modem_Buzy      := FALSE;
  394.          Modem_NoC       := FALSE;
  395.          Modem_Conn      := FALSE;
  396.          IY              := WhereY;
  397.          TS              := '';
  398.          Connection_Made := FALSE;
  399.  
  400.          GoToXY( 1 , 2 );
  401.          TextColor( Menu_Text_Color_2 );
  402.          WRITE('Begins at   : ');
  403.          TextColor( Menu_Text_Color );
  404.          WRITE(TimeString(TimeOfDay , Time_Format));
  405.          ClrEol;
  406.  
  407.          GoToXY( 1 , 3 );
  408.          TextColor( Menu_Text_Color_2 );
  409.          WRITE('Time now    : ');
  410.          TextColor( Menu_Text_Color );
  411.          WRITE(TimeString(TimeOfDay , Time_Format));
  412.          ClrEol;
  413.  
  414.          Write_Log( Dial_Title + ' (' + Phone_Number + ')' , FALSE, FALSE );
  415.  
  416.          GoToXY( 1 , 4 );
  417.          TextColor( Menu_Text_Color_2 );
  418.          WRITE('Elapsed time: ');
  419.          ClrEol;
  420.          TextColor( Menu_Text_Color );
  421.  
  422.          IF OK_Redial THEN
  423.             BEGIN
  424.                GoToXY( 1 , 5 );
  425.                TextColor( Menu_Text_Color_2 );
  426.                WRITE('Retry count : ');
  427.                TextColor( Menu_Text_Color );
  428.                WRITE(Redial_Count);
  429.                ClrEol;
  430.             END;
  431.  
  432.          CursorOff;
  433.  
  434.          REPEAT
  435.  
  436.             TOD       := TimeOfDay;
  437.             T         := TimeDiff( STimer , TOD );
  438.             TSO       := TS;
  439.             TS        := TimeString( T , Military_Time );
  440.  
  441.             IF TS <> TSO THEN
  442.                BEGIN
  443.                   GoToXY( 15 , 3 );
  444.                   WRITE( TimeString( TOD , Military_Time ) );
  445.                   ClrEol;
  446.                   GoToXY( 15 , 4 );
  447.                   WRITE( TS );
  448.                   ClrEol;
  449.                END;
  450.  
  451.             Timed_Out := ( T > Modem_Time_Out );
  452.  
  453.             IF Async_Receive( Ch ) THEN
  454.                Append_A_Char( Modem_Mess , Ch );
  455.  
  456.             Modem_Buzy := ( POS( Modem_Busy       , Modem_Mess ) > 0 ) AND
  457.                           ( LENGTH( Modem_Busy       )  > 0 );
  458.             Modem_NoC  := ( POS( Modem_No_Carrier , Modem_Mess ) > 0 ) AND
  459.                           ( LENGTH( Modem_No_Carrier ) > 0 );
  460.             Modem_Conn := ( POS( Modem_Connect    , Modem_Mess ) > 0 ) AND
  461.                           ( LENGTH( Modem_Connect    ) > 0 );
  462.  
  463.             Esc_Hit := FALSE;
  464.  
  465.             IF PibTerm_KeyPressed THEN
  466.                BEGIN
  467.  
  468.                   Read_Kbd( Ch );
  469.  
  470.                   Esc_Hit := ( Ch = CHR( ESC ) );
  471.  
  472.                   WHILE( PibTerm_KeyPressed ) DO
  473.                      Read_Kbd( Ch );
  474.  
  475.                END
  476.             ELSE
  477.                GiveAwayTime( 2 );
  478.  
  479.          UNTIL ( Dialer_Carrier_Detect ) OR
  480.                ( Timed_Out             ) OR
  481.                ( Modem_Conn            ) OR
  482.                ( Modem_Buzy            ) OR
  483.                ( Modem_NoC             ) OR
  484.                ( Esc_Hit               );
  485.  
  486.          CursorOn;
  487.  
  488.          TextColor( Menu_Text_Color_2 );
  489.  
  490.          IF ( Modem_Conn OR Dialer_Carrier_Detect ) THEN
  491.             Connection_Made := TRUE
  492.          ELSE IF Esc_Hit THEN
  493.             BEGIN
  494.  
  495.                GoToXY( 1 , 6 );
  496.  
  497.                WRITE('*** ESC Pressed, Dialing Cancelled.');
  498.                ClrEol;
  499.  
  500.                Write_Log('ESC Pressed, Dialing Cancelled.' , TRUE , FALSE );
  501.  
  502.                Quit := TRUE;
  503.                                    (* Hang up the phone *)
  504.  
  505.                IF ( NOT Modem_Hold_Line ) THEN
  506.                   HangUpPhone;
  507.  
  508.             END
  509.          ELSE IF Timed_Out THEN
  510.             BEGIN
  511.  
  512.                GoToXY( 1 , 6 );
  513.                WRITE('*** Modem Timed Out, Dialing Cancelled.');
  514.                ClrEol;
  515.  
  516.                Write_Log('Modem Timed Out, Dialing Cancelled.' , TRUE , FALSE );
  517.  
  518.                Window_Delay;
  519.  
  520.             END
  521.          ELSE IF Modem_Buzy THEN
  522.             BEGIN
  523.  
  524.                GoToXY( 1 , 6 );
  525.  
  526.                WRITE('*** Line Busy.');
  527.                ClrEol;
  528.  
  529.                Write_Log('Line Busy.' , TRUE , FALSE );
  530.  
  531.                                    (* Hang up the phone *)
  532.                IF ( NOT Modem_Hold_Line ) THEN
  533.                   HangUpPhone;
  534.  
  535.                Window_Delay;
  536.  
  537.             END
  538.          ELSE IF Modem_NoC THEN
  539.             BEGIN
  540.  
  541.                GoToXY( 1 , 6 );
  542.  
  543.                WRITE('*** No Answer.');
  544.                ClrEol;
  545.  
  546.                Write_Log('No Answer.' , TRUE , FALSE );
  547.  
  548.                                    (* Hang up the phone *)
  549.  
  550.                IF ( NOT Modem_Hold_Line ) THEN
  551.                   HangUpPhone;
  552.  
  553.                Window_Delay;
  554.  
  555.             END;
  556.  
  557.       END  (* Phone number gotten *);
  558.  
  559.    TextColor( Menu_Text_Color );
  560.  
  561.    IF ( Connection_Made AND ( NOT Quit ) ) THEN
  562.       BEGIN  (* Connection made *)
  563.  
  564.                                    (* Alter baud rate if modem signals it *)
  565.  
  566.          IF ( Alter_Baud_Rate AND ( LENGTH( Modem_Connect ) > 0 ) ) THEN
  567.             Do_Baud_Detection;
  568.  
  569.          Restore_Screen_And_Colors( Local_Save_5 );
  570.  
  571.          ConMess := 'Connection established at ' + IToS( Baud_Rate ) +
  572.                     ',' + Parity + ',' + IToS( Data_Bits ) + ',' +
  573.                     IToS( Stop_Bits );
  574.  
  575.          WRITELN;
  576.          Write_Log( ConMess, TRUE , TRUE );
  577.  
  578.                                    (* Remove this number from list, if any *)
  579.  
  580.          IF ( N_Dial_Nos > 0 ) THEN
  581.             BEGIN
  582.                FOR I := ( I_Dial_Nos + 1 ) TO N_Dial_Nos DO
  583.                   Dial_Nos[I-1] := Dial_Nos[I];
  584.                DEC( N_Dial_Nos );
  585.             END;
  586.                                    (* Reset other stuff like script, etc. *)
  587.  
  588.          IF ( Phone_Entry_Number > 0 ) THEN
  589.             Reset_Other_Params( Phone_Entry_Data , Phone_Entry_Number );
  590.  
  591.       END (* Connection made *);
  592.  
  593. END   (* Perform_The_Dial *);
  594.  
  595. (*----------------------------------------------------------------------*)
  596.  
  597. BEGIN (* Dial_A_Number *)
  598.  
  599.    Manual_Dial := FALSE;
  600.    Quit        := FALSE;
  601.    Got_Num     := FALSE;
  602.  
  603.    OK_Redial := ( Re_Dial AND ( ( Phone_Number <> '' ) OR
  604.                                 ( N_Dial_Nos    > 0  ) ) );
  605.  
  606.    IF OK_Redial THEN
  607.       Dial_Title := 'Redialing'
  608.    ELSE
  609.       Dial_Title := 'Dialing';
  610.  
  611.    Save_Partial_Screen( Local_Save_5, 1, 1, Max_Screen_Col, 24 );
  612.  
  613.    IF ( NOT OK_Redial ) (* AND ( N_Dial_Nos <= 0 ) *) THEN
  614.       BEGIN  (* Not a redial *)
  615.  
  616.                                    (* No dialing string given -- display *)
  617.                                    (* directory.                         *)
  618.  
  619.          IF LENGTH( Dialing_String ) = 0 THEN
  620.             BEGIN
  621.  
  622.                Display_Phone_Numbers( Entry_String, Phone_Number,
  623.                                       Prefix_Str, Postfix_Str, Quit );
  624.  
  625.                IF Dialer_Carrier_Detect OR Quit OR ReDial AND
  626.                   ( ( LENGTH( Phone_Number ) = 0 ) AND
  627.                     ( N_Dial_Nos = 0             )     ) THEN
  628.                   BEGIN
  629.                      Restore_Screen_And_Colors( Local_Save_5 );
  630.                      EXIT;
  631.                   END
  632.                ELSE
  633.                   Got_Num := TRUE;
  634.  
  635.             END
  636.          ELSE                      (* Dialing string provided *)
  637.             BEGIN
  638.                SNumber     := Dialing_String;
  639.                Prefix_Str  := '';
  640.                Postfix_Str := '';
  641.                FOR I := 1 TO 25 DO
  642.                   Phone_Entry_Data.Phone_Name[I] := ' ';
  643.             END;
  644.  
  645.          IF ( NOT Quit ) THEN
  646.             IF ( NOT Got_Num ) THEN
  647.                Convert_Entry_To_Number;
  648.  
  649.       END  (* Not a redial *);
  650.  
  651. {--------Removed the following check
  652.    IF ( Dialer_Carrier_Detect AND ( NOT Quit ) ) THEN
  653.       BEGIN
  654.          Save_Partial_Screen( Local_Save_3, 10, 5, 60, 8 );
  655.          Draw_Menu_Frame( 10, 5, 60, 8, Menu_Frame_Color, Menu_Title_Color,
  656.                           Menu_Text_Color + Blink, '' );
  657.          WRITE('Session already in progress, dialing cancelled.');
  658.          Window_Delay;
  659.          Restore_Screen_And_Colors( Local_Save_3 );
  660.          Restore_Screen_And_Colors( Local_Save_5 );
  661.          EXIT;
  662.       END;
  663. -----------}
  664.                                    (* Do actual dialing *)
  665.  
  666.    IF ( N_Dial_Nos = 0 ) (* OR ( NOT OK_Redial ) *) THEN
  667.  
  668.                                    (* Single entry *)
  669.       Perform_The_Dial
  670.    ELSE
  671.       REPEAT
  672.                                    (* Get next # in dialing list *)
  673.  
  674.          IF ( I_Dial_Nos >= 0 ) THEN
  675.             BEGIN
  676.                INC( I_Dial_Nos );
  677.                IF ( I_Dial_Nos > N_Dial_Nos ) THEN
  678.                   I_Dial_Nos := 1;
  679.             END
  680.          ELSE
  681.             I_Dial_Nos := (-I_Dial_Nos);
  682.  
  683.          SNumber      := Dial_Nos[I_Dial_Nos].Number;
  684.          Redial_Count := Dial_Nos[I_Dial_Nos].Tries;
  685.          OK_Redial    := ( Redial_Count > 0 );
  686.          Manual_Dial  := FALSE;
  687.          Dial_Title   := 'Dialing';
  688.          Prefix_Str   := '';
  689.          Postfix_Str  := '';
  690.                                    (* Convert to dialable form *)
  691.          Convert_Entry_To_Number;
  692.                                    (* Evict any dialing return *)
  693.          Async_Purge_Buffer;
  694.                                    (* Do the dialing           *)
  695.          Perform_The_Dial;
  696.                                    (* Increment count of dialing attempts *)
  697.  
  698.          INC( Dial_Nos[I_Dial_Nos].Tries );
  699.  
  700.          IF ( NOT Connection_Made ) AND Script_File_Mode THEN
  701.             Quit := TRUE;
  702.  
  703.       UNTIL ( Connection_Made OR Quit OR ESC_Hit );
  704.  
  705.                                    (* Restore previous screen *)
  706.                                    (* if not connected        *)
  707.  
  708.    IF ( NOT Connection_Made ) THEN
  709.       Restore_Screen_And_Colors( Local_Save_5 )
  710.    ELSE
  711.       IF ( N_Dial_Nos > 0 ) THEN
  712.          Signal_Connection;
  713.                                    (* Make sure phone hung up *)
  714.                                    (* if unsuccessful dial    *)
  715.    IF Quit THEN
  716.       IF ( NOT Modem_Hold_Line ) THEN
  717.          HangUpPhone;
  718.  
  719. END   (* Dial_A_Number *);
  720.  
  721. (*----------------------------------------------------------------------*)
  722. (*          Handle_Redial --- Handle Redial after dialing attempt made  *)
  723. (*----------------------------------------------------------------------*)
  724.  
  725. PROCEDURE Handle_Redial( VAR MDelay : LONGINT;
  726.                          VAR Done   : BOOLEAN );
  727.  
  728. (*----------------------------------------------------------------------*)
  729. (*                                                                      *)
  730. (*     Procedure:  Handle_Redial                                        *)
  731. (*                                                                      *)
  732. (*     Purpose:    Handles redial after dialing attempt made.           *)
  733. (*                                                                      *)
  734. (*     Calling Sequence:                                                *)
  735. (*                                                                      *)
  736. (*        Handle_Redial( VAR MDelay : LONGINT; VAR Done : BOOLEAN );    *)
  737. (*                                                                      *)
  738. (*           MDelay --- Initial redial delay time                       *)
  739. (*           Done   --- TRUE if redial attempt successful               *)
  740. (*                                                                      *)
  741. (*     Calls:                                                           *)
  742. (*                                                                      *)
  743. (*        TimeOfDay                                                     *)
  744. (*        TimeDiff                                                      *)
  745. (*        Dialer_Carrier_Detect                                         *)
  746. (*        Clear_Window                                                  *)
  747. (*                                                                      *)
  748. (*----------------------------------------------------------------------*)
  749.  
  750. VAR
  751.    RTimer       : LONGINT;
  752.    DTimer       : LONGINT;
  753.    PTimer       : LONGINT;
  754.    OTimer       : LONGINT;
  755.    Rchar        : CHAR;
  756.    MDnew        : LONGINT;
  757.    Ypos         : INTEGER;
  758.    Local_Save_5 : Saved_Screen_Ptr;
  759.    Redial_Name  : AnyStr;
  760.    Ring_Detect  : BOOLEAN;
  761.  
  762. BEGIN (* Handle_Redial *)
  763.                                    (* If connection established, done *)
  764.    Done        := Connection_Made;
  765.                                    (* Phone shouldn't be ringing now  *)
  766.    Ring_Detect := FALSE;
  767.                                    (* Otherwise, wait for specified   *)
  768.                                    (* modem delay                     *)
  769.    IF ( NOT Done ) THEN
  770.       BEGIN
  771.  
  772.          Redial_Name := TRIM( 'Redialing ' + Phone_Entry_Data.Phone_Name );
  773.  
  774.          Draw_Titled_Box( Local_Save_5, 10, 10, 60, 16, Redial_Name );
  775.  
  776.          RTimer := TimeOfDay;
  777.  
  778.          Clear_Window;
  779.  
  780.          Ypos := WhereY;
  781.  
  782.          TextColor( Menu_Text_Color_2 );
  783.          WRITE  (' Seconds to next redial: ');
  784.          TextColor( Menu_Text_Color );
  785.          WRITELN( TRUNC( MDelay ) );
  786.  
  787.          TextColor( Menu_Text_Color_2 );
  788.          WRITE  (' R');
  789.          TextColor( Menu_Text_Color );
  790.          WRITE  (' = redial now   ');
  791.          TextColor( Menu_Text_Color_2 );
  792.          WRITE  ('Esc');
  793.          TextColor( Menu_Text_Color );
  794.          WRITE  (' = stop   ');
  795.          TextColor( Menu_Text_Color_2 );
  796.          WRITE  ('C');
  797.          TextColor( Menu_Text_Color );
  798.          WRITE  (' = change delay.');
  799.  
  800.          Rchar  := ' ';
  801.          PTimer := MDelay;
  802.          OTimer := PTimer;
  803.  
  804.          REPEAT
  805.  
  806.             IF PTimer <> OTimer THEN
  807.                BEGIN
  808.                   GoToXY( 26 , YPos );
  809.                   WRITE( TRUNC( PTimer ) );
  810.                   ClrEol;
  811.                   OTimer := PTimer;
  812.                END;
  813.  
  814.             IF PibTerm_KeyPressed THEN
  815.                BEGIN
  816.  
  817.                   Read_Kbd( Rchar );
  818.  
  819.                   IF UpCase( Rchar ) = 'C' THEN
  820.                      BEGIN
  821.                         GotoXY( 1 , 3 );
  822.                         TextColor( Menu_Text_Color_2 );
  823.                         WRITE  (' Enter new delay: ');
  824.                         ClrEol;
  825.                         TextColor( Menu_Text_Color );
  826.                         MDNew := TRUNC( MDelay );
  827.                         IF Read_Number( MDNew , TRUE , MDNew ) THEN
  828.                            MDelay := MDNew;
  829.                         GoToXY( 1 , 3 );
  830.                         ClrEol;
  831.                      END
  832.                   ELSE IF ( Rchar = CHR( ESC ) ) THEN
  833.                      Rchar := 'X';
  834.  
  835.                END
  836.             ELSE
  837.                GiveAwayTime( 2 );
  838.  
  839.             DTimer := TimeDiff( RTimer , TimeOfDay );
  840.             PTimer := MDelay - DTimer;
  841.  
  842.             IF PTimer <= 0 THEN
  843.                PTimer := 0;
  844.  
  845.             Ring_Detect := Async_Ring_Detect;
  846.  
  847.          UNTIL ( DTimer > MDelay ) OR
  848.                ( Ring_Detect     ) OR
  849.                ( UpCase( Rchar ) IN ['R','X'] );
  850.  
  851.          Done := ( UpCase(Rchar) = 'X' ) OR Ring_Detect;
  852.  
  853.          IF Ring_Detect THEN
  854.             BEGIN
  855.                GoToXY( 1 , 4 );
  856.                TextColor( Menu_Text_Color_2 );
  857.                WRITE('Ring detected, redial stopped.');
  858.                Window_Delay;
  859.             END;
  860.  
  861.          Restore_Screen_And_Colors( Local_Save_5 );
  862.  
  863.       END (* NOT Done *)
  864.    ELSE
  865.       IF ( NOT ( Script_File_Mode OR Read_In_Script ) AND Attended_Mode ) THEN
  866.          Signal_Connection;
  867.  
  868. END   (* Handle_Redial *);
  869.  
  870. (*----------------------------------------------------------------------*)
  871. (*          Redial_A_Number --- Redial last phone number dialed         *)
  872. (*----------------------------------------------------------------------*)
  873.  
  874. PROCEDURE Redial_A_Number;
  875.  
  876. (*----------------------------------------------------------------------*)
  877. (*                                                                      *)
  878. (*     Procedure:  Redial_A_Number                                      *)
  879. (*                                                                      *)
  880. (*     Purpose:    Redials last number dialed (if any).                 *)
  881. (*                                                                      *)
  882. (*     Calling Sequence:                                                *)
  883. (*                                                                      *)
  884. (*        Redial_A_Number;                                              *)
  885. (*                                                                      *)
  886. (*     Calls:                                                           *)
  887. (*                                                                      *)
  888. (*        Dial_A_Number                                                 *)
  889. (*        TimeOfDay                                                     *)
  890. (*        TimeDiff                                                      *)
  891. (*        Dialer_Carrier_Detect                                         *)
  892. (*        Clear_Window                                                  *)
  893. (*        Handle_Redial                                                 *)
  894. (*                                                                      *)
  895. (*----------------------------------------------------------------------*)
  896.  
  897. VAR
  898.    Done         : BOOLEAN;
  899.    Quit         : BOOLEAN;
  900.    MDelay       : LONGINT;
  901.  
  902. BEGIN (* Redial_A_Number *)
  903.                                    (* Only redial if no current session *)
  904.  
  905.    Done         := Dialer_Carrier_Detect OR ( Phone_Number = '' );
  906.    MDelay       := Modem_Redial_Delay;
  907.    Redial_Count := 0;
  908.  
  909.    WHILE( NOT ( Done OR Connection_Made ) ) DO
  910.       BEGIN
  911.                                    (* Increment redial  *)
  912.  
  913.          Redial_Count := Redial_Count + 1;
  914.  
  915.                                    (* Redial the number *)
  916.  
  917.          Dial_A_Number( TRUE , Quit );
  918.  
  919.                                    (* Handle connection if any *)
  920.  
  921.          Handle_Redial( MDelay , Done );
  922.  
  923.       END (* NOT ( Done OR Connection_Made ) *);
  924.  
  925. END   (* Redial_A_Number *);
  926.  
  927. (*------------------------- PIBDIALER --------------------------------*)
  928.  
  929. BEGIN (* PibDialer *)
  930.                                    (* Choose prompt style            *)
  931.  
  932.    Use_Short_Prompt   := Use_Short_Dial_Menu;
  933.    Dial_Search_String := '';
  934.    Connection_Made    := FALSE;
  935.  
  936.                                    (* Choose regular dial or re-dial *)
  937.    CASE ReDial OF
  938.  
  939.       FALSE:  REPEAT
  940.                  Redial_Count        := 0;
  941.                  First_Display_Time  := TRUE;
  942.                  Dial_A_Number( FALSE , Quit );
  943.                  Quit := Quit OR Script_File_Mode;
  944.                  IF ( ReDial AND ( NOT Quit ) ) THEN
  945.                     BEGIN
  946.                        ReDial_A_Number;
  947.                        Redial := FALSE;
  948.                     END;
  949.               UNTIL ( Connection_Made OR Quit );
  950.  
  951.       TRUE:   BEGIN
  952.                  First_Display_Time  := TRUE;
  953.                  IF ( N_Dial_Nos > 0 ) THEN
  954.                     Dial_A_Number( TRUE , Quit )
  955.                  ELSE
  956.                     BEGIN
  957.                        IF ( Phone_Number = '' ) THEN
  958.                           Dial_A_Number( FALSE , Quit );
  959.                        ReDial_A_Number;
  960.                     END;
  961.               END;
  962.  
  963.    END (* CASE *);
  964.                                    (* Reset timer if connection made; *)
  965.                                    (* also make sure no script exec   *)
  966.                                    (* unless carrier detect.          *)
  967.    IF Connection_Made THEN
  968.       Dialing_Start_Time := TimeOfDay
  969.    ELSE
  970.       Read_In_Script := FALSE;
  971.  
  972.    Script_Dialed := Read_In_Script;
  973.  
  974. END   (* PibDialer *);
  975.