/****************************************************************
** Title  : TestToolbox ** **
** Purpose: pour comparaison avec la librairie de Bill Antonia
** Version: 0.00 19.06.25 JMB
** fichier: main.c
*****************************************************************/

//#include "Prog.h"

#define MAIN

#include "swis.h"
#include "kernel.h"
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include <stdio.h>

#define TOOLBOX_H   // #include "toolbox.h"
#define WIMP_H	    // #include "wimp.h"
#define WINDOW_H
#define MESSAGETRANS_H

// **********  from Oslib support   **********
#include "OSLibSupport:SysTypes.h"
#include "OSLibSupport:Err.h"	// error handling library
#include "OSLibSupport:x.h"
#include "OSLibSupport:event.h"
#include "OSLibSupport:message.h"
#include "OSLibSupport:ToolBoxTypes.h"
#include "OSLibSupport:SysTypes.h"

// **********  from Oslib  **********
#include "OSLib/button.h"
#include "OSLib/dragasprite.h"
#include "OSLib/fileswitch.h"
#include "OSLib/menu.h"
#include "oslib/osfile.h"
#include "OSLib/proginfo.h"
#include "OSLib/quit.h"
#include "OSLib/report.h"
#include "OSLib/taskmanager.h"
#include "OSLib/wimpspriteop.h"

#include "Main.h"
#include "debug.h"
#include "ResEventComps.h"
#include "iconbar.h"
#include "MainWindow.h"

   /****************************************************************/
   /*     variables globales de main  voir main.h                  */
   /****************************************************************/

wimp_t gxTaskHandle;
int iROversion;

void initvar(void)
{
  gbufMess = malloc(512); // variable globale reserve aux messages ou debug
  sprintf(gbufMess,"%s","JMB----- Brindas");

}


    /****************************************************************/
    /*            Fonctions diverses                                */
    /****************************************************************/

//  FindTask: used to find if teask already exist
static wimp_t FindTask( char* zName )
{
  taskmanager_task xTask; //oslib type
  int iContext = 0;
  char* pcEnd;
  xTask.name = NULL;

  while( iContext >= 0 && strncmp( zName, xTask.name, strlen(zName) ) != 0 )
  {
    iContext = taskmanager_enumerate_tasks( iContext, &xTask, sizeof( xTask ), &pcEnd );
  }

  // retourne 0 si rien trouv
  return (iContext > 0) ? xTask.task : 0;
}


     /****************************************************************/
     /*            ToolBox EVENT HANDLERS                            */
     /****************************************************************/

static int TBerror_TBhandler(   uint uiEvent_Code, ToolboxEvent *pxEvent,
			IdBlock *pxIdBlock, void *vHandle)
{
  IGNORE(uiEvent_Code);IGNORE(pxEvent);IGNORE(vHandle);IGNORE(pxIdBlock);
  Err_OsErrorReport((os_error*) &pxEvent->data.error );
  return 1;
}

     /*****************************************************************/
     /******    WimpMessage Handlers                             ******/
     /*****************************************************************/

int QuitMessage_Whandler(wimp_message *pxMessage, void *vhandle)
{
  IGNORE(vhandle);IGNORE(pxMessage);
  gQuit = TRUE;
    return TRUE ;
}

static int InitMessage_handler( WimpMessage *pxMessage, void *vhandle)
{
  IGNORE(vhandle);
  /* define the cast avec wimp_message_task_initialise */
  #define PXMESSAGEDATA ((wimp_message_task_initialise*)&pxMessage -> data )

  x_exception xy;
  x_TRY( &xy )
  {
    // check the task name from main.h
    if( strncmp(  PXMESSAGEDATA -> task_name, APPNAM, strlen( APPNAM ) ) == 0
    		&& pxMessage -> sender == gxTaskHandle )
    {
      // enregistre les messages handlers
      event_register_message_handler( message_QUIT, QuitMessage_Whandler , NULL);
      event_register_message_handler( message_PREQUIT,QuitMessage_Whandler , NULL );

      // Toolbox handlers
      event_register_toolbox_handler( event_ANY , action_ERROR, TBerror_TBhandler, NULL );

      // cration des instances
      gMainWindow = new MainWindow(MAINWINDOW_TEMPLATE);
      gIconBar = new IconBar(ICONBAR_TEMPLATE);
    }
  }
  x_CATCH( &xy )
  {
    Err_ReportError( Err_FATAL, "InitMessageproc Exception" );   // always fatal
  }
  return( TRUE );
  #undef PXMESSAGE
}


     /*****************************************************************/
     /**                       Main entry                            **/
     /*****************************************************************/
int main(void)
{
  x_exception x0; //structure d'une exception Oslib
  x_exception x1;
  os_t delai;
  int    iWimp_version = WIMP_VERSION;
  int    iEvent_code;
  osspriteop_area *SpriteArea;
  WimpPollBlock xPollBlock;  // (oslibsupport)  wimp_block
  IdBlock xId_block;  // (oslibsupport) toolbox_block
  static  int aiWimpMessages[] = {0};  // liste de Wimp messages  surveiller ;
  static  int aiToolboxEvents[] = {0}; // list de Toolbox events  surveiller;

  x_LOCAL_ERROR( Error_second_instance, 1," You cannot run two copies of TBoxTest simultaneously" );

  x_TRY( &x0 )
  {
    x_TRY( &x1 )
    {
      initvar();
      // Application to run only once
#if1
      if( FindTask( APPNAM ) != 0 )
      {
	  //x_THROW( Error_second_instance );
      }
#endif

        gxTaskHandle = toolbox_initialise( 0,
			WIMP_VERSION,
			(wimp_message_list*)aiWimpMessages,
			(toolbox_action_list*)aiToolboxEvents,
			APPDIR,
			&gMessagesFD,
			&xId_block,  // toolbox_block
			&iWimp_version,
			&SpriteArea );
        iROversion = iWimp_version;
      }


    x_CATCH( &x1 )
    {
      Err_ReportError( Err_FATAL, "%s,", x1.error -> errmess );
    }

    event_initialise (&xId_block);
    event_set_mask(
                      // Wimp_Poll_NullMask |
         	        Wimp_Poll_PointerLeavingWindowMask
                      | Wimp_Poll_PointerEnteringWindowMask
                      | Wimp_Poll_LoseCaretMask
                      | Wimp_Poll_KeyPressedMask
                      | Wimp_Poll_GainCaretMask
                      | Wimp_Poll_PollWordNonZeroMask
                      | Wimp_Poll_PollWord
                      | Wimp_Poll_PollWordHighPriority
                            ); // wimp_poll_flags

    //--------  enregistre Le message handler de l'application  -------
    event_register_message_handler( message_TASK_INITIALISE, InitMessage_handler , NULL);
    x_TRY( &x1 )
    {
      while( !gQuit )
      {
        delai = os_read_monotonic_time() ;
        delai += 20;
        event_poll_idle (&iEvent_code, &xPollBlock, delai, NULL);
      }
    }
    x_CATCH( &x1 )
    {
      Err_ReportError( Err_FATAL,  "Exception inattendue main: %s", x1.error -> errmess );
    }
  }
  x_CATCH( &x0 )
  {
    Err_ReportError( Err_FATAL, "Uncaught Exception" );
  }

  exit(EXIT_SUCCESS);

}


