?? RIGHT := 110 ??
?? NEWTITLE := 'NOS/VE Operating System : Date Time Management 113' ??
MODULE osm$date_time_management_113;

{ PURPOSE:
{   This module contains procedures needed to manage date and time in osf$system_core_113.

?? NEWTITLE := 'Global Declarations Referenced by This Module', EJECT ??
?? PUSH (LISTEXT := ON) ??
*copyc ose$default_process_exceptions
*copyc dse$dft_errors
*copyc ost$operating_system_default
?? POP ??
*copyc dsp$change_date_time_info
*copyc dsp$update_hardware_date_time
*copyc dsp$update_time_zone
*copyc osp$change_base_system_time
*copyc osp$clear_mainframe_sig_lock
*copyc osp$set_mainframe_sig_lock
*copyc osp$set_status_abnormal
*copyc pmp$get_date_time_at_timestamp
?? EJECT ??
*copyc dsv$cpu_pp_communication_block
*copyc dsv$mainframe_type
*copyc osv$170_os_type
*copyc osv$os_defaults
?? OLDTITLE ??
?? NEWTITLE := 'osp$change_date_time', EJECT ??

  PROCEDURE [XDCL, #GATE] osp$change_date_time
    (    use_os_default: boolean;
         os_default: ost$operating_system_default;
     VAR status: ost$status);

    VAR
      date_time: ost$date_time,
      free_running_clock: ost$free_running_clock,
      second: 0 .. 59,
      wait_frc: ost$free_running_clock;

    status.normal := TRUE;

    IF osv$170_os_type <> osc$ot7_none THEN
      osp$set_status_abnormal ('OS', ose$not_allowed_in_dual_state, '', status);
      RETURN;
    IFEND;

    IF use_os_default THEN
      osp$change_base_system_time (os_default.free_running_clock, os_default.date_time, status);
      IF NOT status.normal THEN
        RETURN;
      IFEND;
      free_running_clock := os_default.free_running_clock;
      second := os_default.date_time.second;
    ELSE
      free_running_clock := #FREE_RUNNING_CLOCK (0);
      pmp$get_date_time_at_timestamp (free_running_clock, pmc$use_system_local_time, date_time, status);
      IF NOT status.normal THEN
        RETURN;
      IFEND;
      osp$change_base_system_time (free_running_clock, date_time, status);
      IF NOT status.normal THEN
        RETURN;
      IFEND;
      second := date_time.second;
    IFEND;

    IF second > 0 THEN
      osp$set_mainframe_sig_lock (osv$os_defaults.lock);
      osv$os_defaults.time_data.wait_to_change := TRUE;
      osv$os_defaults.time_data.wait_count := 0;
      wait_frc :=  free_running_clock + ((60 - second) * 1000 * 1000);
      osv$os_defaults.time_data.wait_frc.min := wait_frc;
      osv$os_defaults.time_data.wait_frc.max := wait_frc + (1000 * 1000);
      osp$clear_mainframe_sig_lock (osv$os_defaults.lock);
    ELSE
      osp$change_hardware_date_time (status);
    IFEND;

  PROCEND osp$change_date_time;
?? OLDTITLE ??
?? NEWTITLE := 'osp$change_hardware_date_time', EJECT ??

  PROCEDURE [XDCL, #GATE] osp$change_hardware_date_time
    (VAR status: ost$status);

    VAR
      date_time_information: dst$date_time_information,
      redo_request: boolean;

    redo_request := FALSE;
    date_time_information.bst_frc := #FREE_RUNNING_CLOCK (0);

    pmp$get_date_time_at_timestamp (date_time_information.bst_frc, pmc$use_system_local_time,
          date_time_information.bst_wcc, status);
    IF NOT status.normal THEN
      RETURN;
    IFEND;

    osp$change_base_system_time (date_time_information.bst_frc, date_time_information.bst_wcc, status);
    IF NOT status.normal THEN
      RETURN;
    IFEND;

    IF dsv$mainframe_type = dsc$mt_2000_mainframe THEN

{ This code is neccessary so the date will change on the service processor.
{ The SP doesn not accept anything greater than 99.

      date_time_information.bst_wcc.year := date_time_information.bst_wcc.year MOD 100;
      dsp$change_date_time_info ($dst$change_date_time_set [dsc$cdt_base_system_time], date_time_information,
            status);
      IF NOT status.normal THEN
        IF status.condition = dse$dft_reissue_request THEN
          redo_request := TRUE;
        ELSE
          RETURN;
        IFEND;
      IFEND;
    ELSE
      dsp$update_hardware_date_time (date_time_information.bst_frc, date_time_information.bst_wcc, status);
      IF NOT status.normal THEN
        RETURN;
      IFEND;
    IFEND;

    osp$set_mainframe_sig_lock (osv$os_defaults.lock);
    IF redo_request AND (osv$os_defaults.time_data.wait_count < 5) THEN
      osv$os_defaults.time_data.wait_count := osv$os_defaults.time_data.wait_count + 1;
      status.normal := TRUE;
    ELSE
      osv$os_defaults.time_data.wait_count := 0;
      osv$os_defaults.time_data.wait_to_change := FALSE;
    IFEND;
    osp$clear_mainframe_sig_lock (osv$os_defaults.lock);

  PROCEND osp$change_hardware_date_time;
?? OLDTITLE ??
?? NEWTITLE := 'osp$change_os_default_ring_1', EJECT ??

  PROCEDURE [XDCL, #GATE] osp$change_os_default_ring_1
    (    os_default: ost$operating_system_default;
     VAR status: ost$status);

    VAR
      date_time_information: dst$date_time_information;

    status.normal := TRUE;

    CASE os_default.kind OF
    = osc$os_name =
      osp$set_mainframe_sig_lock (osv$os_defaults.lock);
      osv$os_defaults_os_name := os_default.os_name;
      osv$os_defaults.defaults_changed := TRUE;
      osp$clear_mainframe_sig_lock (osv$os_defaults.lock);

    = osc$date_time =
      osp$change_date_time (TRUE, os_default, status);

    = osc$time_zone =
      CASE dsv$mainframe_type OF
      = dsc$mt_93x_mainframe =
        IF (dsv$cpu_pp_communication_block.relocation.dft_pp_number DIV 10(8)) =
              (dsv$cpu_pp_communication_block.relocation.dft_pp_at_deadstart DIV 10(8)) THEN
          dsp$update_time_zone (os_default.time_zone, status);
        ELSE
          osp$set_status_abnormal ('OS', ose$time_zone_data_not_saved, '', status);
        IFEND;
      ELSE
        dsp$update_time_zone (os_default.time_zone, status);
      CASEND;
      IF status.normal THEN
        osp$set_mainframe_sig_lock (osv$os_defaults.lock);
        osv$os_defaults.system_time_zone := os_default.time_zone;
        osv$os_defaults.defaults_changed := TRUE;
        osp$clear_mainframe_sig_lock (osv$os_defaults.lock);
      IFEND;

    = osc$default_date_format =
      osp$set_mainframe_sig_lock (osv$os_defaults.lock);
      osv$os_defaults.system_date_format := os_default.default_date;
      osv$os_defaults.defaults_changed := TRUE;
      osp$clear_mainframe_sig_lock (osv$os_defaults.lock);
      IF dsv$mainframe_type = dsc$mt_2000_mainframe THEN
        date_time_information.default_date := os_default.default_date;
        dsp$change_date_time_info ($dst$change_date_time_set[dsc$cdt_default_date_format],
              date_time_information, status);
      IFEND;

    = osc$default_time_format =
      osp$set_mainframe_sig_lock (osv$os_defaults.lock);
      osv$os_defaults.system_time_format := os_default.default_time;
      osv$os_defaults.defaults_changed := TRUE;
      osp$clear_mainframe_sig_lock (osv$os_defaults.lock);
      IF dsv$mainframe_type = dsc$mt_2000_mainframe THEN
        date_time_information.default_time := os_default.default_time;
        dsp$change_date_time_info ($dst$change_date_time_set[dsc$cdt_default_time_format],
              date_time_information, status);
      IFEND;

    ELSE
      osp$set_status_abnormal ('OS', ose$invalid_os_default_selected, '', status);
    CASEND;

  PROCEND osp$change_os_default_ring_1;
?? OLDTITLE ??
?? NEWTITLE := 'osp$clear_defaults_changed_flag', EJECT ??

{ PURPOSE:
{   This procedure exists so that a job_template_23d procedure can clear the variable
{   that denotes that the os defaults have been changed by a command.

  PROCEDURE [XDCL, #GATE] osp$clear_defaults_changed_flag;

    osp$set_mainframe_sig_lock (osv$os_defaults.lock);
    osv$os_defaults.defaults_changed := FALSE;
    osp$clear_mainframe_sig_lock (osv$os_defaults.lock);

  PROCEND osp$clear_defaults_changed_flag;
?? OLDTITLE ??
?? NEWTITLE := 'osp$update_wait_frc', EJECT ??

{ PURPOSE:
{   This procedure updates the wait free running clock in the os defaults variable for job_template_23d
{   procedure.

  PROCEDURE [XDCL, #GATE] osp$update_wait_frc
    (    current_time: integer);

    VAR
      addition: integer,
      minute_difference: integer;

    minute_difference := ((current_time - osv$os_defaults.time_data.wait_frc.max) DIV (60 * 1000 * 1000)) + 1;
    addition := minute_difference * (60 * 1000 * 1000);

    osp$set_mainframe_sig_lock (osv$os_defaults.lock);
    osv$os_defaults.time_data.wait_frc.min := osv$os_defaults.time_data.wait_frc.min + addition;
    osv$os_defaults.time_data.wait_frc.max := osv$os_defaults.time_data.wait_frc.max + addition;
    osp$clear_mainframe_sig_lock (osv$os_defaults.lock);

  PROCEND osp$update_wait_frc;
?? OLDTITLE ??
MODEND osm$date_time_management_113;
