@DATABASE "dopus/ipc.h"
@MASTER   "opussdk:include/dopus/ipc.h"
@REMARK   (c) Dr Greg Perry and Jonathan Potter, GPSoftware 1996
@REMARK   This file was initially created by ADtoHT 2.1 on 07-Sep-96 18:20:14
@REMARK   ADtoHT is © 1993-1995 Christian Stieber

@NODE MAIN "dopus/ipc.h"
@TOC "DopusSDK/MAIN"

@{"dopus/ipc.h" LINK File}


@{b}Structures@{ub}

@{"_IPC" LINK "dopus/ipc.h/File" 24}


@{b}Typedefs@{ub}

@{"IPCData" LINK "dopus/ipc.h/File" 24}  @{"IPCMessage" LINK "dopus/ipc.h/File" 11}


@{b}#defines@{ub}

@{"IPCDATA()" LINK "dopus/ipc.h/File" 36}      @{"IPCF_GETPATH" LINK "dopus/ipc.h/File" 40}  @{"IPCM_STACK()" LINK "dopus/ipc.h/File" 41}   @{"IPCSIG_HIDE" LINK "dopus/ipc.h/File" 64}
@{"IPCSIG_QUIT" LINK "dopus/ipc.h/File" 66}    @{"IPCSIG_SHOW" LINK "dopus/ipc.h/File" 65}   @{"REPLY_NO_PORT" LINK "dopus/ipc.h/File" 20}  @{"REPLY_NO_PORT_IPC" LINK "dopus/ipc.h/File" 21}
@{"SET_IPCDATA()" LINK "dopus/ipc.h/File" 37}  

@ENDNODE
@NODE File "dopus/ipc.h"
#ifndef _DOPUS_IPC
#define _DOPUS_IPC

/*****************************************************************************

 Inter-process communication

 *****************************************************************************/

// IPC message
typedef struct
        struct Message  msg;                    // Exec message
        ULONG           command;                // Message command
        ULONG           flags;                  // Message flags
        APTR            data;                   // Message data
        APTR            data_free;              // Data to be FreeVec()ed automatically
        @{"struct _IPC" LINK File 24}     *sender;                // Sender IPC
} IPCMessage;

#define REPLY_NO_PORT           (struct MsgPort *)-1    // Sync msg, no port supplied
#define REPLY_NO_PORT_IPC       (struct MsgPort *)-2    // Sync msg from a non-IPC process

// IPC process
typedef struct _IPC {
        struct MinNode          node;
        struct Process          *proc;          // Process pointer
        @{"IPCMessage" LINK File 11}              startup_msg;    // Startup message
        struct MsgPort          *command_port;  // Port to send commands to
        @{"struct ListLock" LINK "dopus/lists.h/File" 63}         *list;          // List we're a member of
        APTR                    userdata;
        APTR                    memory;         // Memory
        struct MsgPort          *reply_port;    // Port for replies
        ULONG                   flags;          // Flags
} IPCData;

#define IPCDATA(ipc)            ((APTR)ipc->userdata)
#define SET_IPCDATA(ipc,data)   ipc->userdata=(APTR)data

// Used in the stack paramter for IPC_Launch
#define IPCF_GETPATH            (1<<31)         // Want copy of path list
#define IPCM_STACK(s)           (s&0xffffff)    // Mask out stack value

// Pre-defined commands
enum {
        IPC_COMMAND_BASE=0x8000000,
        IPC_STARTUP,                            // Startup command
        IPC_ABORT,                              // Abort!
        IPC_QUIT,                               // Quit process
        IPC_ACTIVATE,                           // Activate process
        IPC_HELLO,                              // Something saying hello
        IPC_GOODBYE,                            // Something saying goodbye
        IPC_HIDE,                               // Process, hide thyself
        IPC_SHOW,                               // Tell process to reveal itself
        IPC_RESET,                              // Process should reset
        IPC_HELP,                               // Help!
        IPC_NEW,                                // Create something new
        IPC_GOT_GOODBYE,                        // Got goodbye from something
        IPC_IDENTIFY,                           // Identify yourself
        IPC_PRIORITY,                           // Change your priority to this
        IPC_REMOVE,                             // Remove yourself
};

// Pre-defined signals
#define IPCSIG_HIDE             SIGBREAKF_CTRL_D
#define IPCSIG_SHOW             SIGBREAKF_CTRL_E
#define IPCSIG_QUIT             SIGBREAKF_CTRL_F


ULONG IPC_Command(@{"IPCData" LINK File 24} *,ULONG,ULONG,APTR,APTR,struct MsgPort *);
@{"IPCData" LINK File 24} *IPC_FindProc(@{"struct ListLock" LINK "dopus/lists.h/File" 63} *,char *,BOOL,ULONG);
void IPC_Flush(@{"IPCData" LINK File 24} *);
void IPC_Free(@{"IPCData" LINK File 24} *);
long IPC_Launch(@{"struct ListLock" LINK "dopus/lists.h/File" 63} *,IPCData **,char *,ULONG,ULONG,ULONG,struct Library *);
void IPC_ListCommand(@{"struct ListLock" LINK "dopus/lists.h/File" 63} *,ULONG,ULONG,ULONG,BOOL);
@{"IPCData" LINK File 24} *IPC_ProcStartup(ULONG *,ULONG (*__asm)(register __a0 @{"IPCData" LINK File 24} *,register __a1 APTR));
void IPC_Reply(@{"IPCMessage" LINK File 11} *);

#endif
@ENDNODE
