/*
* Original Dean/Matthew
* 1999.01.08 0.82 W tidied, and actual message/reason codes now broadcast
*/

#include "swis.h"
#include "kernel.h"
#include "toolbox.h"
#include "gadgets.h"
#include "stdarg.h"
#include "wimplib.h"
#include "vars.h"
#include "utils.h"
#include "window.h"
#include "string.h"

#include <stdio.h>


void raise_error(_kernel_oserror *);

static char lookup_token_buffer[1024];

extern void read_var_val(char *var, char *buffer, int buf_size)
{
    _kernel_swi_regs r;

    r.r[0] = (int)var;
    r.r[1] = (int) buffer;
    r.r[2] = buf_size;

    _kernel_swi(OS_ReadVarVal, &r,&r);

    *(buffer + r.r[2]) = '\0';

    return;
}

extern void messages_lookup (MessagesFD messages_fd,
                             char *token,
                             char *buffer,
                             int buffer_size,
                             char *par1,
                             char *par2,
                             char *par3,
                             char *par4,
                             char **new_buffer,
                             int *new_buffer_size)
{

   /* Looks up token and passes back appropriate message */

   _kernel_oserror  *e;
   _kernel_swi_regs  regs;

   regs.r[0] = (int)  &messages_fd;
   regs.r[1] = (int)  token;
   regs.r[2] = (int)  buffer;
   regs.r[3] =        buffer_size;
   regs.r[4] = (int)  par1;
   regs.r[5] = (int)  par2;
   regs.r[6] = (int)  par3;
   regs.r[7] = (int)  par4;

   if ((e = _kernel_swi (MessageTrans_Lookup, &regs, &regs)) != NULL)
      raise_error (e);

   if (new_buffer) {
      *new_buffer      = (char *) regs.r[2];
   }
   if (new_buffer_size) {
      *new_buffer_size = regs.r[3];
   }
}


extern void raise_error (_kernel_oserror *e) {

      /* Given an error block, raise the error */

      _kernel_swi_regs regs;
      char *strng;

      if(e == NULL)
       return;

      messages_lookup (messages, "_TaskName", NULL, 0, NULL, NULL, NULL, NULL, &strng, NULL);

      regs.r[0] = (int) e;
      regs.r[1] =       16;
      regs.r[2] = (int) strng;

      _kernel_swi (Wimp_ReportError, &regs, &regs);
}

_kernel_oserror *my_stringset_set_selected( unsigned int flags,
                                            ObjectId window,
                                            ComponentId string_set,
                                            int index
                                           )
{
  _kernel_swi_regs r;

  r.r[0] = flags;
  r.r[1] = (int) window;
  r.r[2] = StringSet_SetSelected;
  r.r[3] = (int) string_set;
  r.r[4] = index;
  return(_kernel_swi(Toolbox_ObjectMiscOp,&r,&r));
}
/*
char * lookup_token(char *tag)
{
    _kernel_swi_regs regs;
    regs.r[0] = (int) &messages;
    regs.r[1] = (int) tag;
    regs.r[2] = 0;

    if (_kernel_swi(MessageTrans_Lookup,&regs,&regs)) return 0;
    else
    {
      strcpy(lookup_token_buffer, (char *)regs.r[2]);
      return lookup_token_buffer;
    }
}
*/

extern char * lookup_token(char *tag)
{
    messages_lookup (messages, tag, lookup_token_buffer, 1024, NULL, NULL, NULL, NULL,
                     NULL, NULL);
    return lookup_token_buffer;
}

extern void werr(int fatal, char* format, ...)
{
   va_list va;
   _kernel_oserror e;
   e.errnum = 0;
   va_start(va, format);
   vsprintf(&e.errmess[0], format, va);
   va_end(va);
   wimp_report_error(&e, 0, lookup_token("_TaskName"));
   /*wimp_report_error(&e, 0, "PCConfig");*/
   if (fatal) still_running = FALSE;
}

/*static char pcconfig[]="!pcconfig\0";*/

extern int cancel_ok(char *text, char *buttons)
{
  _kernel_swi_regs r;
  _kernel_oserror e;
  e.errnum = 0;
  sprintf(&e.errmess[0],"%s\0",text);
  r.r[0] = (int)&e;
  r.r[1] = 0x910;
  r.r[2] = (int)lookup_token("_TaskName");
  r.r[3] = NULL;
  r.r[4] = NULL;
  r.r[5] = (int) buttons;
  _kernel_swi(Wimp_ReportError,&r,&r);
  /*return wimp_report_error(&e,3,lookup_token("_TaskName"));*/
  fprintf(stderr, "== %d\n", r.r[1]);
  return !(r.r[1]-3);
}

extern void check_for_modified_data(int settings, int tmp_settings, int size)
{
  if(memcmp((void *)settings, (void *)tmp_settings, size) != NULL)
  {
    if(!window_title_updated)
    {
      char buff[256];
      raise_error(window_get_title(0,main_window,buff,256,NULL));
      strcat(buff, " *");
      raise_error(window_set_title(0,main_window,buff));
      window_title_updated = TRUE;
      configuration_changed = TRUE;
    }
  }
}

extern char *get_leaf_name(char *buffer)
{
  int len;

  len = strlen(buffer);
  while(*(buffer+len--) != '.' && len != 0);

  /* If seperator found, return pointer to leaf name, otherwise return buffer */
  if(*(buffer+len+1) == '.')
   return(buffer+len+2);

  return(buffer);
}

extern void broadcast_pc_message(int msg_num, int reason, char *file)
{
  int pc_msg[64];

  pc_msg[0] = 256;
  pc_msg[3] = 0;
  pc_msg[4] = msg_num; /* message 0x44680 is 'about to start'*/
  pc_msg[5] = reason; /* Reason code */
  strcpy( ((char*) pc_msg)+24, file);
  wimp_send_message(17, pc_msg, 0, 0, 0);
}
