*copyc OSD$DEFAULT_PRAGMATS
MODULE iim$get_term_conn_defaults;

{ PURPOSE: This module provides the ring 2 interface which gets
{          the default connection attributes for the task.
{          The returned values are the values which will be the
{          defaults for subsequent files created within the task.

{  DESIGN: The values for the requested attributes are obtained from
{          the terminal connection table, in the case of standalone
{          connections, or from the attributes table pointed at by
{          iiv$terminal_request_ptr, for dual state.  These tables
{          are set/changed by CHATCD, IFP$CHANGE_TERM_CONN_DEFAULTS
{          or from the NAM/OS default attribute values at login.
{
{          Authored by V.L. Richardson on 3/01/86.

?? TITLE := 'MODULE iim$get_term_conn_defaults' ??

?? PUSH (LISTEXT := ON) ??
*copyc CLP$GET_ULTIMATE_CONNECTION
*copyc CLP$VALIDATE_NAME
*copyc CLV$STANDARD_FILES
*copyc IFE$ERROR_CODES
*copyc IIV$CONNECTION_DESC_PTR
*copyc IIV$INTERACTIVE_TERMINATED
*copyc IIV$INT_TASK_OPEN_FILE_COUNT
*copyc OSP$APPEND_STATUS_INTEGER
*copyc OSP$APPEND_STATUS_PARAMETER
*copyc OSP$SET_STATUS_ABNORMAL
*copyc PMP$GET_JOB_MODE
*copyc RMP$GET_DEVICE_CLASS
?? POP ??

?? NEWTITLE := 'PROCEDURE iip$get_term_conn_defaults', EJECT ??

  PROCEDURE [XDCL, #GATE] iip$get_term_conn_defaults (local_file_name:
    amt$local_file_name;
    VAR connection_attributes: ift$get_connection_attributes;
    VAR status: ost$status);

    VAR
      converted_name: ost$name,
      device_assigned: boolean,
      device_class: rmt$device_class,
      i: integer,
      job_mode: jmt$job_mode,
      k: integer,
      local_status: ost$status,
      set_of_term_conn_attr_keys: iit$set_of_term_conn_attr_keys,
      ultimate_name: ost$name,
      valid_name: boolean;

    status.normal := TRUE;

  { Convert and validate the file name.

    clp$validate_name (local_file_name, converted_name, valid_name);
    IF NOT valid_name THEN
      osp$set_status_abnormal (ifc$interactive_facility_id,
            ife$file_name_ill_formed, local_file_name, status);
      osp$append_status_parameter (osc$status_parameter_delimiter,
        'IFP$GET_TERM_CONN_DEFAULTS', status);
      RETURN;
    IFEND;

    clp$get_ultimate_connection (local_file_name, ultimate_name, status);
    IF NOT status.normal THEN
      RETURN;
    IFEND;

  { Verify that the file is assigned to a terminal device.

    rmp$get_device_class (ultimate_name, device_assigned, device_class,
          local_status);
    IF NOT local_status.normal THEN
      status := local_status;
      RETURN;
    ELSE
      IF (device_class <> rmc$terminal_device) AND (device_class <> rmc$network_device) THEN
        pmp$get_job_mode (job_mode, local_status);
        IF NOT local_status.normal THEN
          status := local_status;
          RETURN;
        ELSEIF (NOT (job_mode IN $iit$job_modes [jmc$interactive_connected,
               jmc$interactive_cmnd_disconnect, jmc$interactive_line_disconnect,
               jmc$interactive_sys_disconnect]) AND
               (((ultimate_name = clv$standard_files [clc$sf_job_input_file].path_handle_name) OR
               (ultimate_name = clv$standard_files [clc$sf_job_output_file].path_handle_name)) OR
               (ultimate_name = clv$standard_files [clc$sf_command_file].path_handle_name))) THEN
          osp$set_status_abnormal (ifc$interactive_facility_id,
               ife$current_job_not_interactive, 'IFP$GET_TERM_CONN_DEFAULTS',
               status);
          RETURN;
        ELSE
          osp$set_status_abnormal (ifc$interactive_facility_id,
                ife$file_name_not_terminal, converted_name, status);
          osp$append_status_parameter (osc$status_parameter_delimiter,
              'IFP$GET_TERM_CONN_DEFAULTS', status);
          RETURN;
        IFEND;
      IFEND;
    IFEND;

  { Validate the attribute keys.

    set_of_term_conn_attr_keys := - $iit$set_of_term_conn_attr_keys [];
    FOR i := LOWERBOUND (connection_attributes) TO UPPERBOUND
          (connection_attributes) DO
      IF NOT (connection_attributes [i].key IN set_of_term_conn_attr_keys)
            THEN
        osp$set_status_abnormal (ifc$interactive_facility_id,
              ife$unknown_attribute_key, '', status);
        k := ORD (connection_attributes [i].key);
        osp$append_status_integer (osc$status_parameter_delimiter, k, 10,
              FALSE, status);
        osp$append_status_parameter (osc$status_parameter_delimiter,
          'IFP$GET_TERM_CONN_DEFAULTS', status);
        RETURN;
      IFEND;
    FOREND;

    IF iiv$network_identifier = iic$cdcnet_network THEN

    { Get the requested attribute values from the connection table.

      FOR i := 1 TO UPPERBOUND (connection_attributes) DO
        CASE connection_attributes [i].key OF
        = ifc$attention_character_action =
          connection_attributes [i].attention_character_action := iiv$connection_desc_ptr^.
                default_connection_attributes.attention_character_action.value;
        = ifc$break_key_action =
          connection_attributes [i].break_key_action := iiv$connection_desc_ptr^.
                default_connection_attributes.break_key_action.value;
        = ifc$end_of_information =
          connection_attributes [i].end_of_information := iiv$connection_desc_ptr^.
                default_connection_attributes.end_of_information.value;
        = ifc$input_block_size =
          connection_attributes [i].input_block_size := iiv$connection_desc_ptr^.
                default_connection_attributes.input_block_size.value;
        = ifc$input_editing_mode =
          connection_attributes [i].input_editing_mode := iiv$connection_desc_ptr^.
                default_connection_attributes.input_editing_mode.value;
        = ifc$input_output_mode =
          connection_attributes [i].input_output_mode := iiv$connection_desc_ptr^.
                default_connection_attributes.input_output_mode.value;
        = ifc$input_timeout =
          connection_attributes [i].input_timeout := iiv$connection_desc_ptr^.
                default_connection_attributes.input_timeout.value;
        = ifc$input_timeout_length =
          connection_attributes [i].input_timeout_length := iiv$connection_desc_ptr^.
                default_connection_attributes.input_timeout_length.value;
        = ifc$input_timeout_purge =
          connection_attributes [i].input_timeout_purge := iiv$connection_desc_ptr^.
                default_connection_attributes.input_timeout_purge.value;
        = ifc$partial_char_forwarding =
          connection_attributes [i].partial_character_forwarding := iiv$connection_desc_ptr^.
                default_connection_attributes.partial_char_forwarding.value;
        = ifc$prompt_file =
          connection_attributes [i].prompt_file := iiv$connection_desc_ptr^.
                default_connection_attributes.prompt_file.value;
        = ifc$prompt_file_identifier =
          connection_attributes [i].prompt_file_identifier := iiv$connection_desc_ptr^.
                default_connection_attributes.prompt_file_identifier.value;
        = ifc$prompt_string =
          connection_attributes [i].prompt_string := iiv$connection_desc_ptr^.
                default_connection_attributes.prompt_string.value;
        = ifc$store_backspace_character =
          connection_attributes [i].store_backspace_character := iiv$connection_desc_ptr^.
                default_connection_attributes.store_backspace_character.value;
        = ifc$store_nuls_dels =
          connection_attributes [i].store_nuls_dels := iiv$connection_desc_ptr^.
                default_connection_attributes.store_nuls_dels.value;
        = ifc$trans_character_mode =
          connection_attributes [i].trans_character_mode := iiv$connection_desc_ptr^.
                default_connection_attributes.trans_character_mode.value;
        = ifc$trans_forward_character =
          connection_attributes [i].trans_forward_character := iiv$connection_desc_ptr^.
                default_connection_attributes.trans_forward_character.value;
        = ifc$trans_length_mode =
          connection_attributes [i].trans_length_mode := iiv$connection_desc_ptr^.
                default_connection_attributes.trans_length_mode.value;
        = ifc$trans_timeout_mode =
          connection_attributes [i].trans_timeout_mode := iiv$connection_desc_ptr^.
                default_connection_attributes.trans_timeout_mode.value;
        = ifc$trans_message_length =
          connection_attributes [i].trans_message_length := iiv$connection_desc_ptr^.
                default_connection_attributes.trans_message_length.value;
        = ifc$trans_terminate_character =
          connection_attributes [i].trans_terminate_character := iiv$connection_desc_ptr^.
                default_connection_attributes.trans_terminate_character.value;
        = ifc$trans_protocol_mode =
          connection_attributes [i].trans_protocol_mode := iiv$connection_desc_ptr^.
                default_connection_attributes.trans_protocol_mode.value;
        ELSE
        CASEND;
      FOREND;

    ELSE

    { Put the default attributes into the caller's array.

    /return_attributes_to_caller/
      FOR i := 1 TO UPPERBOUND (connection_attributes) DO

        CASE connection_attributes [i].key OF

        = ifc$attention_character_action =
          IF (iiv$terminal_request_ptr <> NIL) AND (iiv$terminal_request_ptr^.
                attention_character_action.source <> ifc$undefined_attribute) THEN
            connection_attributes [i].attention_character_action := iiv$terminal_request_ptr^.
                  attention_character_action.value;
          ELSE
            connection_attributes [i].attention_character_action := iiv$connection_desc_ptr^.
                  nam_os_default_attributes.attention_character_action.value;
          IFEND;

        = ifc$break_key_action =
          IF (iiv$terminal_request_ptr <> NIL) AND (iiv$terminal_request_ptr^.
                break_key_action.source <> ifc$undefined_attribute) THEN
            connection_attributes [i].break_key_action := iiv$terminal_request_ptr^.
                  break_key_action.value;
          ELSE
            connection_attributes [i].break_key_action := iiv$connection_desc_ptr^.
                nam_os_default_attributes.break_key_action.value;
          IFEND;

        = ifc$end_of_information =
          IF (iiv$terminal_request_ptr <> NIL) AND (iiv$terminal_request_ptr^.
                end_of_information.source <> ifc$undefined_attribute) THEN
            connection_attributes [i].end_of_information := iiv$terminal_request_ptr^.
                  end_of_information.value;
          ELSE
            connection_attributes [i].end_of_information := iiv$connection_desc_ptr^.
                  nam_os_default_attributes.end_of_information.value;
          IFEND;

        = ifc$input_block_size =
          IF (iiv$terminal_request_ptr <> NIL) AND (iiv$terminal_request_ptr^.
                input_block_size.source <> ifc$undefined_attribute) THEN
            connection_attributes [i].input_block_size := iiv$terminal_request_ptr^.
                  input_block_size.value;
          ELSE
            connection_attributes [i].input_block_size := iiv$connection_desc_ptr^.
                  nam_os_default_attributes.input_block_size.value;
          IFEND;

        = ifc$input_editing_mode =
          IF (iiv$terminal_request_ptr <> NIL) AND (iiv$terminal_request_ptr^.
                input_editing_mode.source <> ifc$undefined_attribute) THEN
            connection_attributes [i].input_editing_mode := iiv$terminal_request_ptr^.
                  input_editing_mode.value;
          ELSE
            connection_attributes [i].input_editing_mode := iiv$connection_desc_ptr^.
                  nam_os_default_attributes.input_editing_mode.value;
          IFEND;

        = ifc$input_output_mode =
          IF (iiv$terminal_request_ptr <> NIL) AND (iiv$terminal_request_ptr^.
                input_output_mode.source <> ifc$undefined_attribute) THEN
            connection_attributes [i].input_output_mode := iiv$terminal_request_ptr^.
                  input_output_mode.value;
          ELSE
            connection_attributes [i].input_output_mode := iiv$connection_desc_ptr^.
                  nam_os_default_attributes.input_output_mode.value;
          IFEND;

        = ifc$input_timeout =
          IF (iiv$terminal_request_ptr <> NIL) AND (iiv$terminal_request_ptr^.
                input_timeout.source <> ifc$undefined_attribute) THEN
            connection_attributes [i].input_timeout := iiv$terminal_request_ptr^.
                  input_timeout.value;
          ELSE
            connection_attributes [i].input_timeout := iiv$connection_desc_ptr^.
                  nam_os_default_attributes.input_timeout.value;
          IFEND;

        = ifc$input_timeout_length =
          IF (iiv$terminal_request_ptr <> NIL) AND (iiv$terminal_request_ptr^.
                input_timeout_length.source <> ifc$undefined_attribute) THEN
            connection_attributes [i].input_timeout_length := iiv$terminal_request_ptr^.
                  input_timeout_length.value;
          ELSE
            connection_attributes [i].input_timeout_length := iiv$connection_desc_ptr^.
                  nam_os_default_attributes.input_timeout_length.value;
          IFEND;

        = ifc$input_timeout_purge =
          IF (iiv$terminal_request_ptr <> NIL) AND (iiv$terminal_request_ptr^.
                input_timeout_purge.source <> ifc$undefined_attribute) THEN
            connection_attributes [i].input_timeout_purge := iiv$terminal_request_ptr^.
                  input_timeout_purge.value;
          ELSE
            connection_attributes [i].input_timeout_purge := iiv$connection_desc_ptr^.
                  nam_os_default_attributes.input_timeout_purge.value;
          IFEND;

        = ifc$partial_char_forwarding =
          IF (iiv$terminal_request_ptr <> NIL) AND (iiv$terminal_request_ptr^.
                partial_char_forwarding.source <> ifc$undefined_attribute) THEN
            connection_attributes [i].partial_character_forwarding := iiv$terminal_request_ptr^.
                  partial_char_forwarding.value;
          ELSE
            connection_attributes [i].partial_character_forwarding := iiv$connection_desc_ptr^.
                  nam_os_default_attributes.partial_char_forwarding.value;
          IFEND;

        = ifc$prompt_file =
          IF (iiv$terminal_request_ptr <> NIL) AND (iiv$terminal_request_ptr^.
                prompt_file.source <> ifc$undefined_attribute) THEN
            connection_attributes [i].prompt_file := iiv$terminal_request_ptr^.
                  prompt_file.value;
          ELSE
            connection_attributes [i].prompt_file := iiv$connection_desc_ptr^.
                  nam_os_default_attributes.prompt_file.value;
          IFEND;

        = ifc$prompt_file_identifier =
          IF (iiv$terminal_request_ptr <> NIL) AND (iiv$terminal_request_ptr^.
                prompt_file_identifier.source <> ifc$undefined_attribute) THEN
            connection_attributes [i].prompt_file_identifier := iiv$terminal_request_ptr^.
                  prompt_file_identifier.value;
          ELSE
            connection_attributes [i].prompt_file_identifier := iiv$connection_desc_ptr^.
                  nam_os_default_attributes.prompt_file_identifier.value;
          IFEND;

        = ifc$prompt_string =
          IF (iiv$terminal_request_ptr <> NIL) AND (iiv$terminal_request_ptr^.
                prompt_string.source <> ifc$undefined_attribute) THEN
            connection_attributes [i].prompt_string := iiv$terminal_request_ptr^.
                  prompt_string.value;
          ELSE
            connection_attributes [i].prompt_string := iiv$connection_desc_ptr^.
                  nam_os_default_attributes.prompt_string.value;
          IFEND;

        = ifc$store_backspace_character =
          IF (iiv$terminal_request_ptr <> NIL) AND (iiv$terminal_request_ptr^.
                store_backspace_character.source <> ifc$undefined_attribute) THEN
            connection_attributes [i].store_backspace_character := iiv$terminal_request_ptr^.
                  store_backspace_character.value;
          ELSE
            connection_attributes [i].store_backspace_character := iiv$connection_desc_ptr^.
                  nam_os_default_attributes.store_backspace_character.value;
          IFEND;

        = ifc$store_nuls_dels =
          IF (iiv$terminal_request_ptr <> NIL) AND (iiv$terminal_request_ptr^.
                store_nuls_dels.source <> ifc$undefined_attribute) THEN
            connection_attributes [i].store_nuls_dels := iiv$terminal_request_ptr^.
                  store_nuls_dels.value;
          ELSE
            connection_attributes [i].store_nuls_dels := iiv$connection_desc_ptr^.
                  nam_os_default_attributes.store_nuls_dels.value;
          IFEND;

        = ifc$trans_character_mode =
          IF (iiv$terminal_request_ptr <> NIL) AND (iiv$terminal_request_ptr^.
                trans_character_mode.source <> ifc$undefined_attribute) THEN
            connection_attributes [i].trans_character_mode := iiv$terminal_request_ptr^.
                  trans_character_mode.value;
          ELSE
            connection_attributes [i].trans_character_mode := iiv$connection_desc_ptr^.
                  nam_os_default_attributes.trans_character_mode.value;
          IFEND;

        = ifc$trans_forward_character =
          IF (iiv$terminal_request_ptr <> NIL) AND (iiv$terminal_request_ptr^.
                trans_forward_character.source <> ifc$undefined_attribute) THEN
            connection_attributes [i].trans_forward_character := iiv$terminal_request_ptr^.
                  trans_forward_character.value;
          ELSE
            connection_attributes [i].trans_forward_character := iiv$connection_desc_ptr^.
                  nam_os_default_attributes.trans_forward_character.value;
          IFEND;

        = ifc$trans_length_mode =
          IF (iiv$terminal_request_ptr <> NIL) AND (iiv$terminal_request_ptr^.
                trans_length_mode.source <> ifc$undefined_attribute) THEN
            connection_attributes [i].trans_length_mode := iiv$terminal_request_ptr^.
                  trans_length_mode.value;
          ELSE
            connection_attributes [i].trans_length_mode := iiv$connection_desc_ptr^.
                  nam_os_default_attributes.trans_length_mode.value;
          IFEND;

        = ifc$trans_timeout_mode =
          IF (iiv$terminal_request_ptr <> NIL) AND (iiv$terminal_request_ptr^.
                trans_timeout_mode.source <> ifc$undefined_attribute) THEN
            connection_attributes [i].trans_timeout_mode := iiv$terminal_request_ptr^.
                  trans_timeout_mode.value;
          ELSE
            connection_attributes [i].trans_timeout_mode := iiv$connection_desc_ptr^.
                  nam_os_default_attributes.trans_timeout_mode.value;
          IFEND;

        = ifc$trans_message_length =
          IF (iiv$terminal_request_ptr <> NIL) AND (iiv$terminal_request_ptr^.
                trans_message_length.source <> ifc$undefined_attribute) THEN
            connection_attributes [i].trans_message_length := iiv$terminal_request_ptr^.
                  trans_message_length.value;
          ELSE
            connection_attributes [i].trans_message_length := iiv$connection_desc_ptr^.
                  nam_os_default_attributes.trans_message_length.value;
          IFEND;

        = ifc$trans_terminate_character =
          IF (iiv$terminal_request_ptr <> NIL) AND (iiv$terminal_request_ptr^.
                trans_terminate_character.source <> ifc$undefined_attribute) THEN
            connection_attributes [i].trans_terminate_character := iiv$terminal_request_ptr^.
                  trans_terminate_character.value;
          ELSE
            connection_attributes [i].trans_terminate_character := iiv$connection_desc_ptr^.
                  nam_os_default_attributes.trans_terminate_character.value;
          IFEND;

        = ifc$trans_protocol_mode =
          IF (iiv$terminal_request_ptr <> NIL) AND (iiv$terminal_request_ptr^.
                trans_protocol_mode.source <> ifc$undefined_attribute) THEN
            connection_attributes [i].trans_protocol_mode := iiv$terminal_request_ptr^.
                  trans_protocol_mode.value;
          ELSE
            connection_attributes [i].trans_protocol_mode := iiv$connection_desc_ptr^.
                  nam_os_default_attributes.trans_protocol_mode.value;
          IFEND;

        ELSE
        CASEND;

      FOREND /return_attributes_to_caller/;
    IFEND; { iiv$network_identifier = iic$cdcnet_network }

  PROCEND iip$get_term_conn_defaults;
MODEND iim$get_term_conn_defaults;
