*copyc OSD$DEFAULT_PRAGMATS
MODULE iim$initialize_connection;
?? TITLE := 'MODULE iim$initialize_connection' ??

?? PUSH (LISTEXT := ON) ??
*copyc OSS$JOB_PAGED_LITERAL
*copyc IIP$ALLOCATE_QUEUE_ENTRY
*copyc IIP$DPC64_TO_STRING
*copyc IIV$INTERACTIVE_TERMINATED
*copyc IIV$CONNECTION_DESC_PTR
*copyc ost$name
*copyc OST$STATUS
*copyc osv$170_os_type
*copyc OSS$TASK_SHARED
*copyc OSP$INITIALIZE_SIG_LOCK
*copyc OSV$TASK_SHARED_HEAP
*copyc PMP$GET_EXECUTING_TASK_GTID
*copyc PMP$LOG
*copyc tmc$wait_times
?? POP ??
*copyc qfp$set_terminal_name

  VAR
    connection_attributes: [READ,OSS$JOB_PAGED_LITERAL] iit$connection_attributes := [
      [0, ifc$nam_default],                                      {attention_character_action}
      [0, ifc$nam_default],                                      {break_key_action}
      [[4, '*EOI'], ifc$os_default],                             {end_of_information}
      [2000, ifc$nam_default],                                   {input_block_size}
      [ifc$normal_edit, ifc$nam_default],                        {input_editing_mode}
      [ifc$unsolicited_output, ifc$nam_default],                 {input_output_mode}
      [FALSE, ifc$os_default],                                   {input_timeout}
      [1048575, ifc$os_default],                                 {input_timeout_length}
      [TRUE, ifc$os_default],                                    {input_timeout_purge}
      [FALSE, ifc$nam_default],                                  {partial_char_forwarding}
      [':$LOCAL.OUTPUT.1               ', ifc$os_default],       {prompt_file}
      [[0, 1], ifc$os_default],                                  {prompt_file_identifier}
      [[3, ' ? '], ifc$os_default],                              {prompt_string}
      [FALSE, ifc$nam_default],                                  {store_backspace_character}
      [FALSE, ifc$nam_default],                                  {store_nuls_dels}
      [ifc$no_trans_char, ifc$nam_default],                      {trans_character_mode}
      [[1, $char(0d(16))], ifc$nam_default],                     {trans_forward_character}
      [ifc$no_trans_len, ifc$nam_default],                       {trans_length_mode}
      [2000, ifc$nam_default],                                   {trans_message_length}
      [[1, $char(0d(16))], ifc$nam_default],                     {trans_terminate_character}
      [ifc$no_trans_timeout, ifc$nam_default],                  {trans_timeout_mode}
      [ifc$no_trans_protocol, ifc$nam_default]];                  {trans_protocol_mode}

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

  PROCEDURE [XDCL] iip$initialize_connection (pism: ^iit$input_supervisory_message);

    VAR
      conn_desc_entry_descriptor: iit$queue_entry_descriptor,
      display_code_characters: iit$terminal_name,
      i: 1 .. 15,
      status: ost$status,
      terminal_name: ift$terminal_name,
      terminal_name_length: integer;

    osp$initialize_sig_lock (iiv$interactive_task_count_lock);

    osp$initialize_sig_lock (iiv$downline_queue_lock);
    osp$initialize_sig_lock (iiv$get_lock);

    osp$initialize_sig_lock (iiv$connection_desc_lock);

    iip$allocate_queue_entry (iic$connection_description,
      conn_desc_entry_descriptor, status);
    iiv$connection_desc_ptr := conn_desc_entry_descriptor.
      connection_description_ptr;
    iiv$connection_desc_ptr^.attributes_cycle := 0;
    iiv$connection_desc_ptr^.next_entry := NIL;
    iiv$connection_desc_ptr^.previous_entry := NIL;
    iiv$connection_desc_ptr^.connection_number := 0;
    iiv$connection_desc_ptr^.next_block_number := 0;
    iiv$connection_desc_ptr^.block_size := 120;
    iiv$connection_desc_ptr^.nam_os_default_attributes := connection_attributes;

{ Set terminal_model attribute to null string.

    iiv$connection_desc_ptr^.terminal_attributes.terminal_model.value := ' ';
    iiv$connection_desc_ptr^.terminal_attributes.terminal_model.size := 1;

{ Set terminal_class.

    iiv$connection_desc_ptr^.terminal_attributes.terminal_class :=
          iiv$upline_term_class_conv [pism^.conreq_terminal_class];

{ On NOS dual state, set terminal_name attribute to name passed from CON/REQ/R
{ message which is in display code and must be converted to ASCII.  For NOS/BE,
{ the terminal name will always be OSC$NULL_NAME.

    IF osv$170_os_type <> osc$ot7_dual_state_nos_be THEN
      display_code_characters := pism^.conreq_terminal_name;
      iip$dpc64_to_string (display_code_characters, 7, ' ', terminal_name,
            terminal_name_length);
      iiv$connection_desc_ptr^.terminal_name := terminal_name (1, terminal_name_length);
      qfp$set_terminal_name (terminal_name);
    ELSE
      iiv$connection_desc_ptr^.terminal_name := osc$null_name;
      qfp$set_terminal_name (osc$null_name);
    IFEND;

{ Insure that invoking the Terminal Timeout Disconnect feature does not cause
{  PMP$LONG_TERM_WAIT to be called with out-of-range parameters in IIP$GET.

    IF iiv$terminal_timeout_limit > tmc$infinite_wait THEN
      iiv$terminal_timeout_limit := tmc$infinite_wait;
      iiv$terminal_timeout_limit_left := tmc$infinite_wait;
    IFEND;

    FOR i := 1 TO 15 DO
      iiv$connection_desc_ptr^.term_char_values [i] := 0ff(16);
      iiv$connection_desc_ptr^.active_term_char_values [i] := 0ff(16);
    FOREND;

    iiv$connection_desc_ptr^.connection_number := iiv$job_connection;
    osp$initialize_sig_lock (iiv$connection_desc_ptr^.lock);

    pmp$get_executing_task_gtid (iiv$job_monitor_task_id);
    iiv$task_handling_break := iiv$job_monitor_task_id;

  PROCEND iip$initialize_connection;

MODEND iim$initialize_connection
