?? RIGHT := 110 ??
?? NEWTITLE := 'NOS/VE Interpreter : Interaction Style Handlers' ??
MODULE osm$interaction_style_handlers;

{
{ PURPOSE:
{   This module contains the procedures to change and to retrieve the
{   interaction style for the job.
{

?? NEWTITLE := 'Global Declarations', EJECT ??
?? PUSH (LISTEXT := ON) ??
*copyc clt$environment_object_contents
*copyc clt$environment_object_size
*copyc clt$interaction_information
*IF NOT $true(osv$unix)
*copyc ife$error_codes
*copyc ose$message_gen_exceptions
*IFEND
*copyc ost$interaction_information
*copyc ost$interaction_style
*copyc ost$status
?? POP ??
*IF $true(osv$unix)
*copyc clp_getenv
*ELSE
*copyc clp$find_current_block
*copyc clp$convert_integer_to_string
*copyc jmv$executing_within_system_job
*copyc osp$append_status_parameter
*copyc osp$find_interaction_info
*copyc osp$set_status_abnormal
*copyc osp$set_status_condition
*copyc pmp$get_job_mode
?? TITLE := 'clp$get_command_mode', EJECT ??
{
{ NOTE:
{   The following type (clt$command_mode) and procedure (clp$get_command_mode)
{   can probably be deleted.  The XREF deck is long gone.  The procedure was
{   kept here on the off-chance that some product or application used it and
{   hasn't needed to be recompiled since the demise of the interface (which
{   was at release 1.2.1, I think).
{

?? SKIP := 3 ??

  TYPE
    clt$command_mode = (clc$normal_mode, clc$line_mode, clc$screen_mode);

?? SKIP := 3 ??

  PROCEDURE [XDCL, #GATE] clp$get_command_mode
    (VAR command_mode: clt$command_mode;
     VAR status: ost$status);

    VAR
      interaction_information: ^clt$interaction_information;


    status.normal := TRUE;

    osp$find_interaction_info (interaction_information);

    IF interaction_information^.style = osc$screen_interaction THEN
      command_mode := clc$screen_mode;
    ELSE
      command_mode := clc$line_mode;
    IFEND;

  PROCEND clp$get_command_mode;
*IFEND
?? TITLE := 'osp$eo_size_interaction_info', EJECT ??

  FUNCTION [XDCL] osp$eo_size_interaction_info: clt$environment_object_size;


    osp$eo_size_interaction_info := #SIZE (clt$interaction_information);

  FUNCEND osp$eo_size_interaction_info;
?? TITLE := 'osp$eo_init_interaction_info', EJECT ??

  PROCEDURE [XDCL] osp$eo_init_interaction_info
    (    object: ^clt$environment_object_contents);

    VAR
      interaction_info: ^clt$interaction_information;


    interaction_info := object;

    interaction_info^.style := osc$line_interaction;
    interaction_info^.menu_rows := 1;
    interaction_info^.extend_utility_interaction := FALSE;

  PROCEND osp$eo_init_interaction_info;
*IF NOT $true(osv$unix)
?? TITLE := 'osp$change_interaction_info', EJECT ??
*copyc osh$change_interaction_info

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

    VAR
      current_interaction_info: ^clt$interaction_information,
      ignore_status: ost$status,
      index: integer,
      index_string: ost$string,
      interaction_key_is_good: boolean,
      interaction_value_is_good: boolean,
      number_of_items: integer;


    status.normal := TRUE;

    IF jmv$executing_within_system_job THEN
      osp$set_status_abnormal ('OS', ife$current_job_not_interactive, 'osp$change_interaction_style', status);
      RETURN;
    IFEND;

{ The same interaction information key can be specified more than once.  The last one specified
{ is used.

    number_of_items := UPPERBOUND (interaction_information);

  /validate_interaction_info/
    FOR index := 1 TO number_of_items DO
      interaction_key_is_good := TRUE;
      interaction_value_is_good := TRUE;

      CASE interaction_information [index].key OF
      = osc$null_interaction_info_item, osc$extend_utility_interaction =
        ;

      = osc$interaction_style =
        IF (interaction_information [index].style <> osc$line_interaction) AND
              (interaction_information [index].style <> osc$screen_interaction) THEN
          interaction_value_is_good := FALSE;
        IFEND;

      = osc$menu_rows =
        IF (interaction_information [index].menu_rows < 0) OR
              (interaction_information [index].menu_rows > csc$number_of_menu_rows) THEN
          interaction_value_is_good := FALSE;
        IFEND;

      ELSE
        interaction_key_is_good := FALSE;

      CASEND;

      IF NOT interaction_key_is_good THEN
        clp$convert_integer_to_string (index, 10, FALSE, index_string, ignore_status);
        IF status.normal OR (status.condition <> ose$unknown_interaction_item) THEN
          osp$set_status_abnormal ('OS', ose$unknown_interaction_item, index_string.value (index_string.size),
                status);
        ELSE
          osp$append_status_parameter (',', index_string.value (index_string.size), status);
        IFEND;
      ELSEIF NOT interaction_value_is_good THEN
        clp$convert_integer_to_string (index, 10, FALSE, index_string, ignore_status);
        IF status.normal THEN
          osp$set_status_abnormal ('OS', ose$improper_inter_item_value, index_string.
                value (index_string.size), status);
        ELSEIF status.condition = ose$improper_inter_item_value THEN
          osp$append_status_parameter (',', index_string.value (index_string.size), status);
        IFEND;
      IFEND;

    FOREND /validate_interaction_info/;

    IF NOT status.normal THEN
      RETURN;
    IFEND;

    osp$find_interaction_info (current_interaction_info);

    FOR index := 1 TO number_of_items DO

      CASE interaction_information [index].key OF
      = osc$null_interaction_info_item =
        ;

      = osc$interaction_style =
        current_interaction_info^.style := interaction_information [index].style;

      = osc$menu_rows =
        current_interaction_info^.menu_rows := interaction_information [index].menu_rows;

      = osc$extend_utility_interaction =
        current_interaction_info^.extend_utility_interaction :=
              interaction_information [index].extend_utility_interaction;
      CASEND
    FOREND;

  PROCEND osp$change_interaction_info;
?? TITLE := 'osp$change_interaction_style', EJECT ??
*copyc osh$change_interaction_style

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

    VAR
      interaction_information: ^clt$interaction_information;


    status.normal := TRUE;

    IF jmv$executing_within_system_job THEN
      osp$set_status_abnormal ('OS', ife$current_job_not_interactive, 'osp$change_interaction_style', status);
      RETURN;
    IFEND;

    IF (interaction_style <> osc$line_interaction) AND (interaction_style <> osc$screen_interaction) THEN
      osp$set_status_condition (ose$bad_interaction_style, status);
      RETURN;
    IFEND;

    osp$find_interaction_info (interaction_information);

    interaction_information^.style := interaction_style;

  PROCEND osp$change_interaction_style;
?? TITLE := 'osp$get_interaction_information', EJECT ??
*copyc osh$get_interaction_information

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

    VAR
      current_interaction_info: ^clt$interaction_information,
      ignore_status: ost$status,
      index: integer,
      index_string: ost$string;

    status.normal := TRUE;

    osp$find_interaction_info (current_interaction_info);

    FOR index := 1 TO UPPERBOUND (interaction_information) DO

      CASE interaction_information [index].key OF

      = osc$null_interaction_info_item =
        ;

      = osc$interaction_style =
        interaction_information [index].style := current_interaction_info^.style;

      = osc$menu_rows =
        interaction_information [index].menu_rows := current_interaction_info^.menu_rows;

      = osc$extend_utility_interaction =
        interaction_information [index].extend_utility_interaction :=
              current_interaction_info^.extend_utility_interaction;

      ELSE
        clp$convert_integer_to_string (index, 10, FALSE, index_string, ignore_status);
        IF status.normal THEN
          osp$set_status_abnormal ('OS', ose$unknown_interaction_item, index_string.value (index_string.size),
                status);
        ELSE
          osp$append_status_parameter (',', index_string.value (index_string.size), status);
        IFEND;

      CASEND;
    FOREND;

  PROCEND osp$get_interaction_information;
*IFEND
?? TITLE := 'osp$get_interaction_style', EJECT ??
*copyc osh$get_interaction_style

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

    VAR
*IF $true(osv$unix)
      value: ost_c_fixed_string,
      value_length: ost_c_integer,
      variable_name: ost_c_name;
*ELSE
      interaction_information: ^clt$interaction_information;
*IFEND


    status.normal := TRUE;

*IF NOT $true(osv$unix)
    osp$find_interaction_info (interaction_information);

    interaction_style := interaction_information^.style;
*ELSE
    variable_name := 'OSV_INTERACTION_STYLE' CAT $CHAR(0);
    clp_getenv (variable_name, value, value_length);
    IF (value_length > 0) AND (value(1,value_length) = 'line') THEN
      interaction_style := osc$line_interaction;
    ELSE
      interaction_style := osc$screen_interaction;
    IFEND
*IFEND

  PROCEND osp$get_interaction_style;
*IF NOT $true(osv$unix)
?? TITLE := 'osp$set_desktop_interaction', EJECT ??
*copyc osh$set_desktop_interaction

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

    VAR
      block: ^clt$block,
      interaction_information: ^clt$interaction_information,
      job_mode: jmt$job_mode;


    status.normal := TRUE;

    pmp$get_job_mode (job_mode, status);
    IF NOT status.normal THEN
      RETURN;
    ELSEIF job_mode = jmc$batch THEN
      osp$set_status_abnormal ('OS', ife$current_job_not_interactive, 'osp$set_desktop_interaction', status);
      RETURN;
    IFEND;

    clp$find_current_block (block);
    IF (block^.kind <> clc$task_block) OR (block^.environment_object_info = NIL) OR
          (NOT block^.environment_object_info^.defined [clc$eo_interaction_information]) THEN
      osp$set_status_condition (ose$bad_interaction_style, status);
      RETURN;
    IFEND;

    osp$find_interaction_info (interaction_information);

    interaction_information^.style := osc$desktop_interaction;

  PROCEND osp$set_desktop_interaction;
*IFEND

MODEND osm$interaction_style_handlers;
