/* !dBoxTools.c.main */

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

#include "tbox:wimp.h"
#include "tbox:toolbox.h"
#include "tbox:event.h"

#include "clibExtra.h"
#include "error.h"

#include "action.h"
#include "main.h"
#include "message.h"
#include "null.h"
#include "loadDef.h"
#include "debug.h"

#define WimpVersion    310

Action emptyAction = {0, 0, -1, -1, -1, 0, 0, 0, 0, 0};
static Object _data = { 0, -2, '_','d','a','t','a',0 }; 

Object *firstObject = &_data;

Action *firstAction       = NULL;
Action *firstMapping      = NULL;
Action *firstFadedMapping = NULL;
Action *firstMessage      = NULL;

int client = 0, handle = 0;
FILE *debug = NULL;
int line = 0;
ObjectId    destinationObject;    
ComponentId destinationComponent; static char resources[256];

static WimpPollBlock  poll_block;
static MessagesFD     messages;
static IdBlock id_block;

static int quit_message(WimpMessage *message,void *handle);
static int objectCreated( int ec, ToolboxEvent *e, IdBlock *id, void *h );
static int nullHandler( int ec, WimpPollBlock *e, IdBlock *id, void *h );
static int toolboxError( int ec, ToolboxEvent *e, IdBlock *id, void *h );

int main( int argc, char *argv[])
{ int toolbox_events = 0, wimp_messages = 0, i;
  char *t;

  SWI_2( 0x27, (int)argv[1], (int)resources, 256 ); /* OS_GSTRans */
  NER( toolbox_initialise( 0, WimpVersion, &wimp_messages, &toolbox_events,
                           resources, &messages, &id_block, 0, 0, 0));
  event_initialise (&id_block);

  if( argc < 2 ) error( "dBoxTools must have at least 1 arguement" );
  
  for( i = 2; i < argc; i++ )
  { if( strcmp( argv[i], "-d" ) == 0 ) debug_init( resources );
    if( strcmp( argv[i], "-c" ) == 0 )
      client = (int) strtol( argv[++i], &t, 16 );
    if( strcmp( argv[i], "-h" ) == 0 )
      handle = (int) strtol( argv[++i], &t, 16 );
  }
     
  /* these handle events as specified in the definition file */
  /* they should be first to register so that others get a look in */ 

  /* this builds a list of object names and id's */
  NER( event_register_toolbox_handler( -1, 0x44ec1, objectCreated, 0 ));

  /* this will be used to load the definition file after autocreated events
     and to install the event handlers */
  NER( null_register_handler( -1, nullHandler, resources ));

  NER( event_register_toolbox_handler( -1, 0x44ec0, toolboxError, 0 ));
  NER( event_register_message_handler( Wimp_MQuit,   quit_message, 0));
  NER( event_register_message_handler( Wimp_MPreQuit,quit_message, 0));

  NER( event_register_message_handler
    (dBoxTools_SetClient, message_SetClient, 0));
  NER( event_register_message_handler
    (dBoxTools_SetClientHandle, message_SetClientHandle, 0));
  NER( event_register_message_handler
    (dBoxTools_SetOutPutFocus, message_SetOutPutFocus, 0));
  NER( event_register_message_handler
    (dBoxTools_SetDestination, message_SetDestination, 0));
  NER( event_register_message_handler
    (dBoxTools_SetValue, message_SetValue, 0));
  NER( event_register_message_handler
    (dBoxTools_GetValue, message_GetValue, 0));
  NER( event_register_message_handler
    (dBoxTools_Quit, message_Quit, 0));
  
  while (TRUE) error_poll ();
}

static int quit_message(WimpMessage *message,void *handle)
{ handle=handle; message=message;
  exit(0);
  return(1);
}

static int objectCreated( int ec, ToolboxEvent *e, IdBlock *id, void *h )
{ Object *o;
  h=h; ec=ec;
  
  o = myMalloc( sizeof( Object ));
  if( strlen( e->data.bytes) > 11 ) error( "Object name too long in res file" );
  strcpy( o->name, e->data.bytes );
  o->object = id->self_id;
  o->next = firstObject;
  firstObject = o;
  if( debug )
    fprintf( debug, "Autocreated %s, %x\n", o->name, o->object );
  return 1;
}  

static int nullHandler( int ec, WimpPollBlock *e, IdBlock *id, void *h )
{ ec=ec; e=e; id=id;

  readDefinition( h );
  NER( event_register_toolbox_handler( -1, -1, action_events, 0 ));
  NER( event_register_message_handler( -1, action_messages, 0));
  NER( null_deregister_handler( -1, nullHandler, h ));
  return 1;
}                                                  

static int toolboxError( int ec, ToolboxEvent *e, IdBlock *id, void *h )
{ ToolboxErrorEvent *er;

  h=h; id=id; ec=ec;
  er = (ToolboxErrorEvent *) e;
  error_displayRet( (_kernel_oserror *) &er->errnum );
  return 1;
}

/* end of dbox:c.main */
