#ifndef LIBRARIES_AMARQUEE49_H
#define LIBRARIES_AMARQUEE49_H

#ifndef EXEC_PORTS_H
#include <exec/ports.h>
#endif

/* This library contains definitions and structures necessary to use amarquee.library. */

/* Different error types that can be returned to the client in QMessages */
#define QERROR_NO_ERROR       0 /* Everything is okay */
#define QERROR_UNKNOWN       -1 /* Don't know what the error was. */
#define QERROR_MALFORMED_KEY -2 /* Keystring could not be parsed or "dir" does not exist */
#define QERROR_NO_SERVER_MEM -3 /* Server did not have enough mem available to complete request */
#define QERROR_NO_CONNECTION -4 /* The connection to the server went south */
#define QERROR_UNPRIVILEGED  -5 /* You're not allowed to do that! */
#define QERROR_UNIMPLEMENTED -6 /* Feature you requested does not exist yet */
#define QERROR_NO_CLIENT_MEM -7 /* Your computer didn't have enough memory available to complete an action */
#define QERROR_SYS_MESSAGE   -8 /* This message is a "wall" text message from a server admin */
#define QERROR_SEND_DONE     -9 /* This message is a "send done" notification from your client TCP thread (new for v47) */

/* These error types may be returned by QFreeSession() after a QSession
   allocation attempt fails. */
#define QERROR_NO_TCP_STACK    -20 /* TCP stack wasn't running */
#define QERROR_HOSTNAME_LOOKUP -21 /* Hostname lookup of server failed */
#define QERROR_ABORTED         -22 /* TCP thread got a control-C */
#define QERROR_NO_SERVER       -23 /* No AMarquee server at requested host/port */
#define QERROR_NO_INETD        -24 /* The program wasn't launched by inetd */
#define QERROR_ACCESS_DENIED   -25 /* The server wouldn't accept our connection */

/* Flags to use with QGo() */
#define QGOF_SYNC   (1L<<0)     /* Request notification via sync packet when all has settled on the server side */
#define QGOF_NOTIFY (1L<<1)     /* Request notification via QERROR_SEND_DONE message when the TCP thread has finished sending this transaction (new for v47) */

/* Flags representing special privileges; used with QRequestPrivileges(), etc */
#define QPRIV_KILLCLIENTS        (1L<<0) /* license to kill! */
#define QPRIV_ADMIN              (1L<<1) /* Ability to set env vars, etc, on the server */
#define QPRIV_GETSYSMESSAGES     (1L<<2) /* Ability to receive special sysadmin messages */
#define QPRIV_SENDSYSMESSAGES    (1L<<3) /* Ability to send special sysadmin messages */  
#define QPRIV_ALL                ( 0x0F) /* all possible QPRIV_* bits */

/* All events from AMarquee come in this package! */
struct QMessage 
{
  struct Message qm_Msg;/* Don't directly use the contents of qm_Msg! */
  LONG    qm_ID;        /* Message ID # of transaction related to this opCode, or -1 if no ID is applicable. */
  int     qm_Status;    /* One of the QERROR_* codes defined in AMarquee headers. */
  char  * qm_Path;      /* Pathname of a node, or NULL if not applicable. */
  void  * qm_Data;      /* Pointer to beginning of data buffer, or NULL if not applicable. */
  ULONG   qm_DataLen;   /* Length of qm_Data buffer, or 0 if not applicable. */
  ULONG   qm_ActualLen; /* Length of the data buffer stored on the AMarquee server. */
  ULONG   qm_ErrorLine; /* Line # of the server source code that generated the error.  Useful for debugging. */
  void  * qm_Private;   /* Private info used by FreeQMessage() */
};

struct QSession
{
  struct MsgPort * qMsgPort;  /* Wait() on this for QMessages! */

  /********************************************************************/
  /* Invisible, private info is here... don't trust sizeof(QSession)! */
  /********************************************************************/
};

struct QRunInfo
{
  LONG qr_Allowed; /* The theoretical maximum number of bytes your server may allocate. */
  LONG qr_Alloced; /* The number of bytes currently allocated by your server. */
  LONG qr_Avail;   /* The number of bytes that may actually be allocated by your server. */
  ULONG qr_CurrentPrivs;  /* Bit-chord of QPRIV_* bits, showing what special privs you have. */
  ULONG qr_PossiblePrivs; /* Bit-chord of QPRIV_* bits, showing what special privs you could get if you asked. */
};

#endif /* LIBRARIES_AMARQUEE49_H */
