/* main.c for NewsFind */

#include <stdlib.h>

#include "swis.h"

#include "event.h"
#include "wimplib.h"

#include "err.h"
#include "msgtrans.h"
#include "newsbase.h"
#include "newsfind.h"
#include "nftcodes.h"

static const int OurMsgs[] = { Wimp_MNewsBaseReply, Wimp_MNewsBaseUpdate,
				Wimp_MQuit };
static const int OurTbox[] = { 0 };

static IdBlock global_id_block;

static int message_quit_handler(WimpMessage *m, void *h)
{
  exit(0);
  return 1;
}

static int menu_quit_handler(int c, ToolboxEvent *e, IdBlock *i, void *h)
{
  exit(0);
  return 1;
}

static int toolbox_error_handler(int c, ToolboxEvent *event, IdBlock *i,
	void *h)
{
  /* Error block immediately follows event header, but needs casting */
  err_check((_kernel_oserror *) &(&event->hdr)[1]);
  return 1;
}

/*
static int key_handler(int c, WimpPollBlock *event, IdBlock *i, void *h)
{
  if (event->key_pressed.key_code > 255)
    wimp_process_key(event->key_pressed.key_code);
  return 1;
}
*/

#ifdef SLSWIHACK
  extern _kernel_oserror *sl_swix (int swi_no, unsigned int, ...);

  #define OffsetToBranch 5u
  #define ARM_op_mask 0xff000000u
  #define ARM_B_op 0xea000000u
  #define ARM_BL_op 0xeb000000u
  #define ARM_pipeline 8u

  static void hack_stub(unsigned int stub_addr, unsigned int new_addr)
  {
    *((unsigned int *) stub_addr) = ARM_B_op |
    	((new_addr - (stub_addr + ARM_pipeline)) >> 2) & ~ARM_op_mask;
  }
#endif

int main(int argc, const char *argv[])
{
  const char *init_file;

#ifdef SLSWIHACK
  hack_stub((unsigned int) _swix, (unsigned int) sl_swix);
  sl_swix(0x6e, _INR(0,2), 1, _swix, _swix);	/* OS_SynchroniseCodeAreas */
#endif

  if (argc>=2)
    init_file = argv[1];
  else
    init_file = NULL;
  EF(toolbox_initialise(0, 310, (int *) OurMsgs, (int *) OurTbox,
  	(char *) NewsFindDir, &msgs_descriptor, &global_id_block,
  	0, 0, 0));
  if (!init_file)
    EF(toolbox_create_object(0, "Iconbar", NULL));
  EF(event_initialise(&global_id_block));
  EF(event_set_mask(Wimp_Poll_PointerLeavingWindowMask |
  	Wimp_Poll_PointerEnteringWindowMask |
  	Wimp_Poll_KeyPressedMask |
  	Wimp_Poll_LoseCaretMask |
  	Wimp_Poll_GainCaretMask));
  err_set_taskname(msgs_lookup("_TaskName"));
  event_register_message_handler(Wimp_MQuit, message_quit_handler, 0);
  event_register_toolbox_handler(-1, NFT_Quit, menu_quit_handler, 0);
  event_register_toolbox_handler(-1, Toolbox_Error, toolbox_error_handler, 0);
  /*event_register_wimp_handler(-1, Wimp_EKeyPressed, key_handler, 0);*/
  newsfind_initialise(init_file);
  while (1)
  {
    E(event_poll(0, 0, 0));
  }
}
