/* message.c */

#include <string.h>

#include "kernel.h"

#include "wimp.h"

#include "message.h"
#include "swi.h"

static int swi( int swi, WimpMessage *message)
{ int p = (int) message;
  int flags = message->data.words[0];
  int i, n = (flags >> REGISTERS_USED ) & 0xf;
  _kernel_swi_regs r;
  static char buffer[256-36];

  for( i = 0; i <= n; i++ )
  { r.r[i] = message->data.words[i];
    if( (flags >> i) & 1 ) r.r[i] += p;
  }
  if( flags & RETURN_AS_TEXT )
  { r.r[4] = (int) buffer;
    r.r[5] = 256-36;
  }
  
  swi_despatch( swi, &r );

  for( i = 0; i <= n; i++ )
  { message->data.words[i] = r.r[i];
  }
  if( flags & RETURN_AS_TEXT )
  { strcpy( (char*) message->data.words[4], buffer );
  }
  return 1;   
}

int message_SetClient(WimpMessage *message, void *handle)
{ handle = handle;
  return swi( dBoxTools_SetClient, message);
}

int message_SetClientHandle(WimpMessage *message, void *handle)
{ handle = handle;
  return swi( dBoxTools_SetClientHandle, message);
}

int message_SetOutPutFocus(WimpMessage *message, void *handle)
{ handle = handle;
  return swi( dBoxTools_SetOutPutFocus, message);
}

int message_SetDestination(WimpMessage *message, void *handle)
{ handle = handle;
  return swi( dBoxTools_SetDestination, message);
}

int message_SetValue(WimpMessage *message, void *handle)
{ handle = handle;
  return swi( dBoxTools_SetValue, message);
}

int message_GetValue(WimpMessage *message, void *handle)
{ handle = handle;
  return swi( dBoxTools_GetValue, message);
}

int message_Quit(WimpMessage *message, void *handle)
{ handle = handle;
  return swi( dBoxTools_Quit, message);
}

/* end of message.c */
