#ifndef INCLUDE_SUBTASK_H
#define INCLUDE_SUBTASK_H

#define STC_START    0
#define STC_STOP     1
#define STC_MUIMSG   2
#define STC_MUIAMSG  3
#define STC_MUIAAMSG 4

#define STC_ENDSCAN  -11
#define STC_SCANHTML -10

#define STC_STOPGRAB -4
#define STC_GRABURL  -3
#define STC_STARTUP  -2
#define STC_SHUTDOWN -1


/* Instance Data for the http download class */

struct HttpData                 //HttpData
   {
    struct SignalSemaphore *sema;       /* data item protection   */
    struct SignalSemaphore *mem_sema;   /* memory pool item protection   */
    APTR pool;

    struct GlobalData *gd;

    Object *app;                /* pointer to application */
    APTR self;
    APTR proj;                  /* pointer to projwin */

    struct Task *maintask;
    struct SubTask *subtask;    /* our sub task           */

    struct preferences *prefs;
    struct proj_prefs  *pprefs;
  };



struct ScanData
   {
    struct SignalSemaphore *sema;       /* data item protection   */
    struct SignalSemaphore *mem_sema;   /* memory pool item protection   */
    struct preferences *prefs;
    struct proj_prefs  *pprefs;

    struct Task *maintask;
    struct SubTask *subtask;

    APTR   pool;
    APTR   app;

    struct SignalSemaphore lsema;       /* data item protection   */
    struct List scanlist;    // Scan list
  };

struct AslData
   {
    struct SignalSemaphore sema;
    struct SignalSemaphore *mem_sema;   /* memory pool item protection   */
    struct preferences *prefs;
    APTR   pool;
    APTR   main_win;
  };


/**************************************************************/
/* Functions for easy and secure spawning/killing of subtasks */
/**************************************************************/

struct ScanMessage
  {
    struct MinNode sm_node;

    APTR   proj;
    struct proj_prefs *pprefs;
    struct URLNode *nd;
    STRPTR filename;
    ULONG  status;
  };

struct GrabMessage
  {
    APTR proj;
    struct URLNode *nd;
    //STRPTR filename;
  };

struct AslMessage
  {
    APTR obj;
    struct TagItem *tags;
    ULONG rmsg;                 // response message
    BPTR   aslfunc;
  };


struct SubTaskMsg
  {
    struct Message stm_Message;
    WORD stm_Command;
    APTR stm_Parameter;
    LONG stm_Result;
  };

struct MUIMessage
  {
    APTR muim_obj;
    LONG muim_parnum;
    ULONG *muim_message;
  };

struct SubTask
  {
    struct Process *st_Task;       /* sub task pointer */

    struct MsgPort *st_Port;       /* allocated by sub task */
    struct MsgPort *st_Reply;      /* allocated by main task */
    struct MsgPort *st_MainPort;   /* allocated by main task */

    APTR st_Data;                  /* more initial data to pass to the sub task */

    struct SubTaskMsg st_Message;  /* Message buffer */
    struct MUIMessage st_MMessage; /* Message buffer */
  };


LONG SendATaskMsg (struct SubTask *st, WORD command, APTR params);
LONG SendSubTaskMsg (struct SubTask *, WORD, APTR);
LONG SendSubTaskStartMsg (struct SubTask *, WORD, APTR);
struct SubTask *SpawnSubTask (char *, VOID (*func) (VOID), APTR);
VOID KillSubTask (struct SubTask *);

#endif
