home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / library / dos / pibsoft / terminal / source / pibgossi.mod < prev    next >
Encoding:
Text File  |  1988-02-21  |  12.0 KB  |  322 lines

  1. (*--------------------------------------------------------------------------*)
  2. (*        Emulate_Gossip --- Gossip Mode from PibTerm to PibTerm            *)
  3. (*--------------------------------------------------------------------------*)
  4.  
  5. PROCEDURE Emulate_Gossip;
  6.  
  7. (*--------------------------------------------------------------------------*)
  8. (*                                                                          *)
  9. (*     Procedure:  Emulate_Gossip                                           *)
  10. (*                                                                          *)
  11. (*     Purpose:    Provides split-screen gossip mode, dumb terminal         *)
  12. (*                 emulation.                                               *)
  13. (*                                                                          *)
  14. (*     Calling sequence:                                                    *)
  15. (*                                                                          *)
  16. (*        Emulate_Gossip;                                                   *)
  17. (*                                                                          *)
  18. (*     Calls:                                                               *)
  19. (*                                                                          *)
  20. (*        Async_Receive                                                     *)
  21. (*        Process_Command                                                   *)
  22. (*        PibTerm_KeyPressed                                                *)
  23. (*        Async_Send                                                        *)
  24. (*        Display_Character                                                 *)
  25. (*                                                                          *)
  26. (*     Called by:                                                           *)
  27. (*                                                                          *)
  28. (*        PibTerm (Main)                                                    *)
  29. (*                                                                          *)
  30. (*--------------------------------------------------------------------------*)
  31.  
  32. VAR
  33.    MyX                  : INTEGER;
  34.    MyY                  : INTEGER;
  35.    YourX                : INTEGER;
  36.    YourY                : INTEGER;
  37.    Save_Local           : BOOLEAN;
  38.    Save_AutoWrap        : BOOLEAN;
  39.    I                    : INTEGER;
  40.    Comm_Ch              : CHAR;
  41.    Done                 : BOOLEAN;
  42.    My_Last_Column_Hit   : BOOLEAN;
  43.    Your_Last_Column_Hit : BOOLEAN;
  44.    G_Window_Size        : INTEGER;
  45.    Divider_Line         : INTEGER;
  46.    Top_Of_Bottom        : INTEGER;
  47.    Input_Line           : AnyStr;
  48.    Save_Ansi_Last_Line  : INTEGER;
  49.    Reset_Requested      : BOOLEAN;
  50.    ClrScr_Req           : BOOLEAN;
  51.    TT                   : Transfer_Type;
  52.  
  53. (*--------------------------------------------------------------------------*)
  54. (*       Display_Status_Message --- Display message for line mode           *)
  55. (*--------------------------------------------------------------------------*)
  56.  
  57. PROCEDURE Display_Status_Message( Status_Text : AnyStr );
  58.  
  59. VAR
  60.    Save_My_X: INTEGER;
  61.    Save_My_Y: INTEGER;
  62.  
  63. BEGIN (* Display_Status_Message *)
  64.  
  65.    Save_My_X := MyX;
  66.    Save_My_Y := MyY;
  67.  
  68.    WriteSXY( Status_Text, 55, Divider_Line, Global_Text_Attribute );
  69.  
  70.    MyX := Save_My_X;
  71.    MyY := Save_My_Y;
  72.  
  73. END   (* Display_Status_Message *);
  74.  
  75. (*--------------------------------------------------------------------------*)
  76. (*  Do_Gossip_Line_Mode --- Process keyboard input for gossip line mode     *)
  77. (*--------------------------------------------------------------------------*)
  78.  
  79. PROCEDURE Do_Gossip_Line_Mode;
  80.  
  81. VAR
  82.    Ch                    : CHAR;
  83.    Save_Gossip_Line_Mode : BOOLEAN;
  84.  
  85. BEGIN (* Do_Gossip_Line_Mode *)
  86.                                    (* Read in entire line *)
  87.    IF PibTerm_KeyPressed THEN
  88.       BEGIN
  89.  
  90.          PibTerm_Window( 1, Top_Of_Bottom, Max_Screen_Col, Ansi_Last_Line );
  91.          GoToXY( MyX, MyY );
  92.                                    (* Get first character *)
  93.          Read_Kbd( Comm_Ch );
  94.  
  95.          IF ( Comm_Ch = CHR( CR ) ) THEN
  96.             BEGIN
  97.                Display_Status_Message(' Sending line ====');
  98.                Async_Send_String( Input_Line );
  99.                Input_Line := '';
  100.                Display_Status_Message(' Line sent =======');
  101.             END
  102.          ELSE IF ( Comm_Ch = CHR( ESC ) ) THEN
  103.             BEGIN
  104.                Save_Gossip_Line_Mode := Gossip_Line_Mode;
  105.                Process_Command( Comm_Ch, FALSE, PibTerm_Command );
  106.                IF PibTerm_Command <> Null_Command THEN
  107.                   Execute_Command( PibTerm_Command, Done, FALSE );
  108.                IF ( Gossip_Line_Mode <> Save_Gossip_Line_Mode ) THEN
  109.                   IF Gossip_Line_Mode THEN
  110.                      Display_Status_Message(' Awaiting input ==' )
  111.                   ELSE
  112.                      Display_Status_Message('==================' );
  113.             END
  114.          ELSE
  115.             BEGIN
  116.                Display_Status_Message(' Reading keyboard ');
  117.                Input_Line := Comm_Ch;
  118.                Ch := Edit_String( Input_Line, 255, 1, 2, WhereY,
  119.                                   Max_Screen_Col, FALSE, 0 );
  120.                IF ( Ch <> CHR( ESC ) ) THEN
  121.                   BEGIN
  122.                      WRITELN;
  123.                      Input_Line := Input_Line + CHR( CR );
  124.                      Display_Status_Message(' Waiting to send =');
  125.                   END
  126.                ELSE
  127.                   BEGIN
  128.                      Input_Line := '';
  129.                      Display_Status_Message(' Input cancelled ==');
  130.                   END;
  131.             END;
  132.                                    (* Remember position! *)
  133.             MyX := WhereX;
  134.             MyY := WhereY;
  135.  
  136.          END;
  137.  
  138. END   (* Do_Gossip_Line_Mode *);
  139.  
  140. (*--------------------------------------------------------------------------*)
  141. (*  Do_Gossip_Character_Mode --- Process kbd input for gossip char. mode    *)
  142. (*--------------------------------------------------------------------------*)
  143.  
  144. PROCEDURE Do_Gossip_Character_Mode;
  145.  
  146. BEGIN (* Do_Gossip_Character_Mode *)
  147.  
  148.                                    (* Process local user's input      *)
  149.    IF PibTerm_KeyPressed THEN
  150.       BEGIN
  151.                                    (* Move to local input window *)
  152.                                    
  153.          PibTerm_Window( 1, Top_Of_Bottom, Max_Screen_Col, Ansi_Last_Line );
  154.          GoToXY( MyX, MyY );
  155.                                    (* Handle input character *)
  156.                                    
  157.          Handle_Keyboard_Input( Done , Reset_Requested , ClrScr_Req );
  158.  
  159.          IF ( Reset_Requested OR ClrScr_Req ) THEN
  160.             Clear_Window;
  161.  
  162.                                    (* Remember position! *)
  163.          MyX := WhereX;
  164.          MyY := WhereY;
  165.  
  166.       END (* PibTerm_KeyPressed *);
  167.  
  168. END   (* Do_Gossip_Character_Mode *);
  169.  
  170. (*--------------------------------------------------------------------------*)
  171.  
  172. BEGIN (* Emulate_Gossip *)
  173.                                    (* Ensure we're in text mode *)
  174.  
  175.    Init_Text_Terminal;
  176.                                    (* Set status line *)
  177.  
  178.    Set_Status_Line_Name(Short_Terminal_Name);
  179.  
  180.                                    (* Status line to last line *)
  181.    IF Do_Status_Line THEN
  182.       BEGIN
  183.          Ansi_Last_Line := PRED( Max_Screen_Line );
  184.          Write_To_Status_Line( Status_Line_Name, 1 );
  185.       END
  186.    ELSE
  187.       Ansi_Last_Line := Max_Screen_Line;
  188.  
  189.                                    (* Turn on local echo, set initial *)
  190.                                    (* positions for each user's       *)
  191.                                    (* message area.                   *)
  192.    Save_Local     := Local_Echo;
  193.    Local_Echo     := TRUE;
  194.    MyX            := 1;
  195.    MyY            := 1;
  196.    YourX          := 1;
  197.    YourY          := 1;
  198.    Done           := FALSE;
  199.    Input_Line     := '';
  200.    G_Window_Size  := Gossip_Window_Size;
  201.  
  202.                                    (* Ensure proper wrapping *)
  203.    My_Last_Column_Hit   := FALSE;
  204.    Your_Last_Column_Hit := FALSE;
  205.    Save_AutoWrap        := Auto_Wrap_Mode;
  206.    Auto_Wrap_Mode       := TRUE;
  207.  
  208.                                    (* Split screen into two parts:    *)
  209.                                    (* Upper for local user, lower for *)
  210.                                    (* remote user.                    *)
  211.  
  212.    PibTerm_Window( 1, 1, Max_Screen_Col, Ansi_Last_Line );
  213.    Clear_Window;
  214.                                    (* Print divider                   *)
  215.  
  216.    Divider_Line  := SUCC( G_Window_Size );
  217.    Top_Of_Bottom := SUCC( Divider_Line  );
  218.  
  219.    GoToXY( 1 , Divider_Line );
  220.  
  221.    FOR I := 1 TO 34 DO WRITE('=');
  222.    WRITE('Gossip Mode');
  223.    FOR I := 1 TO 35 DO WRITE('=');
  224.  
  225.    IF Gossip_Line_Mode THEN
  226.       Display_Status_Message(' Awaiting input ==' );
  227.  
  228.    Do_Script_Tests := Waitstring_Mode OR When_Mode OR
  229.                       WaitCount_Mode  OR WaitQuiet_Mode OR
  230.                       Script_Learn_Mode;
  231.  
  232.    REPEAT
  233.                                    (* Process local user's input      *)
  234.       IF Gossip_Line_Mode THEN
  235.          Do_Gossip_Line_Mode
  236.       ELSE
  237.          Do_Gossip_Character_Mode;
  238.                                    (* Process script file entry *)
  239.  
  240.       IF ( Script_File_Mode AND ( NOT ( Done OR Really_Wait_String ) ) ) THEN
  241.          BEGIN
  242.             Get_Script_Command( PibTerm_Command );
  243.             Execute_Command   ( PibTerm_Command , Done , TRUE );
  244.          END;
  245.                                    (* Hold everything while scroll lock on *)
  246.       IF Scroll_Lock_On THEN
  247.          Handle_Scroll_Lock;
  248.                                    (* Process remote user's input *)
  249.  
  250.       IF Async_Receive( Comm_Ch ) THEN
  251.  
  252.          BEGIN  (* Comm_Ch found *)
  253.  
  254.             Save_Ansi_Last_Line := Ansi_Last_Line;
  255.             Ansi_Last_Line      := G_Window_Size;
  256.  
  257.             PibTerm_Window( 1, 1, Max_Screen_Col, G_Window_Size );
  258.             GoToXY( YourX, YourY );
  259.  
  260.             Last_Column_Hit := Your_Last_Column_Hit;
  261.             Comm_Ch         := TrTab[ Comm_Ch ];
  262.  
  263.             CASE ORD( Comm_Ch ) OF
  264.  
  265.                SOH  :    IF Kermit_Autodownload THEN
  266.                             BEGIN
  267.                                Doing_Kermit_Autodown := TRUE;
  268.                                PibDownLoad( Kermit );
  269.                             END;
  270.  
  271.                CAN  :    IF Zmodem_Autodownload THEN
  272.                             BEGIN
  273.                                TT := Get_Zmodem_Type;
  274.                                IF ( TT <> None ) THEN
  275.                                   PibDownLoad( TT );
  276.                             END;
  277.  
  278.                ELSE   Display_Character( Comm_Ch );
  279.  
  280.             END (* CASE *);
  281.  
  282.             IF Do_Script_Tests THEN
  283.                Do_Script_Checks( Comm_Ch );
  284.  
  285.             Your_Last_Column_Hit := Last_Column_Hit;
  286.             Ansi_Last_Line       := Save_Ansi_Last_Line;
  287.  
  288.             YourX := WhereX;
  289.             YourY := WhereY;
  290.  
  291.          END (* Comm_Ch found *)
  292.                                    (* Check if waitstring time exhausted *)
  293.       ELSE
  294.          BEGIN
  295.             Async_Line_Status := Async_Line_Status AND $FD;
  296.             IF Really_Wait_String THEN
  297.                Check_Wait_String_Time;
  298.             IF ( NOT PibTerm_KeyPressed ) THEN
  299.                GiveAwayTime( 1 );
  300.          END;
  301.                                     (* Send saved line if at left margin *)
  302.       IF ( YourX = 1 ) THEN
  303.          IF ( LENGTH( Input_Line ) > 0 ) THEN
  304.             BEGIN
  305.                Display_Status_Message(' Sending line ====');
  306.                Async_Send_String( Input_Line );
  307.                Input_Line := '';
  308.                Display_Status_Message(' Line sent =======' );
  309.             END;
  310.  
  311.    UNTIL ( NOT Gossip_Mode_On ) OR Done;
  312.  
  313.                                   (* Restore single screen mode *)
  314.  
  315.    Local_Echo          := Save_Local;
  316.    Auto_Wrap_Mode      := Save_AutoWrap;
  317.  
  318.    PibTerm_Window( 1, 1, Max_Screen_Col, Ansi_Last_Line );
  319.    Clear_Window;
  320.  
  321. END    (* Emulate_Gossip *);
  322.