#ifndef QMANSERVERH
#define QMANSERVERH

#include "imports/server_common.h"

/********************************************************************
 * QMan server interface
 ********************************************************************/

// handy typedefs
#ifndef ULONG
typedef unsigned long ULONG;
#endif
#ifndef BOOL
typedef int BOOL;
#endif

// Server name. Locate this one using qnx_name_locate().
#define SERVER_NAME_QMAN   "hp/qmania"

// Server id. Set sid to this value.
#define SERVER_ID_QMAN   0x9090

// Message types
#define TYPE_QMAN_STATUS_SET           1
#define TYPE_QMAN_STATUS_GET           2
#define TYPE_QMAN_STATUS_NOTIFY        3
#define TYPE_QMAN_SPAWN_APP           10
#define TYPE_QMAN_SPAWN_GETPID        11
#define TYPE_QMAN_SPAWN_ARGS_GET      12
#define TYPE_QMAN_MEMORY_FREE         20
#define TYPE_QMAN_CONNECTION_ONLINE   30 // Application online request
#define TYPE_QMAN_CONNECTION_OFFLINE  31
#define TYPE_QMAN_CONNECTION_ISONLINE 32 // typically something the Dialer knows...
#define TYPE_QMAN_USER_SET            40
#define TYPE_QMAN_USER_GET            41
#define TYPE_QMAN_HIBERNATE           50

// Connection status returned from TYPE_CONNECTION_ONLINE
// (defined in qman_lib.h)

// remember to #include "qman_lib.h" from qmanlib


// if you hate unions like me, use these defines!
#define SN param.sn
#define SS param.ss

#define MF param.mf

#define SA param.sa

typedef struct _qman_smsg {

	SendHeader sh;

	// two internal qman flags. Just ignore.
	BOOL req_reissue;
	BOOL req_internal; 

	union {

		// TYPE_STATUS_SET
		struct {
			unsigned long flag;
			unsigned long value; // true/false
		} ss;

		// TYPE_STATUS_NOTIFY
		struct {
			unsigned long mask;
			pid_t proxy;
		} sn;

		// TYPE_USER_SET
		struct {
			int userid;
		} us;

		// TYPE_CONNECTION_ONLINE
		struct {
			int quiet;
			int reset_timeout;
			int confirm;
		} co;

		// TYPE SPAWN_APP
		struct {
			int memlimit;
			int appid;
			int useargs;
			char args[128];
		} sa;

		// TYPE SPAWN_GETPID
		struct {
			int appid;
		} sgp;

		// TYPE_MEMORY_FREE
		struct {
			int memlimit;
		} mf;

		// TYPE_QMAN_HIBERNATE
		struct {
			int hibernate;
		} hi;

	} param;

} qman_smsg;

#define SGR param.sg

typedef struct _qman_rmsg {

	ReplyHeader rh;

	union {

		// TYPE_STATUS_GET
		struct {
			unsigned long status;
		} sg;

		// TYPE_USER_GET
		struct {
			int userid;
		} ug;

		// TYPE_SPAWN_APP
		struct {
			pid_t pid;
		} sa;

		// TYPE_SPAWN_GETPID
		struct {
			pid_t pid;
		} sgp;

		// TYPE_SPAWN_ARGS_GET
		struct {
			char args[128];
		} spg;

	} param;

} qman_rmsg;

// Reserved retval values. (see qman_lib.h)

#endif
