/* newsbase.c */

#include <stdio.h>
#include <stdlib.h>

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

#include "err.h"
#include "findbox.h"
#include "msgtrans.h"
#include "newsbase.h"
#include "nfchoices.h"

static int newsbase_task_handle = 0;

/*
static int nbinit_noreply(int c, WimpPollBlock *e, IdBlock *i, void *h)
{
  NewsBaseStartUp *nbsu = (NewsBaseStartUp *) &e->data.user_message;
  if (nbsu->hdr.action_code != Wimp_MNewsBaseCommand ||
  	nbsu->hdr.newsbase_action != NewsBase_StartUp)
    return 0;
  err_complain_fatal(0, msgs_lookup("Newsbase"));
  return 1;
}
*/

static int nbinit_reply(WimpMessage *m, void *h)
{
  NewsBaseStartUp *nbsu = (NewsBaseStartUp *) m;
  switch (nbsu->hdr.newsbase_action)
  {
    case NewsBase_StartUp:
      if (nbsu->version < 55 || (nbsu->version == 55 && nbsu->revision < 100))
        err_complain_fatal(0, "TooOld");
      newsbase_task_handle = m->hdr.sender;
      nfchoices_setuser();
/*fprintf(stderr, "NewsBase_StartUp reply\n");*/
      findbox_getgroups();
      return 1;
    case NewsBase_ShutDown:
      findbox_notready();
      newsbase_task_handle = 0;
      return 1;
  }
  return 0;
}

static void newsbase_shutdown()
{
  WimpMessage wm;
  if (!newsbase_task_handle)
    return;
  newsbase_send(NewsBase_ShutDown, &wm);
}

void newsbase_initialise()
{
  NewsBaseStartUp block;
  atexit(newsbase_shutdown);
  block.version = 55;
  block.revision = 100;
  EF(event_register_message_handler(Wimp_MNewsBaseReply,
  	nbinit_reply, 0));
  /* For some reason Wimp_EUserMessageAcknowledge doesn't get sent to us if
     Newsbase isn't there
  EF(event_register_wimp_handler(-1, Wimp_EUserMessageAcknowledge,
  	nbinit_noreply, 0)); */
  newsbase_send(NewsBase_StartUp, &block);
}

int newsbase_send(int newsbase_action, void *block)
{
  WimpMessage *wm = (WimpMessage *) block;
  wm->hdr.size = sizeof(WimpMessage);
  wm->hdr.your_ref = 0;
  wm->hdr.action_code = Wimp_MNewsBaseCommand;
  wm->data.words[0] = newsbase_action;
  E(wimp_send_message(Wimp_EUserMessageRecorded, wm, newsbase_task_handle,
  	0, 0));
  return wm->hdr.my_ref;
}

int newsbase_isready()
{
  return (newsbase_task_handle != 0);
}
