?? NEWTITLE := 'NOS/VE Basic Access Method : Connected File Device Support' ??
MODULE bam$connected_file_dev_support;
?? RIGHT := 110 ??

{
{ PURPOSE:
{   This module contains procedures that support the file access procedure
{   (fap) for connected files (subject files).
{

?? NEWTITLE := 'Global Declarations Referenced By This Module', EJECT ??
?? PUSH (LISTEXT := ON) ??
*copyc amc$condition_code_limits
*copyc amt$file_identifier
*copyc amt$local_file_name
*copyc cle$ecc_miscellaneous
*copyc clt$connected_file
?? POP ??
*copyc baf$task_file_entry_p
*copyc clp$find_connected_file
*copyc clp$find_connected_files
*copyc osp$set_status_abnormal
*copyc pmp$exit
?? OLDTITLE ??
?? NEWTITLE := 'bap$enable_close_of_target', EJECT ??
*copy bah$enable_close_of_target

  PROCEDURE [XDCL, #GATE] bap$enable_close_of_target
    (    subject_file_identifier: amt$file_identifier;
         target_file_identifier: amt$file_identifier);

    VAR
      subject_file_instance: ^bat$task_file_entry,
      target_file_instance: ^bat$task_file_entry,
      next_file_instance: ^bat$task_file_entry,
      status_p: ^ost$status;

  /enable_close_of_target/
    BEGIN
      subject_file_instance := baf$task_file_entry_p (subject_file_identifier);
      IF (subject_file_instance = NIL) OR (subject_file_instance^.device_class <>
            rmc$connected_file_device) OR (NOT subject_file_instance^.first_target.defined) THEN
        EXIT /enable_close_of_target/; {----->
      IFEND;

      target_file_instance := baf$task_file_entry_p (target_file_identifier);
      IF (target_file_instance = NIL) OR (subject_file_instance = target_file_instance) THEN
        EXIT /enable_close_of_target/; {----->
      IFEND;

      IF subject_file_instance^.first_target.file_identifier = target_file_identifier THEN
        subject_file_instance^.first_target := target_file_instance^.next_target;
      ELSE
        next_file_instance := baf$task_file_entry_p (subject_file_instance^.first_target.file_identifier);
        IF (next_file_instance = NIL) OR (NOT next_file_instance^.next_target.defined) THEN
          EXIT /enable_close_of_target/; {----->
        IFEND;

        WHILE next_file_instance^.next_target.file_identifier <> target_file_identifier DO
          next_file_instance := baf$task_file_entry_p (next_file_instance^.next_target.file_identifier);
          IF (next_file_instance = NIL) OR (NOT next_file_instance^.next_target.defined) THEN
            EXIT /enable_close_of_target/; {----->
          IFEND;
        WHILEND;
        next_file_instance^.next_target := target_file_instance^.next_target;
      IFEND;

      target_file_instance^.close_allowed := TRUE;

      RETURN; {----->

    END /enable_close_of_target/;

    PUSH status_p;
    osp$set_status_abnormal (amc$access_method_id, cle$unexpected_call_to, 'bap$enable_close_of_target',
          status_p^);
    pmp$exit (status_p^);

  PROCEND bap$enable_close_of_target;
?? TITLE := 'bap$record_opened_file_target', EJECT ??
*copy bah$record_opened_file_target

  PROCEDURE [XDCL, #GATE] bap$record_opened_file_target
    (    subject_file_identifier: amt$file_identifier;
         target_file_index: clt$connected_file_target_index;
         target_file_identifier: amt$file_identifier;
         connection_level: clt$file_connection_level);

    VAR
      i: clt$connected_file_target_index,
      subject_file_instance: ^bat$task_file_entry,
      target_file_instance: ^bat$task_file_entry,
      next_file_instance: ^bat$task_file_entry,
      status_p: ^ost$status;

  /record_opened_file_target/
    BEGIN
      subject_file_instance := baf$task_file_entry_p (subject_file_identifier);
      IF (subject_file_instance = NIL) OR (subject_file_instance^.device_class <> rmc$connected_file_device)
            THEN
        EXIT /record_opened_file_target/; {----->
      IFEND;

      target_file_instance := baf$task_file_entry_p (target_file_identifier);
      IF (target_file_instance = NIL) OR (subject_file_instance = target_file_instance) OR
            (target_file_index < 1) THEN
        EXIT /record_opened_file_target/; {----->
      IFEND;

      IF target_file_index = 1 THEN
        target_file_instance^.next_target := subject_file_instance^.first_target;
        subject_file_instance^.first_target.defined := TRUE;
        subject_file_instance^.first_target.file_identifier := target_file_identifier;
      ELSE
        next_file_instance := baf$task_file_entry_p (subject_file_instance^.first_target.file_identifier);
        IF (next_file_instance = NIL) OR (next_file_instance = target_file_instance) THEN
          EXIT /record_opened_file_target/; {----->
        IFEND;

        FOR i := 2 TO target_file_index - 1 DO
          next_file_instance := baf$task_file_entry_p (next_file_instance^.next_target.file_identifier);
          IF (next_file_instance = NIL) OR (next_file_instance = target_file_instance) THEN
            EXIT /record_opened_file_target/; {----->
          IFEND;
        FOREND;
        target_file_instance^.next_target := next_file_instance^.next_target;
        next_file_instance^.next_target.defined := TRUE;
        next_file_instance^.next_target.file_identifier := target_file_identifier;
      IFEND;

      target_file_instance^.close_allowed := FALSE;
      target_file_instance^.target_connection_level := connection_level;

      RETURN; {----->

    END /record_opened_file_target/;

    PUSH status_p;
    osp$set_status_abnormal (amc$access_method_id, cle$unexpected_call_to, 'bap$record_opened_file_target',
          status_p^);
    pmp$exit (status_p^);

  PROCEND bap$record_opened_file_target;
?? TITLE := 'bap$record_opened_subject_file', EJECT ??
*copy bah$record_opened_subject_file

  PROCEDURE [XDCL, #GATE] bap$record_opened_subject_file
    (    subject_file_identifier: amt$file_identifier);

    VAR
      subject_file_instance: ^bat$task_file_entry,
      status_p: ^ost$status;

  /record_opened_subject_file/
    BEGIN
      subject_file_instance := baf$task_file_entry_p (subject_file_identifier);
      IF (subject_file_instance = NIL) OR (subject_file_instance^.device_class <> rmc$connected_file_device)
            THEN
        EXIT /record_opened_subject_file/; {----->
      IFEND;

      clp$find_connected_files (subject_file_instance^.connected_files);
      clp$find_connected_file (subject_file_instance^.local_file_name, subject_file_instance^.subject);
      IF subject_file_instance^.subject <> NIL THEN
        subject_file_instance^.connection_level := subject_file_instance^.subject^.connection_level;
      ELSE
        subject_file_instance^.connection_level := 0;
      IFEND;
      subject_file_instance^.first_target.defined := FALSE;

      RETURN; {----->

    END /record_opened_subject_file/;

    PUSH status_p;
    osp$set_status_abnormal (amc$access_method_id, cle$unexpected_call_to, 'bap$record_opened_subject_file',
          status_p^);
    pmp$exit (status_p^);

  PROCEND bap$record_opened_subject_file;
?? TITLE := 'bap$record_subject_file_op', EJECT ??
*copy bah$record_subject_file_op

  PROCEDURE [XDCL, #GATE] bap$record_subject_file_op
    (    subject_file_identifier: amt$file_identifier;
         operation: amt$last_operation;
         file_position: amt$file_position);

    VAR
      subject_file_instance: ^bat$task_file_entry,
      status_p: ^ost$status;

  /record_subject_file_op/
    BEGIN
      subject_file_instance := baf$task_file_entry_p (subject_file_identifier);
      IF (subject_file_instance = NIL) OR (subject_file_instance^.device_class <> rmc$connected_file_device)
            THEN
        EXIT /record_subject_file_op/; {----->
      IFEND;

      IF operation <> amc$fetch_access_information_rq THEN
        subject_file_instance^.global_file_information^.last_access_operation := operation;
        subject_file_instance^.global_file_information^.positioning_info.record_info.file_position :=
              file_position;
      IFEND;

      IF subject_file_instance^.subject <> NIL THEN
        subject_file_instance^.connection_level := subject_file_instance^.subject^.connection_level;
      ELSE
        subject_file_instance^.connection_level := 0;
      IFEND;

      RETURN; {----->

    END /record_subject_file_op/;

    PUSH status_p;
    osp$set_status_abnormal (amc$access_method_id, cle$unexpected_call_to, 'bap$record_subject_file_op',
          status_p^);
    pmp$exit (status_p^);

  PROCEND bap$record_subject_file_op;
?? TITLE := 'bap$update_opened_subject_file', EJECT ??
*copy bah$update_opened_subject_file

  PROCEDURE [XDCL, #GATE] bap$update_opened_subject_file
    (    subject_file_identifier: amt$file_identifier);

    VAR
      subject_file_instance: ^bat$task_file_entry,
      status_p: ^ost$status;

  /record_opened_subject_file/
    BEGIN
      subject_file_instance := baf$task_file_entry_p (subject_file_identifier);
      IF (subject_file_instance = NIL) OR (subject_file_instance^.device_class <> rmc$connected_file_device)
            THEN
        EXIT /record_opened_subject_file/; {----->
      IFEND;

      clp$find_connected_files (subject_file_instance^.connected_files);
      clp$find_connected_file (subject_file_instance^.local_file_name, subject_file_instance^.subject);

      RETURN; {----->

    END /record_opened_subject_file/;

    PUSH status_p;
    osp$set_status_abnormal (amc$access_method_id, cle$unexpected_call_to, 'bap$record_opened_subject_file',
          status_p^);
    pmp$exit (status_p^);

  PROCEND bap$update_opened_subject_file;

?? OLDTITLE ??
?? NEWTITLE := 'bap$force_update_of_targets', EJECT ??

{  PURPOSE
{       This module updates a subject file's TFT connection_level to its
{       largest possible value.  This will force an update of the subject's
{       targets the next time bap$connected_file_device is called.
{
{  PARAMETERS
{       SUBJECT_FILE_IDENTIFIER  -  Subject file identifier of the subject
{       of the target just closed.

  PROCEDURE [XDCL, #GATE] bap$force_update_of_targets
    (    subject_file_identifier: amt$file_identifier);

    VAR
      subject_file_instance: ^bat$task_file_entry,
      status_p: ^ost$status;

  /force_update_of_targets/
    BEGIN
      subject_file_instance := baf$task_file_entry_p (subject_file_identifier);
      IF (subject_file_instance = NIL) OR (subject_file_instance^.device_class <> rmc$connected_file_device)
            THEN
        EXIT /force_update_of_targets/; {----->
      IFEND;

      subject_file_instance^.connection_level := UPPERVALUE (clt$file_connection_level);

      RETURN; {----->

    END /force_update_of_targets/;

    PUSH status_p;
    osp$set_status_abnormal (amc$access_method_id, cle$unexpected_call_to, 'bap$force_update_of_targets',
          status_p^);
    pmp$exit (status_p^);

  PROCEND bap$force_update_of_targets;
?? OLDTITLE ??
MODEND bam$connected_file_dev_support;
