*copyc osd$default_pragmats
MODULE iim$request_default_attributes;
?? TITLE := 'MODULE iim$request_default_attributes' ??

?? PUSH (LISTEXT := ON) ??
*copyc ife$error_codes
*copyc iit$connection_description
*copyc ost$status
*copyc iip$build_super_msg_skeleton
*copyc iip$sign_on
*copyc iip$sign_off
*copyc iip$add_sender
*copyc iip$set_default_attributes
*copyc iip$clear_lock
*copyc iip$convert_upline_term_char
*copyc iip$convert_downline_term_char
*copyc iiv$interactive_terminated
*copyc iip$set_lock
*copyc iip$send_to_pass_on
*copyc iip$receive_from_pass_on
*copyc iit$vt_attribute_kinds
*copyc mld$memory_link_declarations
*copyc osp$set_status_abnormal
?? POP ??

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

  PROCEDURE [XDCL] iip$request_default_attributes (connection_desc_pointer:
    ^iit$connection_description;
    VAR status: ost$status);

    VAR
      output_supervisory_message: iit$output_supervisory_message,
      request_term_char_message: iit$output_data_message,
      upline_msg: iit$input_supervisory_message,
      appl: mlt$application_name,
      ost: ost$status,
      c170_upline_message_length,
      term_char_message_length: mlt$message_length;

    iip$sign_on (appl, status);
    IF NOT status.normal THEN
      RETURN;
    IFEND;
    iip$add_sender (appl, status);
    IF NOT status.normal THEN
      iip$sign_off (appl, ost);
      RETURN;
    IFEND;
    iip$set_lock (iiv$get_lock, osc$wait, status);
    IF NOT status.normal THEN
      iip$sign_off (appl, ost);
      RETURN;
    IFEND;

  /locked/
    BEGIN

{ Build a request terminal characteristics message.
{ Note: the request and response are *synchronous* messages

      IF iiv$cdcnet_connection THEN
        iip$build_super_msg_skeleton (^output_supervisory_message,
              iic$sm_cdcnet_request_term_char, iic$l_cdcnet_request_term_char + 1);
      ELSE
        iip$build_super_msg_skeleton (^output_supervisory_message,
              iic$sm_request_term_char, (iic$max_term_char_pairs * 2) + 2);
        output_supervisory_message.request_term_char.term_char_string :=
              iiv$skeleton_term_char_string;
      IFEND;
      output_supervisory_message.header.address := connection_desc_pointer^.
            connection_number;
      output_supervisory_message.header.character_type := iic$8_bit_characters;

{ Send the request terminal characteristics message to Pass-On.

      IF iiv$cdcnet_connection THEN
        iip$send_to_pass_on (appl, #LOC (output_supervisory_message),
              (iic$l_cdcnet_request_term_char + 1) * 8, iic$output_data_message +
              iiv$job_connection + iic$dont_signal, status);
      ELSE
        iip$convert_downline_term_char (#LOC (output_supervisory_message), #LOC
              (request_term_char_message), iic$l_request_term_char * 8,
              term_char_message_length);
        iip$send_to_pass_on (appl, #LOC (request_term_char_message),
              term_char_message_length, iic$output_data_message +
              iiv$job_connection + iic$dont_signal, status);
      IFEND;

      IF NOT status.normal THEN
        EXIT /locked/;
      IFEND;

{ Build read request.

      iip$build_super_msg_skeleton (^output_supervisory_message,
            iic$sm_read_request, iic$l_read_request);
      output_supervisory_message.read_request.connection_number :=
            iiv$job_connection;
      output_supervisory_message.read_request.begin_absentee := TRUE;
      output_supervisory_message.read_request.notify_if_absentee_started :=
            FALSE;

    /wait_tcd_ccd/
      WHILE TRUE DO

{ Send read request to Pass-On.

        iip$send_to_pass_on (appl, #LOC (output_supervisory_message),
              (iic$l_read_request + 1) * 8, iic$output_supervisory_message
              + iic$dont_signal, status);
        IF NOT status.normal THEN
          EXIT /locked/;
        IFEND;


{ Receive upline block from Pass-On.

        iip$receive_from_pass_on (appl, #LOC (upline_msg), #SIZE (upline_msg),
              c170_upline_message_length, status);
        IF NOT status.normal THEN
          EXIT /locked/;
        IFEND;

        IF iiv$abort_job_initialization THEN

{ The connection was broken before the job monitor task sent the CON/REQ/N.
{ Cause IFP$JOB_INITIALIZE to return an abnormal status so that the job aborts.

          osp$set_status_abnormal (ifc$interactive_facility_id,
                ife$abort_job_initialization, '', status);
          EXIT /wait_tcd_ccd/;
        IFEND;

        IF upline_msg.header.block_type = iic$supervisory_block THEN
          IF (upline_msg.message_type = iic$sm_cdcnet_term_char_defines) OR
                (upline_msg.message_type = iic$sm_term_char_definitions) THEN

{ Initialize the interactive attributes for the job.

            iip$set_default_attributes (^upline_msg, connection_desc_pointer,
                  status);
            EXIT /wait_tcd_ccd/;
          ELSE
            IF (upline_msg.message_type = iic$sm_cdcnet_request_trm_chr_a) OR
                  (upline_msg.message_type = iic$sm_request_term_char_a) THEN
              osp$set_status_abnormal (ifc$interactive_facility_id,
                ife$request_term_char_fail, '', status);

              EXIT /wait_tcd_ccd/;
            IFEND;
          IFEND;
        IFEND;
      WHILEND /wait_tcd_ccd/;
    END /locked/;
    iip$sign_off (appl, ost);
    iip$clear_lock (iiv$get_lock, ost);
  PROCEND iip$request_default_attributes;

MODEND iim$request_default_attributes;
