home *** CD-ROM | disk | FTP | other *** search
/ Power Programming / powerprogramming1994.iso / progtool / pibterm / pibt41s4.arc / RECEIVEA.MOD < prev    next >
Text File  |  1988-03-23  |  11KB  |  364 lines

  1. (*----------------------------------------------------------------------*)
  2. (*                Receive_Ascii_File --- Download ASCII file            *)
  3. (*----------------------------------------------------------------------*)
  4.  
  5. PROCEDURE Receive_Ascii_File;
  6.  
  7. (*----------------------------------------------------------------------*)
  8. (*                                                                      *)
  9. (*     Procedure:  Receive_Ascii_File                                   *)
  10. (*                                                                      *)
  11. (*     Purpose:    Downloads ASCII file to PC                           *)
  12. (*                                                                      *)
  13. (*     Calling Sequence:                                                *)
  14. (*                                                                      *)
  15. (*        Receive_Ascii_File;                                           *)
  16. (*                                                                      *)
  17. (*     Calls:   PibTerm_KeyPressed                                      *)
  18. (*              Async_Send                                              *)
  19. (*              Async_Receive                                           *)
  20. (*                                                                      *)
  21. (*----------------------------------------------------------------------*)
  22.  
  23. VAR
  24.    Ch            : CHAR;
  25.    Fin           : BOOLEAN;
  26.    X             : INTEGER;
  27.    Y             : INTEGER;
  28.    Line_Count    : LONGINT;
  29.    Byte_Count    : LONGINT;
  30.    Full_Name     : AnyStr;
  31.    Ascii_Display : BOOLEAN;
  32.    Use_Ch        : BOOLEAN;
  33.    I             : INTEGER;
  34.    Max_DLine     : INTEGER;
  35.    R_Error       : BOOLEAN;
  36.    AFile         : TEXT;
  37.    Divider_Line  : INTEGER;
  38.    Mess_Text     : AnyStr;
  39.    Ascii_Title   : AnyStr;
  40.    Alt_R_Hit     : BOOLEAN;
  41.    SBSize        : STRING[20];
  42.    SLSize        : STRING[20];
  43.    OK_Disp_Size  : BOOLEAN;
  44.  
  45. (*----------------------------------------------------------------------*)
  46. (* Initialize_Ascii_Receive_Display --- Start up transfer status window *)
  47. (*----------------------------------------------------------------------*)
  48.  
  49. PROCEDURE Initialize_Ascii_Receive_Display;
  50.  
  51. VAR
  52.    I: INTEGER;
  53.  
  54. BEGIN (* Initialize_Ascii_Receive_Display *)
  55.  
  56.                                    (* Figure display size              *)
  57.    IF Do_Status_Line THEN
  58.       Max_DLine := PRED( Max_Screen_Line )
  59.    ELSE
  60.       Max_DLine := Max_Screen_Line;
  61.  
  62.    Divider_Line := 13;
  63.  
  64.                                    (* Save current screen contents     *)
  65.    Save_Screen( Saved_Screen );
  66.                                    (* Open display window for received *)
  67.                                    (* text lines.                      *)
  68.    IF Ascii_Display THEN
  69.       BEGIN
  70.  
  71.          TextColor( Menu_Text_Color );
  72.  
  73.          PibTerm_Window( 1, 1, Max_Screen_Col, Max_DLine );
  74.          GoToXY( 1 , Divider_Line );
  75.  
  76.          FOR I := 1 TO 25 DO WRITE('=');
  77.  
  78.          TextColor( Menu_Text_Color_2 );
  79.          WRITE('Received text displayed below');
  80.  
  81.          TextColor( Menu_Text_Color );
  82.          FOR I := 1 TO 25 DO WRITE('=');
  83.  
  84.       END;
  85.                                    (* Open display window for transfer  *)
  86.  
  87.    Draw_Menu_Frame( 15, 4, 78, 11, Menu_Frame_Color, Menu_Title_Color,
  88.                     Menu_Text_Color, Ascii_Title );
  89.  
  90.                                    (* Headings for status information *)
  91.    TextColor( Menu_Text_Color_2 );
  92.    PibTerm_Window( 16, 5, 77, 10 );
  93.    GoToXY( 1 , 1 );
  94.    WRITELN(' Lines received: ');
  95.    WRITELN(' Bytes received: ');
  96.    WRITELN(' ');
  97.  
  98.    IF Ascii_Display THEN
  99.       BEGIN
  100.          PibTerm_Window( 1, SUCC( Divider_Line ), Max_Screen_Col, Max_DLine );
  101.          GoToXY( 1 , 1 );
  102.          Clear_Window;
  103.       END;
  104.  
  105. END   (* Initialize_Ascii_Receive_Display *);
  106.  
  107. (*----------------------------------------------------------------------*)
  108. (*        Flip_Display_Status --- turn status display on/off            *)
  109. (*----------------------------------------------------------------------*)
  110.  
  111. PROCEDURE Flip_Display_Status;
  112.  
  113. BEGIN (* Flip_Display_Status *)
  114.  
  115.    CASE Display_Status OF
  116.  
  117.       TRUE:   BEGIN
  118.                                    (* Indicate no display   *)
  119.  
  120.                  Display_Status := FALSE;
  121.  
  122.                                    (* Remove Ascii window  *)
  123.  
  124.                  Restore_Screen_And_Colors( Saved_Screen );
  125.  
  126.               END;
  127.  
  128.       FALSE:  BEGIN
  129.                                    (* Indicate display will be done *)
  130.  
  131.                  Display_Status := TRUE;
  132.                  Ascii_Display  := Ascii_Show_Text;
  133.  
  134.                                    (* Set up transfer status window *)
  135.  
  136.                  Initialize_Ascii_Receive_Display;
  137.  
  138.               END;
  139.  
  140.    END (* CASE *);
  141.  
  142. END   (* Flip_Display_Status *);
  143.  
  144. (*----------------------------------------------------------------------*)
  145. (*      Activate_Status_Window --- switch to status display window      *)
  146. (*----------------------------------------------------------------------*)
  147.  
  148. PROCEDURE Activate_Status_Window;
  149.  
  150. BEGIN (* Activate_Status_Window *)
  151.  
  152.    IF Ascii_Display THEN
  153.       BEGIN
  154.          X := WhereX;
  155.          Y := WhereY;
  156.          PibTerm_Window( 16, 5, 77, 10 );
  157.       END;
  158.  
  159. END   (* Activate_Status_Window *);
  160.  
  161. (*----------------------------------------------------------------------*)
  162. (*         Activate_Text_Window --- switch to text display window       *)
  163. (*----------------------------------------------------------------------*)
  164.  
  165. PROCEDURE Activate_Text_Window;
  166.  
  167. BEGIN (* Activate_Text_Window *)
  168.  
  169.    IF Ascii_Display THEN
  170.       BEGIN
  171.          PibTerm_Window( 1, SUCC( Divider_Line ), Max_Screen_Col, Max_DLine );
  172.          GoToXY( X , Y );
  173.       END;
  174.  
  175. END   (* Activate_Text_Window *);
  176.  
  177. (*----------------------------------------------------------------------*)
  178. (*  Update_Ascii_Receive_Display --- Update display of Xmodem reception *)
  179. (*----------------------------------------------------------------------*)
  180.  
  181. PROCEDURE  Update_Ascii_Receive_Display;
  182.  
  183. BEGIN (* Update_Ascii_Receive_Display *)
  184.  
  185.    Activate_Status_Window;
  186.  
  187.    TextColor( Menu_Text_Color );
  188.  
  189.    GoToXY( 17 , 1 );
  190.    WRITE( Line_Count:8 );
  191.    GoToXY( 17 , 2 );
  192.    WRITE( Byte_Count:8 );
  193.  
  194.    Activate_Text_Window;
  195.  
  196.    TextColor( Menu_Text_Color_2 );
  197.  
  198. END   (* Update_Ascii_Receive_Display *);
  199.  
  200. (*----------------------------------------------------------------------*)
  201.  
  202. BEGIN (* Receive_Ascii_File *)
  203.                                    (* Initialize *)
  204.    Fin           := FALSE;
  205.    Line_Count    := 0;
  206.    Byte_Count    := 0;
  207.    X             := 1;
  208.    Y             := 1;
  209.    Ascii_Display := Ascii_Show_Text;
  210.    Use_Ch        := TRUE;
  211.    R_Error       := FALSE;
  212.    Alt_R_Hit     := FALSE;
  213.                                    (* Remove cursor                    *)
  214.    CursorOff;
  215.                                    (* Initialize transfer display      *)
  216.  
  217.    Ascii_Title := 'Receive file ' + FileName + ' using ASCII';
  218.  
  219.    Initialize_Ascii_Receive_Display;
  220.  
  221.    Write_Log( Ascii_Title, FALSE, FALSE );
  222.  
  223.                                    (* Open reception file *)
  224.  
  225.    Add_Path( FileName, Download_Dir_Path, Full_Name );
  226.  
  227.    ASSIGN    ( Afile, Full_Name );
  228.    SetTextBuf( AFile , Sector_Data );
  229.    REWRITE   ( AFile );
  230.  
  231.    R_Error := ( INT24Result <> 0 );
  232.  
  233.    REPEAT
  234.                                    (* Check for Alt_R -- ends transfer; *)
  235.                                    (* Shift_Tab flips display status    *)
  236.       WHILE PibTerm_KeyPressed DO
  237.          BEGIN
  238.             Read_Kbd( Ch );
  239.             IF ( Ch = CHR( ESC ) ) AND PibTerm_KeyPressed THEN
  240.                BEGIN
  241.                   Read_Kbd( Ch );
  242.                   IF ORD( Ch ) = Alt_R THEN
  243.                      BEGIN
  244.                         Fin       := TRUE;
  245.                         Alt_R_Hit := TRUE;
  246.                      END
  247.                   ELSE IF ORD( Ch ) = Shift_Tab THEN
  248.                      Flip_Display_Status
  249.                   ELSE
  250.                      Handle_Function_Key( Ch );
  251.                END
  252.             ELSE
  253.                Async_Send( Ch );
  254.          END;
  255.  
  256.       IF Async_Receive( Ch ) THEN
  257.          BEGIN
  258.  
  259.             IF Auto_Strip_High_Bit THEN
  260.                Ch := CHR( ORD( Ch ) AND $7F );
  261.  
  262.             IF Ascii_Translate THEN
  263.                BEGIN
  264.                   Ch     := TrTab[ Ch ];
  265.                   Use_Ch := ( ORD( Ch ) <> NUL );
  266.                END;
  267.  
  268.             IF Use_Ch THEN
  269.                BEGIN
  270.  
  271.                   WRITE( AFile , Ch );
  272.                   R_Error := R_Error OR ( INT24Result <> 0 );
  273.  
  274.                   IF Ascii_Display THEN
  275.                      WRITE( Ch );
  276.  
  277.                   INC( Byte_Count );
  278.  
  279.                   IF ( Ch = CHR( CR ) ) THEN
  280.                      BEGIN
  281.  
  282.                         INC( Line_Count );
  283.  
  284.                         IF Display_Status THEN
  285.                            Update_Ascii_Receive_Display;
  286.  
  287.                         IF Add_LF THEN
  288.                            BEGIN
  289.  
  290.                               WRITE( AFile , CHR( LF ) );
  291.                               R_Error := R_Error OR ( INT24Result <> 0 );
  292.  
  293.                               IF Ascii_Display THEN
  294.                                  WRITE( CHR( LF ) );
  295.  
  296.                               INC( Byte_Count );
  297.  
  298.                            END;
  299.  
  300.                      END
  301.                   ELSE IF Ascii_Use_CtrlZ THEN
  302.                      IF ( Ch = ^Z ) THEN
  303.                         Fin := TRUE;
  304.  
  305.                END;
  306.  
  307.          END;
  308.  
  309.       Fin := Fin OR Async_Carrier_Drop OR R_Error;
  310.  
  311.                                    (* Print character from spooled file *)
  312.       IF Print_Spooling THEN
  313.          Print_Spooled_File;
  314.  
  315.    UNTIL ( Fin );
  316.                                    (* Ensure status window is up *)
  317.    IF ( NOT Display_Status ) THEN
  318.       Flip_Display_Status;
  319.  
  320.    Activate_Status_Window;
  321.                                    (* Get termination status message *)
  322.    OK_Disp_Size := FALSE;
  323.  
  324.    IF Async_Carrier_Drop THEN
  325.       Mess_Text := 'Carrier dropped, receive cancelled.'
  326.    ELSE IF Alt_R_Hit THEN
  327.       Mess_Text := 'Alt-R hit, receive stopped.'
  328.    ELSE IF ( NOT R_Error ) THEN
  329.       BEGIN
  330.          Mess_Text    := 'Receive completed.';
  331.          OK_Disp_Size := TRUE;
  332.       END
  333.    ELSE
  334.       Mess_Text := 'Error in receive.';
  335.  
  336.                                    (* Display termination status message *)
  337.    IF OK_Disp_Size THEN
  338.       BEGIN
  339.  
  340.          STR( Byte_Count , SBSize );
  341.          STR( Line_Count , SLSize );
  342.  
  343.          Write_Log('Size of file received was ' + SBSize + ' bytes, ' +
  344.                    SLSize + ' lines', TRUE, FALSE );
  345.  
  346.       END;
  347.  
  348.    GoToXY( 1 , 4 );
  349.    Write_Log( Mess_Text , TRUE , TRUE );
  350.  
  351.    Window_Delay;
  352.  
  353.    CLOSE( AFile );
  354.  
  355.    R_Error := ( INT24Result <> 0 );
  356.  
  357.                                    (* Remove this window            *)
  358.  
  359.    Restore_Screen_And_Colors( Saved_Screen );
  360.                                    (* Reset cursor                  *)
  361.    CursorOn;
  362.  
  363. END   (* Receive_Ascii_File *);
  364.