#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <descrip.h>
#include <jpidef.h>
#ifdef __GNUC__
#define UAI$_OWNER 12
#else
#include <uaidef.h>
#endif
#include <lnmdef.h>
#include <psldef.h>
#include <ssdef.h>
#include "global.h"

extern int sys$getuai(unsigned long null1, unsigned long *context,
                      struct dsc$descriptor_s *desc,
                      unsigned long *list, unsigned long null2,
                      unsigned long null3,
                      unsigned long ack);
extern int sys$trnlnm(), lib$getjpi(), sys$gettim();
extern int sys$asctim(), sys$setimr(), sys$bintim(), sys$setast();
extern int sys$cantim(), lib$get_ef();
extern server_ptr server_list, gsrv;

void lowcase(str)
  char *str;
{
  while (*str) {
    *str = tolower(*str);
    str++;
  }
}

int get_logical(char *name, char *translation, int system)
{
  struct itemlistcell il[2];
  char buffer[255];
  int status, len=0;
  struct dsc$descriptor_s name_d, table_d;
  char table[255];
  int flag1 = LNM$M_CASE_BLIND, flag2 = PSL$C_USER;

  name_d.dsc$b_dtype = table_d.dsc$b_dtype = DSC$K_DTYPE_T;
  name_d.dsc$b_class = table_d.dsc$b_class = DSC$K_CLASS_S;
  name_d.dsc$a_pointer = name;
  table_d.dsc$a_pointer = table;
  il[0].buffer_length = sizeof(buffer)-1;
  il[0].item_code = LNM$_STRING;
  il[0].buffer_addr = (unsigned)buffer;
  il[0].return_addr = (unsigned)(&len);
  il[1].buffer_length = 0;
  il[1].item_code = 0;
  il[1].buffer_length = 0;
  il[1].buffer_length = 0;
  if (system) (void)strcpy(table, "LNM$SYSTEM");
  else (void)strcpy(table, "LNM$FILE_DEV");
  name_d.dsc$w_length = strlen(name);
  table_d.dsc$w_length = strlen(table);
  status = sys$trnlnm(&flag1, &table_d, &name_d, &flag2, il);
  if (!ODD(status)) return FALSE;
  if (len==0) return FALSE;
  buffer[len] = 0;
  (void)strcpy(translation, buffer);
  return TRUE;
}

void get_name(user, name, size)
  char *user, *name;
  int size;
{
  struct dsc$descriptor_s user_d;
  char dummy[100];
  unsigned len = 0, loop, start = 0;
  int status;
  struct itemlistcell list[2];
  user_d.dsc$b_dtype = DSC$K_DTYPE_T;
  user_d.dsc$b_class = DSC$K_CLASS_S;
  user_d.dsc$a_pointer = user;
  user_d.dsc$w_length = strlen(user);
  list[0].buffer_length = sizeof(dummy);
  list[0].item_code = UAI$_OWNER;
  list[0].buffer_addr = (unsigned)dummy;
  list[0].return_addr = (unsigned)(&len);
  memset(&list[1], 0, sizeof(*list));

  status = sys$getuai(0, 0, &user_d, (unsigned long *)list, 0, 0, 0);
  if (!ODD(status)) my_sig(status, "sys$getuai");
  while (!isalpha(dummy[start]) && (start<len)) start++;
  if (len) {
    while (isspace(dummy[len-1]) || !isalpha(dummy[len-1])) len--;
    dummy[len] = 0;
  }
  strcpy(name, &dummy[start]);
}

void get_username(username, account)
  char username[MAXLEN];
  int account;
{
  unsigned short len;
  char *ptr;
  char name[MAXLEN];
  int flags = JPI$_USERNAME, ss;
  struct dsc$descriptor_s name_d;

  name_d.dsc$a_pointer = name;
  name_d.dsc$b_dtype = DSC$K_DTYPE_T;
  name_d.dsc$b_class = DSC$K_CLASS_S;
  name_d.dsc$w_length = sizeof(name);

  ss = lib$getjpi(&flags, 0, 0, 0, &name_d, &len);
  if (!ODD(ss)) my_sig(ss, "get username");
  if ((ptr = (char *)strchr(name, ' ')) != NULL)
    *ptr = '\0';
  else
    name[(int)len] = '\0';
  lowcase(name);
  if (account)
    get_name(name, username, MAXLEN);
  else
    (void)strcpy(username, name);
}

unsigned delta_time[2], bintime[2];

char curr_time[30], date[30];
$DESCRIPTOR(realt_d, curr_time);
$DESCRIPTOR(reald_d, date);

void real_time(void)
{
  unsigned status;
  unsigned short len;
  status = sys$gettim(bintime);
  if (!ODD(status)) my_sig(status, "real time");

  realt_d.dsc$w_length = 11;   /* time only */
  status = sys$asctim(&len, &realt_d, bintime, (unsigned long)1);
  if (!ODD(status)) my_sig(status, "acstim");
  curr_time[5] = '\0';

  reald_d.dsc$w_length = 12;   /* Date and time */
  status = sys$asctim(&len, &reald_d, bintime, 0);
  if (!ODD(status)) my_sig(status, "asctime2");
  date[6] = ' ';
  date[7] = 0;
  (void)strcat(date, curr_time);
  updatestatwin();
}

unsigned long timer_efn;
char timer_wait[20];
$DESCRIPTOR(timer_d, timer_wait);

void timer_action(void)
{
  server_ptr temp;
  int status, old;
  old = sys$setast(0);
  real_time();
  temp = server_list;
  while (temp) {
    if (temp->connected) send_notify(temp);
    temp = temp->next;
  }
  status = sys$setimr(timer_efn, delta_time, timer_action, 4536, 0);
  if (old == SS$_WASSET) (void)sys$setast(1);
}

void launch_timer(void)
{
  unsigned status;

  status = lib$get_ef(&timer_efn);
  (void)strcpy(timer_wait, "0000 00:00:15.00");
  timer_d.dsc$w_length = strlen(timer_wait);
  status = sys$bintim(&timer_d, delta_time);
  if (!ODD(status)) my_sig(status, "launch timer");
  timer_action();
}
