/*
 * General type definitions
 *
 * Copyright 1998 Bertho A. Stultiens (BS)
 *
 */

#ifndef __WRC_WRCTYPES_H
#define __WRC_WRCTYPES_H

/* First is MS style, second wine style */
#if !defined(_INC_WINDOWS) && !defined(__WINE_WINDOWS_H)
#include "windows.h"
#endif

#ifndef MAKELANGID
#include "winnls.h"
#endif

#ifndef VS_FFI_SIGNATURE
#include "ver.h"
#endif

/* Memory/load flags */
#define WRC_MO_MOVEABLE		0x0010
#define WRC_MO_PURE		0x0020
#define WRC_MO_PRELOAD		0x0040
#define WRC_MO_DISCARDABLE	0x1000

/* Resource type IDs */
#define WRC_RT_CURSOR		(1)
#define WRC_RT_BITMAP		(2)
#define WRC_RT_ICON		(3)
#define WRC_RT_MENU		(4)
#define WRC_RT_DIALOG		(5)
#define WRC_RT_STRING		(6)
#define WRC_RT_FONTDIR		(7)
#define WRC_RT_FONT		(8)
#define WRC_RT_ACCELERATOR	(9)
#define WRC_RT_RCDATA		(10)
#define WRC_RT_MESSAGETABLE	(11)
#define WRC_RT_GROUP_CURSOR	(12)
#define WRC_RT_GROUP_ICON	(14)
#define WRC_RT_VERSION		(16)
#define WRC_RT_DLGINCLUDE	(17)
#define WRC_RT_PLUGPLAY		(19)
#define WRC_RT_VXD		(20)
#define WRC_RT_ANICURSOR	(21)
#define WRC_RT_ANIICON		(22)
#define WRC_RT_TOOLBAR		(241)  

/* Default class type IDs */
#define CT_BUTTON	0x80
#define CT_EDIT		0x81
#define CT_STATIC 	0x82
#define CT_LISTBOX	0x83
#define CT_SCROLLBAR	0x84
#define CT_COMBOBOX	0x85


/* Binary resource structure */
#define RES_BLOCKSIZE	512

typedef struct res {
	int	allocsize;	/* Allocated datablock size */
	int	size;		/* Actual size of data */
	int	dataidx;	/* Tag behind the resource-header */
	char	*data;
} res_t;

/* Resource strings are slightly more complex because they include '\0' */
enum str_e {str_char, str_unicode};

typedef struct string {
	int 		size;
	enum str_e	type;
	union {
		char *cstr;
		short *wstr;
	} str;
} string_t;

/* Resources are identified either by name or by number */
enum name_e {name_str, name_ord};

typedef struct name_id {
	union {
		string_t *s_name;
		int	i_name;
	} name;
	enum name_e type;
} name_id_t;

/* Language definitions */
typedef struct language {
	int	id;
	int	sub;
} language_t;

typedef DWORD characts_t;
typedef DWORD version_t;

typedef struct lvc {
	language_t	*language;
	version_t	*version;
	characts_t	*characts;
} lvc_t;

typedef struct font_id {
	string_t	*name;
	int		size;
	int		weight;
	int		italic;
} font_id_t;

/* resource types */
/* These are in the same order (and ordinal) as the RT_xxx
 * defines. This is _required_.
 * I rolled my own numbers for the win32 extension that are
 * documented, but generate either old RT_xxx numbers, or
 * don't have an ordinal associated (user type).
 * I don't know any specs for those noted such, for that matter,
 * I don't even know whether they can be generated other than by
 * using a user-type resource.
 */
enum res_e {
	res_0 = 0,
	res_cur,
	res_ico,
	res_bmp,
	res_men,
	res_dlg,
	res_stt,
	res_fntdir,
	res_fnt,
	res_acc,
	res_rdt,
	res_msg,
	res_curg,
	res_13,		/* Hm, wonder why its not used... */
	res_icog,
	res_15,
	res_ver,
	res_dlginc,	/* Not implemented, no layout available */
	res_18,
	res_pnp,	/* Not implemented, no layout available */
	res_vxd,	/* Not implemented, no layout available */
	res_anicur,	/* Not implemented, no layout available */
	res_aniico,	/* Not implemented, no layout available */

	res_toolbar = WRC_RT_TOOLBAR,	/* 241 */

	res_menex = 256 + 4,
	res_dlgex,
	res_usr,
};

/* Raw bytes in a row... */
typedef struct raw_data {
	int	size;
	char	*data;
} raw_data_t;

/* Dialog structures */
typedef struct control {
	struct control	*next;		/* List of controls */
	struct control	*prev;
	name_id_t	*ctlclass;	/* ControlClass */
	string_t	*title;		/* Title of control */
	int		id;
	int		x;		/* Position */
	int		y;
	int		width;		/* Size */
	int		height;
	DWORD		style;		/* Style */
	DWORD		exstyle;
	DWORD		helpid;		/* EX: */
	int		gotstyle;	/* Used to determine whether the default */
	int		gotexstyle;	/* styles must be set */
	int		gothelpid;
	raw_data_t	*extra;		/* EX: number of extra bytes in resource */
} control_t;

typedef struct dialog {
	DWORD		memopt;
	int		x;		/* Position */
	int		y;
	int		width;		/* Size */
	int		height;
	DWORD		style;		/* Style */
	DWORD		exstyle;
	int		gotstyle;	/* Used to determine whether the default */
	int		gotexstyle;	/* styles must be set */
	name_id_t	*menu;
	name_id_t	*dlgclass;
	string_t	*title;
	font_id_t	*font;
	lvc_t		lvc;
	control_t	*controls;
} dialog_t;

/* DialogEx structures */
typedef struct dialogex {
	DWORD		memopt;
	int		x;		/* Position */
	int		y;
	int		width;		/* Size */
	int		height;
	DWORD		style;		/* Style */
	DWORD		exstyle;
	DWORD		helpid;		/* EX: */
	int		gotstyle;	/* Used to determine whether the default */
	int		gotexstyle;	/* styles must be set */
	int		gothelpid;
	name_id_t	*menu;
	name_id_t	*dlgclass;
	string_t	*title;
	font_id_t	*font;
	lvc_t		lvc;
	control_t	*controls;
} dialogex_t;

/* Menu structures */
typedef struct menu_item {
	struct menu_item *next;
	struct menu_item *prev;
	struct menu_item *popup;
	int		id;
	DWORD		state;
	string_t	*name;
} menu_item_t;

typedef struct menu {
	DWORD		memopt;
	lvc_t		lvc;
	menu_item_t	*items;
} menu_t;

/* MenuEx structures */
typedef struct menuex_item {
	struct menuex_item *next;
	struct menuex_item *prev;
	struct menuex_item *popup;
	int		id;
	DWORD		type;
	DWORD		state;
	int		helpid;
	string_t	*name;
	int		gotid;
	int		gottype;
	int		gotstate;
	int		gothelpid;
} menuex_item_t;

typedef struct menuex {
	DWORD		memopt;
	lvc_t		lvc;
	menuex_item_t	*items;
} menuex_t;

typedef struct itemex_opt
{
	int	id;
	DWORD	type;
	DWORD	state;
	int	helpid;
	int	gotid;
	int	gottype;
	int	gotstate;
	int	gothelpid;
} itemex_opt_t;

/* RC structures for types read from file or supplied binary */
typedef struct font {
	DWORD		memopt;
	raw_data_t	*data;
} font_t;

typedef struct icon_dir_entry {
    BYTE  width;	/* From the SDK doc. */
    BYTE  height;
    BYTE  nclr;
    BYTE  reserved;
    WORD  planes;
    WORD  bits;
    DWORD ressize;
    DWORD offset;
} icon_dir_entry_t;

typedef struct icon {
	struct icon	*next;
	struct icon	*prev;
	lvc_t		lvc;
	int		id;	/* Unique icon id within resource file */
	int		width;	/* Field from the IconDirEntry */
	int		height;
	int		nclr;
	int		planes;
	int		bits;
	raw_data_t	*data;
} icon_t;

typedef struct icon_group {
	DWORD		memopt;
	lvc_t		lvc;
	icon_t		*iconlist;
	int		nicon;
} icon_group_t;

typedef struct cursor_dir_entry {
    BYTE  width;	/* From the SDK doc. */
    BYTE  height;
    BYTE  nclr;
    BYTE  reserved;
    WORD  xhot;
    WORD  yhot;
    DWORD ressize;
    DWORD offset;
} cursor_dir_entry_t;

typedef struct cursor {
	struct cursor	*next;
	struct cursor	*prev;
	lvc_t		lvc;
	int		id;	/* Unique icon id within resource file */
	int		width;	/* Field from the CursorDirEntry */
	int		height;
	int		nclr;
	int		planes;
	int		bits;
	int		xhot;
	int		yhot;
	raw_data_t	*data;
} cursor_t;

typedef struct cursor_group {
	DWORD		memopt;
	lvc_t		lvc;
	cursor_t	*cursorlist;
	int		ncursor;
} cursor_group_t;

typedef struct bitmap {
	DWORD		memopt;
	raw_data_t	*data;
} bitmap_t;

typedef struct rcdata {
	DWORD		memopt;
	lvc_t		lvc;
	raw_data_t	*data;
} rcdata_t;

typedef struct user {
	DWORD		memopt;
	name_id_t	*type;
	raw_data_t	*data;
} user_t;

typedef struct messagetable {
	raw_data_t	*data;
} messagetable_t;

/* StringTable structures */
typedef struct stt_entry {
	string_t		*str;
	int			id;
	DWORD			memopt;
	characts_t		*characts;
	version_t		*version;
} stt_entry_t;

typedef struct stringtable {
	struct stringtable	*next;
	struct stringtable	*prev;
	DWORD			memopt;
	lvc_t			lvc;
	int			idbase;
	int			nentries;
	stt_entry_t		*entries;
} stringtable_t;

/* VersionInfo structures */
enum ver_val_e {val_str, val_words, val_block};

struct ver_block;	/* Forward ref */

typedef struct ver_words {
	WORD	*words;
	int	nwords;
} ver_words_t;

typedef struct ver_value {
	struct ver_value	*next;
	struct ver_value	*prev;
	string_t		*key;
	union {
		string_t		*str;
		ver_words_t		*words;
		struct ver_block	*block;
	} value;
	enum ver_val_e		type;
} ver_value_t;

typedef struct ver_block {
	struct ver_block	*next;
	struct ver_block	*prev;
	string_t		*name;
	ver_value_t		*values;
} ver_block_t;

typedef struct versioninfo {
	int	filever_maj1;
	int	filever_maj2;
	int	filever_min1;
	int	filever_min2;
	int	prodver_maj1;
	int	prodver_maj2;
	int	prodver_min1;
	int	prodver_min2;
	int	fileos;
	int	fileflags;
	int	fileflagsmask;
	int	filetype;
	int	filesubtype;
	struct {
		int fv:1;
		int pv:1;
		int fo:1;
		int ff:1;
		int ffm:1;
		int ft:1;
		int fst:1;
	} gotit;
	ver_block_t	*blocks;
} versioninfo_t;

/* Accelerator structures */
#define WRC_AF_VIRTKEY	0x0001
#define WRC_AF_NOINVERT	0x0002
#define WRC_AF_SHIFT	0x0004
#define WRC_AF_CONTROL	0x0008
#define WRC_AF_ALT	0x0010
#define WRC_AF_ASCII	0x4000

typedef struct event {
	struct event	*next;
	struct event	*prev;
	int		flags;
	int		key;
	int		id;
} event_t;

typedef struct accelerator {
	DWORD		memopt;
	lvc_t		lvc;
	event_t		*events;
} accelerator_t;

/* Toolbar structures */
typedef struct toolbar_item {
	struct toolbar_item	*next;
	struct toolbar_item	*prev;        
	int			id;
} toolbar_item_t;

typedef struct toolbar {
	DWORD		memopt;
	lvc_t		lvc;
	int		button_width;
	int		button_height;
	int		nitems;
	toolbar_item_t	*items;
} toolbar_t;

/* A top-level resource node */
typedef struct resource {
	struct resource	*next;
	struct resource *prev;
	enum res_e	type;
	name_id_t	*name;	/* resource's name */
	language_t	*lan;	/* Only used as a sorting key and c-name creation*/
	union {
		accelerator_t	*acc;
		bitmap_t	*bmp;
		cursor_t	*cur;
		cursor_group_t	*curg;
		dialog_t	*dlg;
		dialogex_t	*dlgex;
		font_t		*fnt;
		icon_t		*ico;
		icon_group_t	*icog;
		menu_t		*men;
		menuex_t	*menex;
		messagetable_t	*msg;
		rcdata_t	*rdt;
		stringtable_t	*stt;
		toolbar_t	*tbt;
		user_t		*usr;
		versioninfo_t	*ver;
		void		*overlay; /* To catch all types at once... */
	} res;
	res_t		*binres;	/* To binary converted resource */
	char		*c_name;	/* BaseName in output */
	DWORD		memopt;
} resource_t;

/* Resource count */
typedef struct res32_count {
	int			count;
	resource_t		**rsc;
} res32_count_t;

typedef struct res_count {
	name_id_t		type;
	int			count;		/* win16 mode */
	resource_t		**rscarray;
	int			count32;
	res32_count_t		*rsc32array;	/* win32 mode */
	int			n_id_entries;
	int			n_name_entries;
} res_count_t;

#endif


