?? NEWTITLE := '  NOS/VE Set Management ' ??
MODULE stm$ring2_add_member;
?? RIGHT := 110 ??

?? NEWTITLE := 'Global Declarations Referenced by This Module', EJECT ??
?? PUSH (LISTEXT := ON) ??
*copyc ste$error_condition_codes
*copyc gft$system_file_identifier
*copyc ost$status
*copyc rmt$recorded_vsn
*copyc stt$active_set_entry
?? POP ??
*copyc dmp$change_set_name
*copyc osp$append_status_parameter
*copyc osp$set_status_abnormal
*copyc stp$add_member_in_ast
*copyc stp$add_member_in_master_vst
*copyc stp$attach_vst
*copyc stp$build_member_vst
*copyc stp$create_vst
*copyc stp$destroy_vst
*copyc stp$open_vst
*copyc stp$remove_member_from_master
*copyc stp$remove_set_from_vst
*copyc stp$return_opened_vst
*copyc stp$search_mel_for_vol
?? OLDTITLE ??
?? NEWTITLE := '  [XDCL, #GATE] stp$ring2_add_member ', EJECT ??
*copyc sth$ring2_add_member

  PROCEDURE [XDCL, #GATE] stp$ring2_add_member
    (    set_name: stt$set_name;
         member_vol: rmt$recorded_vsn;
         member_internal_vsn: dmt$internal_vsn;
         master_vol: rmt$recorded_vsn;
         members_avt_index: dmt$active_volume_table_index;
         ast_entry: stt$active_set_entry;
         ast_index: stt$ast_index;
     VAR add_member_status: ost$status);

    VAR
      dm_packet_storage: stt$dm_packet_storage,
      local_status: ost$status,
      master_vst_segment_pointer: mmt$segment_pointer,
      masters_sfid: gft$system_file_identifier,
      mel_index: stt$mel_index,
      member_entry: stt$member_entry,
      member_found: boolean,
      member_vst_segment_pointer: mmt$segment_pointer,
      members_sfid: gft$system_file_identifier,
      p_master_vst: ^stt$vol_set_table,
      p_member_vst: ^stt$vol_set_table;

    stp$open_vst (master_vol, TRUE, masters_sfid, master_vst_segment_pointer, add_member_status);
    IF add_member_status.normal THEN
      p_master_vst := master_vst_segment_pointer.cell_pointer;
      stp$open_vst (member_vol, TRUE, members_sfid, member_vst_segment_pointer, add_member_status);
      IF add_member_status.normal THEN
        { The volume set table already exists. Check for re-adding member into master
        p_member_vst := member_vst_segment_pointer.cell_pointer;
        stp$search_mel_for_vol (member_vol, ast_index, member_entry, mel_index, member_found);
        IF member_found THEN
          osp$set_status_abnormal (stc$set_management_id, ste$member_vol_in_set, member_vol,
                add_member_status);
          osp$append_status_parameter (osc$status_parameter_delimiter, ast_entry.set_name, add_member_status);
        ELSE
          IF p_member_vst^.set_name = set_name THEN
            {
            { The volume belonged to this set at some point. Add this volume to the set.
            {
            dm_packet_storage.dm_packet_ever_stored := FALSE;
            stp$add_member_in_master_vst (p_master_vst, member_vol, member_internal_vsn, dm_packet_storage,
                  add_member_status);
            IF add_member_status.normal THEN
              stp$add_member_in_ast (member_vol, member_internal_vsn, stc$active, members_avt_index,
                    ast_index, dm_packet_storage);
              p_member_vst^.unique_set_name := ast_entry.unique_set_name;
              p_member_vst^.master_internal_vsn := ast_entry.master_internal_vsn;
              p_member_vst^.master_vsn := ast_entry.master_vsn;
              dmp$change_set_name (member_vol, set_name, add_member_status);
            IFEND;
          ELSE
            osp$set_status_abnormal (stc$set_management_id, ste$wrong_set_given, member_vol,
                  add_member_status);
            osp$append_status_parameter (osc$status_parameter_delimiter, p_member_vst^.set_name,
                  add_member_status);
            osp$append_status_parameter (osc$status_parameter_delimiter, set_name, add_member_status);
          IFEND;
        IFEND;
        stp$return_opened_vst (members_sfid, member_vst_segment_pointer, local_status);
      ELSEIF add_member_status.condition = ste$vol_not_in_set THEN
        stp$create_vst (member_vol, members_sfid, member_vst_segment_pointer, add_member_status);
        IF add_member_status.normal THEN
          p_member_vst := member_vst_segment_pointer.cell_pointer;
          dm_packet_storage.dm_packet_ever_stored := FALSE;
          stp$build_member_vst (p_member_vst, member_vol, member_internal_vsn, set_name,
                ast_entry.unique_set_name, ast_entry.master_vsn, ast_entry.master_internal_vsn);
          p_master_vst := master_vst_segment_pointer.cell_pointer;
          stp$add_member_in_master_vst (p_master_vst, member_vol, member_internal_vsn, dm_packet_storage,
                add_member_status);
          IF add_member_status.normal THEN
            stp$add_member_in_ast (member_vol, member_internal_vsn, stc$active, members_avt_index, ast_index,
                  dm_packet_storage);
            dmp$change_set_name (member_vol, set_name, add_member_status);
          ELSE
{
{         Something went wrong in adding the member to the master, restore
{         the member to show it is not in a set.
{
            stp$remove_set_from_vst (p_member_vst, local_status);
          IFEND;
          stp$return_opened_vst (members_sfid, member_vst_segment_pointer, local_status);

          IF NOT add_member_status.normal THEN
            stp$destroy_vst (member_vol, local_status);
          IFEND;
        IFEND;
      IFEND;
      stp$return_opened_vst (masters_sfid, master_vst_segment_pointer, local_status);
    IFEND;

  PROCEND stp$ring2_add_member;
?? OLDTITLE ??
MODEND stm$ring2_add_member;
