1 /* entity.h - entity tracking
2  * Copyright (C) 2010 Atheme Development Group
3  */
4 
5 #ifndef ENTITY_H
6 #define ENTITY_H
7 
8 typedef enum {
9 	ENT_ANY = 0,
10 	ENT_USER,
11 	ENT_GROUP,
12 	ENT_EXTTARGET,
13 } myentity_type_t;
14 
15 typedef struct entity_chanacs_validation_vtable entity_chanacs_validation_vtable_t;
16 
17 typedef struct {
18 	object_t parent;
19 	myentity_type_t type;
20 
21 	stringref name;
22 	char id[IDLEN];
23 
24 	mowgli_list_t chanacs;
25 	entity_chanacs_validation_vtable_t *chanacs_validate;
26 } myentity_t;
27 
28 #define entity(x)	((myentity_t *)(x))
29 #define user(x)		(isuser(x) ? (myuser_t *)(x) : NULL)
30 #define group(x)	(isgroup(x) ? (mygroup_t *)(x) : NULL)
31 #define isuser(x)	(x != NULL && entity(x)->type == ENT_USER)
32 #define isgroup(x)	(x != NULL && entity(x)->type == ENT_GROUP)
33 #define isdynamic(x)	(x != NULL && (entity(x)->type == ENT_EXTTARGET))
34 
35 void init_entities(void);
36 void myentity_set_last_uid(const char *last_uid);
37 const char *myentity_get_last_uid(void);
38 const char *myentity_alloc_uid(void);
39 
40 void myentity_put(myentity_t *me);
41 void myentity_del(myentity_t *me);
42 myentity_t *myentity_find(const char *name);
43 myentity_t *myentity_find_ext(const char *name);
44 myentity_t *myentity_find_uid(const char *uid);
45 
46 typedef struct {
47 	mowgli_patricia_iteration_state_t st;
48 	myentity_type_t type;
49 } myentity_iteration_state_t;
50 
51 E void myentity_foreach(int (*cb)(myentity_t *me, void *privdata), void *privdata);
52 E void myentity_foreach_t(myentity_type_t type, int (*cb)(myentity_t *me, void *privdata), void *privdata);
53 E void myentity_foreach_start(myentity_iteration_state_t *state, myentity_type_t type);
54 E void myentity_foreach_next(myentity_iteration_state_t *state);
55 E myentity_t *myentity_foreach_cur(myentity_iteration_state_t *state);
56 
57 #define MYENTITY_FOREACH_T(elem, state, type) for (myentity_foreach_start(state, type); (elem = myentity_foreach_cur(state)); myentity_foreach_next(state))
58 #define MYENTITY_FOREACH(elem, state) MYENTITY_FOREACH_T(elem, state, 0)
59 
60 E void myentity_stats(void (*cb)(const char *line, void *privdata), void *privdata);
61 
62 /* chanacs */
63 E unsigned int myentity_count_channels_with_flagset(myentity_t *mt, unsigned int flagset);
64 E bool myentity_can_register_channel(myentity_t *mt);
65 E bool myentity_allow_foundership(myentity_t *mt);
66 
67 typedef struct {
68 	myentity_t *entity;
69 	const char *name;
70 
71 	bool approval;
72 } hook_myentity_req_t;
73 
74 #endif /* !ENTITY_H */
75