*copyc osd$default_pragmats

MODULE fmm$store_fetch_tape_label_attr;

*copyc ame$device_class_validation
*copyc ame$lfn_program_actions
*copyc ame$tape_program_actions
*copyc bat$tape_descriptor
*copyc cle$ecc_expression_result
*copyc fme$file_management_errors
*copyc fsc$local
*copyc fst$attachment_options
*copyc fst$file_attachment_choices
*copyc fst$tape_attachment_information
*copyc oss$job_paged_literal
*copyc ost$status
*copyc ost$string
*copyc fmp$fetch_tape_attachment
*copyc fmp$locate_cycle_description
*copyc fmp$store_tape_attachment
*copyc fmp$unlock_path_table
*copyc fsp$path_element
*copyc fsp$set_evaluated_file_abnormal
*copyc osp$append_status_parameter
*copyc osp$fetch_locked_variable
*copyc osp$set_status_abnormal
*copyc pmp$change_legible_date_format

  PROCEDURE [XDCL, #GATE] fmp$store_tape_label_attributes (
        evaluated_file_reference: fst$evaluated_file_reference;
        tape_attachments: fst$attachment_options;
        supplied_file_set_pos_fields: fst$supplied_file_set_positions;
        tape_attachment_info_source: fst$tape_attach_info_source;
    VAR status: ost$status);

    VAR
      cycle_description: ^fmt$cycle_description,
      local_evaluated_file_reference: fst$evaluated_file_reference,
      open_count: integer,
      p_tape_descriptor: ^bat$tape_descriptor,
      p_tape_attachment_info: ^fst$tape_attachment_information,
      path_table_locked: boolean;

    local_evaluated_file_reference := evaluated_file_reference;
    fmp$locate_cycle_description (local_evaluated_file_reference, cycle_description, status);

    path_table_locked := status.normal;
    IF NOT status.normal THEN
      IF status.condition = fme$no_cycle_description THEN
        cycle_description := NIL;
        status.normal := TRUE;
      ELSE
        RETURN;
      IFEND;
    IFEND;

    /store_fetch_tape_label_attr/
    BEGIN

      IF cycle_description <> NIL THEN
        IF cycle_description^.device_class <> rmc$magnetic_tape_device THEN
          fsp$set_evaluated_file_abnormal (evaluated_file_reference, ame$improper_device_class,
               fmc$change_tape_label_attr_cmd, 'MASS_STORAGE/NULL/TERMINAL', status);
          EXIT /store_fetch_tape_label_attr/;
        IFEND;
      ELSE
        IF fsp$path_element (^evaluated_file_reference, 1)^ = fsc$local THEN
          fsp$set_evaluated_file_abnormal (evaluated_file_reference, ame$file_not_known,
               fmc$change_tape_label_attr_cmd, 'CHANGE_TAPE_LABEL_ATTRIBUTES', status);
          EXIT /store_fetch_tape_label_attr/;
        ELSE
          fsp$set_evaluated_file_abnormal (evaluated_file_reference, ame$file_attachment_required,
               fmc$change_tape_label_attr_cmd, 'CHANGE_TAPE_LABEL_ATTRIBUTES', status);
          EXIT /store_fetch_tape_label_attr/;
        IFEND;
      IFEND;

      IF cycle_description^.global_file_information <> NIL THEN
        osp$fetch_locked_variable (cycle_description^.
              global_file_information^.open_count, open_count);
        IF open_count <> 0 THEN
          fsp$set_evaluated_file_abnormal (evaluated_file_reference, ame$file_not_closed,
               fmc$change_tape_label_attr_cmd, 'CHANGE_TAPE_LABEL_ATTRIBUTES', status);
          EXIT /store_fetch_tape_label_attr/;
        IFEND;
        IF (cycle_description^.device_class = rmc$magnetic_tape_device) AND
              (cycle_description^.global_file_information^.device_dependent_info.tape_descriptor <> NIL) THEN
          RESET cycle_description^.global_file_information^.device_dependent_info.tape_descriptor;
          NEXT p_tape_descriptor IN cycle_description^.global_file_information^.device_dependent_info.
               tape_descriptor;
          IF (tape_attachment_info_source = fsc$tape_label_attr_command) OR
                (tape_attachment_info_source = fsc$tape_label_attr_default) THEN
            p_tape_attachment_info := ^p_tape_descriptor^.tape_label_attr_command_info;
          ELSE
            p_tape_attachment_info := ^p_tape_descriptor^.tape_attachment_information;
          IFEND;
          p_tape_attachment_info^.supplied_file_set_pos_fields :=
                p_tape_attachment_info^.supplied_file_set_pos_fields + supplied_file_set_pos_fields;
          fmp$store_tape_attachment (tape_attachments, tape_attachment_info_source, p_tape_attachment_info,
              status);
        IFEND;
      IFEND;

    END /store_fetch_tape_label_attr/;

    IF path_table_locked THEN
      fmp$unlock_path_table;
    IFEND;

  PROCEND fmp$store_tape_label_attributes;
?? EJECT ??

  PROCEDURE [XDCL, #GATE] fmp$fetch_tape_label_attributes (
        evaluated_file_reference: fst$evaluated_file_reference;
    VAR tape_attachments: fst$tape_attachment_information;
    VAR status: ost$status);

    VAR
      cycle_description: ^fmt$cycle_description,
      index: integer,
      local_evaluated_file_reference: fst$evaluated_file_reference,
      p_tape_attachment_info: ^fst$tape_attachment_information,
      p_tape_descriptor: ^bat$tape_descriptor,
      path_table_locked: boolean;

    local_evaluated_file_reference := evaluated_file_reference;
    fmp$locate_cycle_description (local_evaluated_file_reference, cycle_description, status);

    path_table_locked := status.normal;
    IF NOT status.normal THEN
      IF status.condition = fme$no_cycle_description THEN
        cycle_description := NIL;
        status.normal := TRUE;
      ELSE
        RETURN;
      IFEND;
    IFEND;

    /fetch_tape_label_attributes/
    BEGIN
      IF cycle_description <> NIL THEN
        IF cycle_description^.device_class <> rmc$magnetic_tape_device THEN
          fsp$set_evaluated_file_abnormal (evaluated_file_reference, ame$improper_device_class,
               fmc$display_tape_label_attr_cmd, 'MASS_STORAGE/NULL/TERMINAL', status);
          EXIT /fetch_tape_label_attributes/;
        IFEND;
      ELSE
        IF fsp$path_element (^evaluated_file_reference, 1)^ = fsc$local THEN
          fsp$set_evaluated_file_abnormal (evaluated_file_reference, ame$file_not_known,
               fmc$display_tape_label_attr_cmd, 'DISPLAY_TAPE_LABEL_ATTRIBUTES', status);
          EXIT /fetch_tape_label_attributes/;
        ELSE
          fsp$set_evaluated_file_abnormal (evaluated_file_reference, ame$file_attachment_required,
               fmc$display_tape_label_attr_cmd, 'DISPLAY_TAPE_LABEL_ATTRIBUTES', status);
          EXIT /fetch_tape_label_attributes/;
        IFEND;
      IFEND;

      IF (cycle_description^.global_file_information <> NIL) AND
            (cycle_description^.device_class = rmc$magnetic_tape_device) AND
            (cycle_description^.global_file_information^.device_dependent_info.tape_descriptor <> NIL) THEN
        RESET cycle_description^.global_file_information^.device_dependent_info.tape_descriptor;
        NEXT p_tape_descriptor IN cycle_description^.global_file_information^.device_dependent_info.
             tape_descriptor;
        p_tape_attachment_info := ^p_tape_descriptor^.tape_label_attr_command_info;
        fmp$fetch_tape_attachment (p_tape_attachment_info, tape_attachments, status);
      IFEND;

    END /fetch_tape_label_attributes/;

    IF path_table_locked THEN
      fmp$unlock_path_table;
    IFEND;

  PROCEND fmp$fetch_tape_label_attributes;

?? EJECT ??

  PROCEDURE [XDCL, #GATE] fmp$fetch_tape_attachment_info (
        evaluated_file_reference: fst$evaluated_file_reference;
    VAR tape_attachments: fst$tape_attachment_information;
    VAR status: ost$status);

    VAR
      cycle_description: ^fmt$cycle_description,
      index: integer,
      local_evaluated_file_reference: fst$evaluated_file_reference,
      p_tape_descriptor: ^bat$tape_descriptor,
      p_tape_attachment_info: ^fst$tape_attachment_information,
      path_table_locked: boolean;

    local_evaluated_file_reference := evaluated_file_reference;
    fmp$locate_cycle_description (local_evaluated_file_reference, cycle_description, status);

    path_table_locked := status.normal;
    IF NOT status.normal THEN
      IF status.condition = fme$no_cycle_description THEN
        cycle_description := NIL;
        status.normal := TRUE;
      ELSE
        RETURN;
      IFEND;
    IFEND;

    /fetch_tape_attachment_info/
    BEGIN

      IF cycle_description <> NIL THEN
        IF cycle_description^.device_class <> rmc$magnetic_tape_device THEN
          fsp$set_evaluated_file_abnormal (evaluated_file_reference, ame$improper_device_class,
               fmc$display_tape_label_attr_cmd, 'MASS_STORAGE/NULL/TERMINAL', status);
          EXIT /fetch_tape_attachment_info/;
        IFEND;
      ELSE
        IF fsp$path_element (^evaluated_file_reference, 1)^ = fsc$local THEN
          fsp$set_evaluated_file_abnormal (evaluated_file_reference, ame$file_not_known,
               fmc$display_tape_label_attr_cmd, 'DISPLAY_TAPE_LABEL_ATTRIBUTES', status);
          EXIT /fetch_tape_attachment_info/;
        ELSE
          fsp$set_evaluated_file_abnormal (evaluated_file_reference, ame$file_attachment_required,
               fmc$display_tape_label_attr_cmd, 'DISPLAY_TAPE_LABEL_ATTRIBUTES', status);
          EXIT /fetch_tape_attachment_info/;
        IFEND;
      IFEND;

      IF (cycle_description^.global_file_information <> NIL) AND
            (cycle_description^.device_class = rmc$magnetic_tape_device) AND
            (cycle_description^.global_file_information^.device_dependent_info.tape_descriptor <> NIL) THEN
        RESET cycle_description^.global_file_information^.device_dependent_info.tape_descriptor;
        NEXT p_tape_descriptor IN cycle_description^.global_file_information^.device_dependent_info.
             tape_descriptor;
        p_tape_attachment_info := ^p_tape_descriptor^.tape_attachment_information;
        fmp$fetch_tape_attachment (p_tape_attachment_info, tape_attachments, status);
      IFEND;

    END /fetch_tape_attachment_info/;

    IF path_table_locked THEN
      fmp$unlock_path_table;
    IFEND;

  PROCEND fmp$fetch_tape_attachment_info;

MODEND fmm$store_fetch_tape_label_attr;
