1#ifndef PROTOCOL_H
2#define PROTOCOL_H
3
4#include <stdbool.h>
5#include <stddef.h>
6
7enum message_dir {
8 MSG_REQUEST,
9 MSG_EVENT,
10};
11
12struct argument {
13 char *name;
14 char *type;
15 char *iface;
16 bool nullable;
17 bool new_id;
18};
19
20struct description {
21 char *summary;
22 char *text;
23};
24
25struct enumdef {
26 char *name;
27 struct description desc;
28};
29
30struct message {
31 char *name;
32 enum message_dir dir;
33 int opcode;
34 bool destructor;
35 struct description desc;
36 struct argument *args;
37 size_t nargs;
38 size_t argcap;
39};
40
41struct interface {
42 char *name;
43 int version;
44 struct description desc;
45 struct message *requests;
46 size_t nrequests;
47 size_t requestcap;
48 struct message *events;
49 size_t nevents;
50 size_t eventcap;
51 struct enumdef *enums;
52 size_t nenums;
53 size_t enumcap;
54 bool created_by_local;
55 size_t ncreates;
56};
57
58struct protocol {
59 char *name;
60 struct description desc;
61 struct interface *ifaces;
62 size_t nifaces;
63 size_t ifacecap;
64 size_t total_requests;
65 size_t total_events;
66 size_t total_enums;
67};
68
69struct interface *proto_add_interface(struct protocol *, const char *, int);
70struct interface *proto_find_interface(const struct protocol *, const char *);
71struct message *iface_add_message(struct interface *, enum message_dir, const char *);
72void message_add_arg(struct message *, const char *, const char *, const char *, bool);
73void iface_add_enum(struct interface *, const char *);
74struct enumdef *iface_last_enum(struct interface *);
75void proto_resolve(struct protocol *);
76void proto_free(struct protocol *);
77
78const struct argument *message_creator_arg(const struct message *);
79
80#endif