oleaut32: Added implementation of ITypeInfo2_fnGetTypeAttr.
[wine] / tools / wrc / wrctypes.h
1 /*
2  * General type definitions
3  *
4  * Copyright 1998 Bertho A. Stultiens (BS)
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20
21 #ifndef __WRC_WRCTYPES_H
22 #define __WRC_WRCTYPES_H
23
24 #include <stdarg.h>
25 #include "windef.h"
26 #include "winbase.h"
27
28 #ifndef MAKELANGID
29 #include "winnls.h"
30 #endif
31
32 #ifndef VS_FFI_SIGNATURE
33 #include "winver.h"
34 #endif
35
36 /* Memory/load flags */
37 #define WRC_MO_MOVEABLE         0x0010
38 #define WRC_MO_PURE             0x0020
39 #define WRC_MO_PRELOAD          0x0040
40 #define WRC_MO_DISCARDABLE      0x1000
41
42 /* Resource type IDs */
43 #define WRC_RT_CURSOR           (1)
44 #define WRC_RT_BITMAP           (2)
45 #define WRC_RT_ICON             (3)
46 #define WRC_RT_MENU             (4)
47 #define WRC_RT_DIALOG           (5)
48 #define WRC_RT_STRING           (6)
49 #define WRC_RT_FONTDIR          (7)
50 #define WRC_RT_FONT             (8)
51 #define WRC_RT_ACCELERATOR      (9)
52 #define WRC_RT_RCDATA           (10)
53 #define WRC_RT_MESSAGETABLE     (11)
54 #define WRC_RT_GROUP_CURSOR     (12)
55 #define WRC_RT_GROUP_ICON       (14)
56 #define WRC_RT_VERSION          (16)
57 #define WRC_RT_DLGINCLUDE       (17)
58 #define WRC_RT_PLUGPLAY         (19)
59 #define WRC_RT_VXD              (20)
60 #define WRC_RT_ANICURSOR        (21)
61 #define WRC_RT_ANIICON          (22)
62 #define WRC_RT_HTML             (23)
63 #define WRC_RT_DLGINIT          (240)
64 #define WRC_RT_TOOLBAR          (241)
65
66 /* Default class type IDs */
67 #define CT_BUTTON       0x80
68 #define CT_EDIT         0x81
69 #define CT_STATIC       0x82
70 #define CT_LISTBOX      0x83
71 #define CT_SCROLLBAR    0x84
72 #define CT_COMBOBOX     0x85
73
74 /* Byteordering defines */
75 #define WRC_BO_NATIVE   0x00
76 #define WRC_BO_LITTLE   0x01
77 #define WRC_BO_BIG      0x02
78
79 #define WRC_LOBYTE(w)           ((WORD)(w) & 0xff)
80 #define WRC_HIBYTE(w)           (((WORD)(w) >> 8) & 0xff)
81 #define WRC_LOWORD(d)           ((DWORD)(d) & 0xffff)
82 #define WRC_HIWORD(d)           (((DWORD)(d) >> 16) & 0xffff)
83 #define BYTESWAP_WORD(w)        ((WORD)(((WORD)WRC_LOBYTE(w) << 8) + (WORD)WRC_HIBYTE(w)))
84 #define BYTESWAP_DWORD(d)       ((DWORD)(((DWORD)BYTESWAP_WORD(WRC_LOWORD(d)) << 16) + ((DWORD)BYTESWAP_WORD(WRC_HIWORD(d)))))
85
86 /* Binary resource structure */
87 #define RES_BLOCKSIZE   512
88
89 typedef struct res {
90         unsigned int    allocsize;      /* Allocated datablock size */
91         unsigned int    size;           /* Actual size of data */
92         unsigned int    dataidx;        /* Tag behind the resource-header */
93         char            *data;
94 } res_t;
95
96 /* Resource strings are slightly more complex because they include '\0' */
97 enum str_e {str_char, str_unicode};
98
99 typedef struct string {
100         int             size;
101         enum str_e      type;
102         union {
103                 char *cstr;
104                 WCHAR *wstr;
105         } str;
106 } string_t;
107
108 /* Resources are identified either by name or by number */
109 enum name_e {name_str, name_ord};
110
111 typedef struct name_id {
112         union {
113                 string_t *s_name;
114                 int     i_name;
115         } name;
116         enum name_e type;
117 } name_id_t;
118
119 /* Language definitions */
120 typedef struct language {
121         int     id;
122         int     sub;
123 } language_t;
124
125 typedef DWORD characts_t;
126 typedef DWORD version_t;
127
128 typedef struct lvc {
129         language_t      *language;
130         version_t       *version;
131         characts_t      *characts;
132 } lvc_t;
133
134 typedef struct font_id {
135         string_t        *name;
136         int             size;
137         int             weight;
138         int             italic;
139 } font_id_t;
140
141 /* control styles */
142 typedef struct style {
143         DWORD                   or_mask;
144         DWORD                   and_mask;
145 } style_t;
146
147 /* resource types */
148 /* These are in the same order (and ordinal) as the RT_xxx
149  * defines. This is _required_.
150  * I rolled my own numbers for the win32 extension that are
151  * documented, but generate either old RT_xxx numbers, or
152  * don't have an ordinal associated (user type).
153  * I don't know any specs for those noted such, for that matter,
154  * I don't even know whether they can be generated other than by
155  * using a user-type resource.
156  */
157 enum res_e {
158         res_0 = 0,
159         res_cur,
160         res_bmp,
161         res_ico,
162         res_men,
163         res_dlg,
164         res_stt,
165         res_fntdir,
166         res_fnt,
167         res_acc,
168         res_rdt,
169         res_msg,
170         res_curg,
171         res_13,         /* Hm, wonder why its not used... */
172         res_icog,
173         res_15,
174         res_ver,
175         res_dlginc,     /* Not implemented, no layout available */
176         res_18,
177         res_pnp,        /* Not implemented, no layout available */
178         res_vxd,        /* Not implemented, no layout available */
179         res_anicur,
180         res_aniico,
181         res_html,       /* Not implemented, no layout available */
182
183         res_dlginit = WRC_RT_DLGINIT,   /* 240 */
184         res_toolbar = WRC_RT_TOOLBAR,   /* 241 */
185
186         res_usr = 256 + 6
187 };
188
189 /* Raw bytes in a row... */
190 typedef struct raw_data {
191         unsigned int    size;
192         char            *data;
193         lvc_t           lvc;            /* Localized data */
194 } raw_data_t;
195
196 /* Dialog structures */
197 typedef struct control {
198         struct control  *next;          /* List of controls */
199         struct control  *prev;
200         name_id_t       *ctlclass;      /* ControlClass */
201         name_id_t       *title;         /* Title of control */
202         int             id;
203         int             x;              /* Position */
204         int             y;
205         int             width;          /* Size */
206         int             height;
207         style_t         *style;         /* Style */
208         style_t         *exstyle;
209         DWORD           helpid;         /* EX: */
210         int             gotstyle;       /* Used to determine whether the default */
211         int             gotexstyle;     /* styles must be set */
212         int             gothelpid;
213         raw_data_t      *extra;         /* EX: number of extra bytes in resource */
214 } control_t;
215
216 typedef struct dialog {
217         DWORD           memopt;
218         int             x;              /* Position */
219         int             y;
220         int             width;          /* Size */
221         int             height;
222         style_t         *style;         /* Style */
223         style_t         *exstyle;
224         DWORD           helpid;         /* EX: */
225         int             gotstyle;       /* Used to determine whether the default */
226         int             gotexstyle;     /* styles must be set */
227         int             gothelpid;
228         int             is_ex;
229         name_id_t       *menu;
230         name_id_t       *dlgclass;
231         string_t        *title;
232         font_id_t       *font;
233         lvc_t           lvc;
234         control_t       *controls;
235 } dialog_t;
236
237 /* Menu structures */
238 typedef struct menu_item {
239         struct menu_item *next;
240         struct menu_item *prev;
241         struct menu_item *popup;
242         int             id;
243         DWORD           type;
244         DWORD           state;
245         int             helpid;
246         string_t        *name;
247         int             gotid;
248         int             gottype;
249         int             gotstate;
250         int             gothelpid;
251 } menu_item_t;
252
253 typedef struct menu {
254         DWORD           memopt;
255         lvc_t           lvc;
256         int             is_ex;
257         menu_item_t     *items;
258 } menu_t;
259
260 typedef struct itemex_opt
261 {
262         int     id;
263         DWORD   type;
264         DWORD   state;
265         int     helpid;
266         int     gotid;
267         int     gottype;
268         int     gotstate;
269         int     gothelpid;
270 } itemex_opt_t;
271
272 /*
273  * Font resources
274  */
275 typedef struct font {
276         DWORD           memopt;
277         raw_data_t      *data;
278 } font_t;
279
280 typedef struct fontdir {
281         DWORD           memopt;
282         raw_data_t      *data;
283 } fontdir_t;
284
285 /*
286  * Icon resources
287  */
288 typedef struct icon_header {
289         WORD    reserved;       /* Don't know, should be 0 I guess */
290         WORD    type;           /* Always 1 for icons */
291         WORD    count;          /* Number of packed icons in resource */
292 } icon_header_t;
293
294 typedef struct icon_dir_entry {
295         BYTE    width;          /* From the SDK doc. */
296         BYTE    height;
297         BYTE    nclr;
298         BYTE    reserved;
299         WORD    planes;
300         WORD    bits;
301         DWORD   ressize;
302         DWORD   offset;
303 } icon_dir_entry_t;
304
305 typedef struct icon {
306         struct icon     *next;
307         struct icon     *prev;
308         lvc_t           lvc;
309         int             id;     /* Unique icon id within resource file */
310         int             width;  /* Field from the IconDirEntry */
311         int             height;
312         int             nclr;
313         int             planes;
314         int             bits;
315         raw_data_t      *data;
316 } icon_t;
317
318 typedef struct icon_group {
319         DWORD           memopt;
320         lvc_t           lvc;
321         icon_t          *iconlist;
322         int             nicon;
323 } icon_group_t;
324
325 /*
326  * Cursor resources
327  */
328 typedef struct cursor_header {
329         WORD    reserved;       /* Don't know, should be 0 I guess */
330         WORD    type;           /* Always 2 for cursors */
331         WORD    count;          /* Number of packed cursors in resource */
332 } cursor_header_t;
333
334 typedef struct cursor_dir_entry {
335         BYTE    width;          /* From the SDK doc. */
336         BYTE    height;
337         BYTE    nclr;
338         BYTE    reserved;
339         WORD    xhot;
340         WORD    yhot;
341         DWORD   ressize;
342         DWORD   offset;
343 } cursor_dir_entry_t;
344
345 typedef struct cursor {
346         struct cursor   *next;
347         struct cursor   *prev;
348         lvc_t           lvc;
349         int             id;     /* Unique icon id within resource file */
350         int             width;  /* Field from the CursorDirEntry */
351         int             height;
352         int             nclr;
353         int             planes;
354         int             bits;
355         int             xhot;
356         int             yhot;
357         raw_data_t      *data;
358 } cursor_t;
359
360 typedef struct cursor_group {
361         DWORD           memopt;
362         lvc_t           lvc;
363         cursor_t        *cursorlist;
364         int             ncursor;
365 } cursor_group_t;
366
367 /*
368  * Animated cursors and icons
369  */
370 typedef struct aniheader {
371         DWORD   structsize;     /* Header size (36 bytes) */
372         DWORD   frames;         /* Number of unique icons in this cursor */
373         DWORD   steps;          /* Number of blits before the animation cycles */
374         DWORD   cx;             /* reserved, must be 0? */
375         DWORD   cy;             /* reserved, must be 0? */
376         DWORD   bitcount;       /* reserved, must be 0? */
377         DWORD   planes;         /* reserved, must be 0? */
378         DWORD   rate;           /* Default rate (1/60th of a second) if "rate" not present */
379         DWORD   flags;          /* Animation flag (1==AF_ICON, although both icons and cursors set this) */
380 } aniheader_t;
381
382 typedef struct riff_tag {
383         BYTE    tag[4];
384         DWORD   size;
385 } riff_tag_t;
386
387 typedef struct ani_curico {
388         DWORD           memopt;
389         raw_data_t      *data;
390 } ani_curico_t;
391
392 typedef struct ani_any {
393         enum res_e      type;
394         union {
395                 ani_curico_t    *ani;
396                 cursor_group_t  *curg;
397                 icon_group_t    *icog;
398         } u;
399 } ani_any_t;
400
401 /*
402  * Bitmaps
403  */
404 typedef struct bitmap {
405         DWORD           memopt;
406         raw_data_t      *data;
407 } bitmap_t;
408
409 typedef struct html {
410         DWORD           memopt;
411         raw_data_t      *data;
412 } html_t;
413
414 typedef struct rcdata {
415         DWORD           memopt;
416         raw_data_t      *data;
417 } rcdata_t;
418
419 typedef struct {
420         DWORD           memopt;
421         name_id_t       *type;
422         raw_data_t      *data;
423 } user_t;
424
425 /*
426  * Messagetables
427  */
428 typedef struct msgtab_block {
429         DWORD   idlo;           /* Lowest id in the set */
430         DWORD   idhi;           /* Highest is in the set */
431         DWORD   offset;         /* Offset from resource start to first entry */
432 } msgtab_block_t;
433
434 typedef struct msgtab_entry {
435         WORD    length;         /* Length of the data in bytes */
436         WORD    flags;          /* 0 for char, 1 for WCHAR */
437 /*      {char}|{WCHAR} data[...]; */
438 } msgtab_entry_t;
439
440 typedef struct messagetable {
441         DWORD           memopt;
442         raw_data_t      *data;
443 } messagetable_t;
444
445 /* StringTable structures */
446 typedef struct stt_entry {
447         string_t                *str;
448         int                     id;
449         DWORD                   memopt;
450         characts_t              *characts;
451         version_t               *version;
452 } stt_entry_t;
453
454 typedef struct stringtable {
455         struct stringtable      *next;
456         struct stringtable      *prev;
457         DWORD                   memopt;
458         lvc_t                   lvc;
459         int                     idbase;
460         int                     nentries;
461         stt_entry_t             *entries;
462 } stringtable_t;
463
464 /* VersionInfo structures */
465 enum ver_val_e {val_str, val_words, val_block};
466
467 struct ver_block;       /* Forward ref */
468
469 typedef struct ver_words {
470         WORD    *words;
471         int     nwords;
472 } ver_words_t;
473
474 typedef struct ver_value {
475         struct ver_value        *next;
476         struct ver_value        *prev;
477         string_t                *key;
478         union {
479                 string_t                *str;
480                 ver_words_t             *words;
481                 struct ver_block        *block;
482         } value;
483         enum ver_val_e          type;
484 } ver_value_t;
485
486 typedef struct ver_block {
487         struct ver_block        *next;
488         struct ver_block        *prev;
489         string_t                *name;
490         ver_value_t             *values;
491 } ver_block_t;
492
493 typedef struct versioninfo {
494         int     filever_maj1;
495         int     filever_maj2;
496         int     filever_min1;
497         int     filever_min2;
498         int     prodver_maj1;
499         int     prodver_maj2;
500         int     prodver_min1;
501         int     prodver_min2;
502         int     fileos;
503         int     fileflags;
504         int     fileflagsmask;
505         int     filetype;
506         int     filesubtype;
507         struct {
508                 unsigned fv:1;
509                 unsigned pv:1;
510                 unsigned fo:1;
511                 unsigned ff:1;
512                 unsigned ffm:1;
513                 unsigned ft:1;
514                 unsigned fst:1;
515         } gotit;
516         ver_block_t     *blocks;
517         lvc_t           lvc;
518         DWORD           memopt;
519 } versioninfo_t;
520
521 /* Accelerator structures */
522 #define WRC_AF_VIRTKEY  0x0001
523 #define WRC_AF_NOINVERT 0x0002
524 #define WRC_AF_SHIFT    0x0004
525 #define WRC_AF_CONTROL  0x0008
526 #define WRC_AF_ALT      0x0010
527 #define WRC_AF_ASCII    0x4000
528
529 typedef struct event {
530         struct event    *next;
531         struct event    *prev;
532         int             flags;
533         int             key;
534         int             id;
535 } event_t;
536
537 typedef struct accelerator {
538         DWORD           memopt;
539         lvc_t           lvc;
540         event_t         *events;
541 } accelerator_t;
542
543 /* Toolbar structures */
544 typedef struct toolbar_item {
545         struct toolbar_item     *next;
546         struct toolbar_item     *prev;
547         int                     id;
548 } toolbar_item_t;
549
550 typedef struct toolbar {
551         DWORD           memopt;
552         lvc_t           lvc;
553         int             button_width;
554         int             button_height;
555         int             nitems;
556         toolbar_item_t  *items;
557 } toolbar_t;
558
559 typedef struct dlginit {
560         DWORD           memopt;
561         raw_data_t      *data;
562 } dlginit_t;
563
564
565 /* A top-level resource node */
566 typedef struct resource {
567         struct resource *next;
568         struct resource *prev;
569         enum res_e      type;
570         name_id_t       *name;  /* resource's name */
571         language_t      *lan;   /* Only used as a sorting key and c-name creation*/
572         union {
573                 accelerator_t   *acc;
574                 ani_curico_t    *ani;
575                 bitmap_t        *bmp;
576                 cursor_t        *cur;
577                 cursor_group_t  *curg;
578                 dialog_t        *dlg;
579                 dlginit_t       *dlgi;
580                 font_t          *fnt;
581                 fontdir_t       *fnd;
582                 icon_t          *ico;
583                 icon_group_t    *icog;
584                 menu_t          *men;
585                 messagetable_t  *msg;
586                 html_t          *html;
587                 rcdata_t        *rdt;
588                 stringtable_t   *stt;
589                 toolbar_t       *tbt;
590                 user_t          *usr;
591                 versioninfo_t   *ver;
592                 void            *overlay; /* To catch all types at once... */
593         } res;
594         res_t           *binres;        /* To binary converted resource */
595         char            *c_name;        /* BaseName in output */
596         DWORD           memopt;
597 } resource_t;
598
599 /* Resource count */
600 typedef struct res32_count {
601         int                     count;
602         resource_t              **rsc;
603 } res32_count_t;
604
605 typedef struct res_count {
606         name_id_t               type;
607         int                     count;          /* win16 mode */
608         resource_t              **rscarray;
609         int                     count32;
610         res32_count_t           *rsc32array;    /* win32 mode */
611         int                     n_id_entries;
612         int                     n_name_entries;
613 } res_count_t;
614
615 typedef struct style_pair {
616         style_t                 *style;
617         style_t                 *exstyle;
618 } style_pair_t;
619
620 #endif