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

?? PUSH (LISTEXT := ON) ??
*copyc AME$IMPROPER_ACCESS_INFO_KEY
*copyc AMP$SET_FILE_INSTANCE_ABNORMAL
*copyc IIK$KEYPOINTS
*copyc IIT$CONNECTION_DESCRIPTION
*copyc IIV$INTERACTIVE_TERMINATED
*copyc IIV$INT_TASK_OPEN_FILE_COUNT
*copyc OST$STATUS
*copyc PMP$LOG
?? POP ??

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

  PROCEDURE [XDCL, #GATE] iip$st_fetch_access_information (file_id:
    amt$file_identifier;
    st_open_file_desc_pointer: ^iit$st_open_file_description;
    access_information: ^amt$access_information;
    VAR status: ost$status);

    VAR
      set_of_access_info_keys: iit$set_of_access_info_keys,
      i: integer;

    status.normal := TRUE;

  /fetch_access_information/
    BEGIN

      set_of_access_info_keys := - $iit$set_of_access_info_keys [];
      FOR i := 1 TO UPPERBOUND (access_information^) DO
        IF NOT (access_information^ [i].key IN set_of_access_info_keys) THEN
          amp$set_file_instance_abnormal (file_id, ame$improper_access_info_key,
                amc$fetch_access_information_rq, '', status);
          EXIT /fetch_access_information/;
        IFEND;
      FOREND;

      FOR i := 1 TO UPPERBOUND (access_information^) DO

        access_information^ [i].item_returned := TRUE;

        CASE access_information^ [i].key OF

        = amc$block_number =
        { This is a NO-OP on NAM/VE since block numbers are not a part of the
        { protocol as with NAM.

        = amc$error_status =
          access_information^ [i].error_status := st_open_file_desc_pointer^.
                error_status;

        = amc$file_position =
          CASE st_open_file_desc_pointer^.last_get_put_operation OF
          = amc$get_next_req, amc$get_partial_req, amc$get_direct_req =
            access_information^ [i].file_position := iiv$get_info.file_position;
          = amc$put_next_req, amc$put_partial_req, amc$put_direct_req =
            IF iiv$put_info.last_term_option = amc$terminate THEN
              access_information^ [i].file_position := amc$eor;
            ELSE
              access_information^ [i].file_position := amc$mid_record;
            IFEND;
          ELSE
            pmp$log (' st_fetch_access_info: unknown last_get_put_operation', status);
          CASEND;

        = amc$last_access_operation =
          access_information^ [i].last_access_operation :=
                st_open_file_desc_pointer^.last_access_operation;

        = amc$last_op_status =
          access_information^ [i].last_op_status := amc$complete;

        = amc$previous_record_length =
          CASE st_open_file_desc_pointer^.last_get_put_operation OF
          = amc$get_next_req, amc$get_partial_req, amc$get_direct_req =
            IF iiv$get_info.file_position <> amc$mid_record THEN
              access_information^ [i].previous_record_length :=
                    st_open_file_desc_pointer^.previous_record_length;
            ELSE
              access_information^ [i].item_returned := FALSE;
            IFEND;
          = amc$put_next_req, amc$put_partial_req, amc$put_direct_req =
            IF iiv$put_info.last_term_option = amc$terminate THEN
              access_information^ [i].previous_record_length :=
                    st_open_file_desc_pointer^.previous_record_length;
            ELSE
              access_information^ [i].item_returned := FALSE;
            IFEND;
          ELSE
            pmp$log (' st_fetch_access_info: unknown previous_record_length', status);
          CASEND;

        ELSE
          access_information^ [i].item_returned := FALSE;
        CASEND;

      FOREND;

    END /fetch_access_information/;

  PROCEND iip$st_fetch_access_information;
MODEND iim$st_fetch_access_information;
