/* ARISA - scripting engine defines */
/* Copyright (C) 2003,2004 Carl Ritson */

#define _ARISA_SCRIPT_ENG_H

/** Type definitions **/
typedef struct se_msg_t		se_msg_t;
typedef struct se_save_data_t	se_save_data_t;
typedef enum se_msg_type_t 	se_msg_type_t;

/** Enumerations **/
enum se_msg_type_t {
	SE_UNKNOWN		= 0,
	SE_LOAD			= 1,
	SE_UNLOAD		= 2,
	SE_RELOAD		= 3,
	SE_SHUTDOWN		= 4,
	SE_IRC_MSG		= 5,
	SE_SEND_NOTIFICATION	= 6,
	SE_RECV_NOTIFICATION	= 7,
	SE_QUEUE_ENQUEUE	= 8,
	SE_QUEUE_DEQUEUE	= 9,
	SE_PACK_ADD		= 10,
	SE_PACK_DEL		= 11,
	SE_PACK_HASHED		= 12,
	SE_PACKLIST_ADD		= 13,
	SE_UI_CALL		= 14,
	SE_SIGNAL		= 15,
	SE_INTERFACE_ADD	= 16,
	SE_POOL_ADD		= 17,
	SE_QUEUE_ADD		= 18,
	SE_NETWORK_ADD		= 19,
	SE_CHANNEL_ADD		= 20,
	SE_USER_ADD		= 21,
	SE_ADMIN_LOGON		= 22,
	SE_ADMIN_LOGOFF		= 23,
	SE_SAVE_DATA		= 24,
	SE_LOAD_DATA		= 25
};

enum se_flags_t {
	SE_F_LOAD_SAVE		= 0x1
};

/** Structures **/
struct se_msg_t {
	lock_t		lock;
	se_msg_type_t 	type;
	time_t		occured;
	int		ref_count;
	union {
		struct {
			char		*name;
		} script;
		struct {
			network_t	*network;
			char		**data;
			int		no_data;
		} irc;
		struct {
			interface_t	*interface;
			pool_t		*pool;
			queue_t		*queue;
			send_t		*send;
			int		aux; // errno for send, pos for queue
		} notification;
		struct {
			packlist_t	*list;
			pack_t		*pack;
		} pack;
		struct {
			void		*data;
		} ui;
		struct {
			char		*name;
		} signal;
		struct {
			interface_t	*interface;
			pool_t		*pool;
		} interface;
		struct {
			queue_t		*queue;
		} queue;
		struct {
			network_t	*network;
			channel_t	*channel;
		} network;
		struct {
			user_t		*user;
		} user;
		struct {
			chat_t		*admin;
			user_t		*user;
		} admin;
		struct {
			lock_t		lock;
			pthread_cond_t	cond;
			uint8_t		*data;
			size_t		size;
		} save;
		struct {
			uint8_t		*data;
			size_t		size;
		} load;
	};	
};

struct se_save_data_t {
	char 	*name;
	uint8_t	*data;
	size_t	size;
};

/** Functions **/
void 		free_msg(se_msg_t *m);
int 		se_register_interpreter(interpreter_t *inp);
se_save_data_t	**se_save_data(int *no_data);
int		se_load_data(const char *name, uint8_t *data, size_t size);
