Listing 2 (hc_utilc) HLLAPI Utility Functions for HOSTCOM

/******************************************************
 *
 * These functions use the the functions in hc_api.c,
 * Listing 1, and return values that can be used to
 * index into the error message array in hc_error.c,
 * Listing 4.
 *
 ******************************************************/

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dos.h>
#include "hc.h"

/* Operator Information Area (OIA) string */
static unsigned char oia_str[103] = "";

/*******************************************************
 *
 * update_ps() Display Presentation Space
 *
 * return: 0 = successful
 *         1 = not connected to host session
 *         6 = system error encountered
 *
 *******************************************************/

int update_ps (char *ps)
{
       int err, x;
       if ((err = copy_ps(ps)) != 0) {
              switch(err) {
              case 1: return(1);
              case 9: return(6);
              }
       }

       /* replace NULLs */
       for (x = 0; x < 1920; x++) {
          if (*(ps+x) == 0x00)
              *(ps+x) = 0x20;
       }
       ps[1920] = '\0';    /* terminate PS string */

       write_string(1, 1, ps, norm_attr);

       return (0);
}

/******************************************************
 *
 * status_msg()  Display status message in the status
 *               area: row 25, column 1. msg should
 *               be 7 bytes long for consistency.
 *
 *******************************************************/

void status_msg(char *msg, int attr)
{
       write_string(1, 25, msg, attr);
}

/******************************************************
 *
 * keys_to_host() Send string of keystrokes to host
 *
 * Not for sending AID keys -- use input to_host()
 *
 * return: 0 = successful, keys sent
 *         4 = host busy, all keys could not be sent
 *         5 = session inhibited
 *         6 = system error
 *         7 = timeout (from host_wait())
 *         11= invalid parameter
 *
 *******************************************************/

int keys_to_host(char *keys)
{
       int err;

       if ((err = host_wait()) != 0)
              return (err);

       err = send_key(keys);

       switch (err) {
              case 0:  return(0);
              case 1:  return(1);
              case 2:  return(11);
              case 4:  return(4);
              case 5:  return(5);
              case 9:  return(6);
       }
}


/******************************************************
 *
 * input_to_host() Send AID key to the host.
 *
 * Resends the string if the host reports it is busy.
 * User has option to break out with ESC.
 *
 * return: 0 =  successful
 *         4 =  host busy
 *         6 =  system error
 *         7 =  timeout
 *         8 =  invalid parameter
 *         10 = keyboard locked
 *
 ******************************************************/

int input_to_host(char *keys)
{
       int err;
       int x = 0;
       char status[] =" TIME ";
       char no_time[11] = "";

       status_msg("Sending", send_attr);
       if ((err = keys_to_host(keys)) != 5)
              return(err);

       /* HLLAPI code 5: input inhibited; task
        * requires additional time. Send reset, then
        * resend string until successful or
        * interrupted by user.
        */

       while (1) {
       /* Send reset; exit on error. Only busy (4)
        * and system error (9) are expected.
        * keys_to_host() is not used to avoid call
        * to host_wait().
        */
              if ((err = send_key("@R")) != 0) {
                     switch (err) {
                            case 4: return (4);
                            case 9: return (6);
                     }
              }

              itoa(++x, no_time, 10);
              strcat(no_time, status);
              status_msg(no_time, time_attr);
              delay(2000);  /* wait two seconds */

              if (receive esc())
                 return (0); /* user interrupt */

              /* resend key; if other than
               * inhibited error, return */
              if ((err = send_key(keys)) != 5) {
                     switch (err) {
                     case 0: return (0);
                     case 1: return (1);
                     case 2: return (8);
                     case 4: return (4);
                     case 9: return (6);
                     }
              }
       }
}

/*****************************************************
 *
 * host_wait() Wait until host is ready and manage
 *             the display of the status message.
 *
 * return: 0  = system ready
 *         10 = keyboard locked
 *         6  = system error
 *         7  = timeout
 *
 *****************************************************/

int host_wait(void)
{
       int err;
       status_msg("Waiting", wait_attr);
       err = wait();
       status_msg("Ready ", stat_attr);
       switch (err) {
              case 0: return (0);
              case 1: return (22);
              case 4: return (7);
              case 5: return (10);
              case 9: return (6);
       }
}

/*****************************************************
 *
 * find_msg() Determine if msg is displayed anywhere
 *            in the presentation space.
 *
 * return: 0  = msg was not found
 *        -1  = msg was found
 *         1  = not connected to host session
 *         6  = system error
 *         9  = invalid parameter passed to HLLAPI
 *
 *****************************************************/

int find_msg(char *msg)
{
       int str_pos = 0; /* starting search psn */
       int err;

       if ((err = search_ps(msg, &str_pos)) != 0) {
              switch (err) {
                     case 1: return(1);
                     case 2: return(9);
                     case 9: return(6);
              }
       }

       if (str_pos == 0)
              return(0);       /* not found */
       else
              return (-1);    /* found */
}

/*****************************************************
 *
 * dspy_oia() Display the Operator Information Area.
 *
 * Return  0 = successful
 *         1 = not connect to host session
 *         6 = system error
 *
 *******************************************************/

int dspy_oia(void)
{
       int err, y, x = 0;

       if ((err = copy_oia(oia_str)) < 9) {
              gotoxy(1,5);
              do {
                     for (y=0; y<10; y++) {
                       printf("%5X", oia_str[x++]);
                        if (x == 103)
                            break;
                     }
                     printf("\n");
              } while (x < 103);

              return(0);
       }
       else {
              switch(err) {
                     case 1: return(1);
                     case 9: return(6);
              }
       }
}

/*****************************************************
 *
 * check_power() Determine if session powered on.
 *
 * Checks third byte in OIA which is OxCD if powered
 * on and 0x00 if powered off.
 *
 * Note: required for RabbitGATE only
 *
 *****************************************************/

int check_power(void)
{
       if (copy_oia(oia_str) < 9) {
              if (*(oia_str+2) == 0xCD)
                    return (1);  /* powered on */
              else
                    return (0);  /* powered off */
       }
       else
              return(6);
}


/****************************************************
 *
 * check_signon()
 *
 * Determine if the session is currently signed on to
 * mainframe application.
 *
 * The fourth byte in the OIA is 0xCF when signed on,
 * and 0xF0 when not signed on, and (for RabbitGATE
 * only) 0x00 when session powered off
 *
 * Return: 1 = signed on,
 *         0 = not signed on.
 ********************************************************/

int check_signon(void)
{
       if (copy_oia(oia_str) < 9) {

              if (*(oia_str+3) == 0xCF)
                     return (1);  /* logged in */
              else
                     return (0);  /* logged out */
       }
       return (6);      /* error*/
}


/*******************************************************
 *
 * connect_ps_space() Connect Presentation Space
 *
 * Return: 0 = successful
 *         2 = invalid PSID
 *         6 = system error
 *         12 = resource unavailable (occurs with
 *              IBM Entry Level only)
 *******************************************************/

int connect_ps_space(void) {
       int err;

       err = connect_ps();
       switch (err) {
              case 1: return(2);
              case 9: return(6);
              case 11: return(12);
              default: return(0);
       }
}

/******************************************************
 *
 * display_cursor() Display Cursor
 *
 * return: 0  = successful
 *         1  = not connected to session
 *         6  = system error
 *         13 = bad PSID
 *
 *******************************************************/

int display_cursor(void) {
       int err;

       err = dspy_cursor();

       switch (err) {
              case 0: return(0);
              case 1: return(1);
              case 2: return (13);
              case 9: return(6);
       }
}

/*******************************************************
 *
 * reset_connection() Break connection between program
 *   and host, and reset HLLAPI interface
 * Return: 0 = successful
 *         6 = System error
 ******************************************************/

int reset_connection(void) {

       if (reset() > 0)
              return(6);
       else
              return(0);
}
/* End of File */