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

{ PURPOSE:
{   Supports interfaces in JT23D for the Manage Set Utility.

{   Still need to define the necessary capabilities. (The manager needs avp$configuration_administrator
{        or avp$system_operator, where as pfm$program_interface_processor checks for
{        avp$system_administrator in some of the requests (requests with the same idea as this ones)

?? NEWTITLE := 'Global Declarations Referenced By This Module', EJECT ??
?? PUSH (LISTEXT := ON) ??
*copyc cle$work_area_overflow
*copyc clt$work_area
*copyc ofe$error_codes
*copyc ost$status
*copyc stt$inactive_members_to_remove
*copyc stt$rvsn_list
?? POP ??
*copyc avp$configuration_administrator
*copyc avp$system_operator
*copyc cmp$get_element_name_via_lun
*copyc osp$set_status_abnormal
*copyc osp$verify_system_privilege
*copyc stp$get_active_set_list
*copyc stp$get_volumes_in_set
*copyc stp$remove_inactive_members
*copyc i#move
?? OLDTITLE ??
?? NEWTITLE := '[xdcl, #gate] STP$R3_GET_ACTIVE_SET_LIST', EJECT ??

  PROCEDURE [XDCL, #GATE] stp$r3_get_active_set_list
    (VAR active_set_list_p: ^stt$set_list;
     VAR work_area_p: ^clt$work_area;
     VAR status: ost$status);

    CONST
      c$initial_set_list_size = 10;

    VAR
      local_set_list_p: ^stt$set_list,
      number_of_sets: stt$number_of_sets,
      set_list_size: integer;

    status.normal := TRUE;
    IF NOT (avp$configuration_administrator () OR avp$system_operator ()) THEN
      osp$set_status_abnormal ('OF', ofe$sou_not_active, 'configuration_administration, system_operation',
            status);
      RETURN; {----->
    IFEND;

    active_set_list_p := NIL;
    IF work_area_p = NIL THEN
      osp$set_status_abnormal ('ST', cle$work_area_overflow, 'STP$R3_GET_ACTIVE_SET_LIST', status);
      RETURN; {----->
    IFEND;

    number_of_sets := c$initial_set_list_size;
    REPEAT
      set_list_size := number_of_sets;
      PUSH local_set_list_p: [1 .. set_list_size];
      stp$get_active_set_list (local_set_list_p^, number_of_sets);
    UNTIL number_of_sets <= set_list_size;

    NEXT active_set_list_p: [1 .. number_of_sets] IN work_area_p;
    IF active_set_list_p = NIL THEN
      osp$set_status_abnormal ('ST', cle$work_area_overflow, 'STP$R3_GET_ACTIVE_SET_LIST', status);
      RETURN; {----->
    IFEND;

    i#move (^local_set_list_p^, ^active_set_list_p^, #SIZE (active_set_list_p^));

  PROCEND stp$r3_get_active_set_list;
?? OLDTITLE ??
?? NEWTITLE := '[xdcl, #gate] STP$GET_ELEMENT_NAME_VIA_LUN', EJECT ??

  PROCEDURE [XDCL, #GATE] stp$get_element_name_via_lun
    (    logical_unit_number: iot$logical_unit;
     VAR element_name: cmt$element_name;
     VAR status: ost$status);

    IF NOT (avp$configuration_administrator () OR avp$system_operator ()) THEN
      osp$set_status_abnormal ('OF', ofe$sou_not_active, 'configuration_administration, system_operation',
            status);
      RETURN; {----->
    IFEND;

    cmp$get_element_name_via_lun (logical_unit_number, element_name, status);

  PROCEND stp$get_element_name_via_lun;
?? OLDTITLE ??
?? NEWTITLE := '[xdcl, #gate] STP$R3_GET_VOLUMES_IN_SET', EJECT ??

  PROCEDURE [XDCL, #GATE] stp$r3_get_volumes_in_set
    (    set_name: stt$set_name;
     VAR master_volume: stt$volume_info;
     VAR member_volume_list_p: ^stt$volume_list;
     VAR work_area_p: ^clt$work_area;
     VAR status: ost$status);

    CONST
      c$initial_member_list_size = 1;

    VAR
      local_master_volume: stt$volume_info,
      local_member_volume_list_p: ^stt$volume_list,
      member_volume_list_size: stt$number_of_members,
      number_of_members: stt$number_of_members;

    status.normal := TRUE;
    IF NOT (avp$configuration_administrator () OR avp$system_operator ()) THEN
      osp$set_status_abnormal ('OF', ofe$sou_not_active, 'configuration_administration, system_operation',
            status);
      RETURN; {----->
    IFEND;

    member_volume_list_p := NIL;
    IF work_area_p = NIL THEN
      osp$set_status_abnormal ('ST', cle$work_area_overflow, 'STP$R3_GET_VOLUMES_IN_SET', status);
      RETURN; {----->
    IFEND;

    number_of_members := c$initial_member_list_size;
    REPEAT
      member_volume_list_size := number_of_members;
      PUSH local_member_volume_list_p: [1 .. member_volume_list_size];
      stp$get_volumes_in_set (set_name, local_master_volume, local_member_volume_list_p^, number_of_members,
            status);
      IF NOT status.normal THEN
        RETURN; {----->
      IFEND;
    UNTIL member_volume_list_size >= number_of_members;

    master_volume := local_master_volume;
    NEXT member_volume_list_p: [1 .. number_of_members] IN work_area_p;
    IF member_volume_list_p = NIL THEN
      osp$set_status_abnormal ('ST', cle$work_area_overflow, 'STP$R3_GET_VOLUMES_IN_SET', status);
      RETURN; {----->
    IFEND;

    i#move (^local_member_volume_list_p^, ^member_volume_list_p^, #SIZE (member_volume_list_p^));

  PROCEND stp$r3_get_volumes_in_set;
?? OLDTITLE ??
?? NEWTITLE := '[xdcl, #gate] STP$R3_REMOVE_INACTIVE_MEMBERS', EJECT ??

  PROCEDURE [XDCL, #GATE] stp$r3_remove_inactive_members
    (    members_to_remove: stt$inactive_members_to_remove;
         set_name: stt$set_name;
     VAR status: ost$status);

    status.normal := TRUE;
    osp$verify_system_privilege;
    stp$remove_inactive_members (members_to_remove, set_name, status);

  PROCEND stp$r3_remove_inactive_members;
?? OLDTITLE ??
MODEND stm$manage_set_helpers;
