3ef9f3161c8db450ef00ac9ef030d56bed7cf524
[citadel.git] / citadel / modules / xmpp / xmpp_xmacros.c
1 #include <stdio.h>
2 #include <expat.h>
3 #include <libcitadel.h>
4 #include "ctdl_module.h"
5 #include "serv_xmpp.h"
6
7 void *GetToken_iq(void)
8 {
9         return &XMPP->IQ;
10 }
11 void *GetToken_piq(void)
12 {
13         return NULL;
14 }
15
16 void *GetToken_message(void)
17 {
18         return NULL;
19 }
20
21
22 #define STRPROP(STRUCTNAME, NAME)                                       \
23         if (StrLength(pdata->NAME) > 0)                                 \
24         {                                                               \
25         XPut(#NAME, sizeof(#NAME) - 1);                                 \
26         XPut("=\"", 2);                                                 \
27         XPutProp(SKEY(pdata->NAME));                                    \
28         XPut("\" ", 2);                                                 \
29         }
30
31 #define PAYLOAD(STRUCTNAME, NAME)                                       \
32         XPrint(#NAME, sizeof(#NAME) -1,                                 \
33                XCLOSED,                                                 \
34                TYPE_BODYSTR, SKEY(pdata->NAME),                         \
35                TYPE_ARGEND);
36
37 #define THENAMESPACE(STRUCTNAME, NAME)                                  \
38         XPut(#NAME, sizeof(#NAME) - 1);                                 \
39         XPut("=\"", 2);                                                 \
40         XPutProp(NAMESPACE_##STRUCTNAME,                                \
41                  sizeof(NAMESPACE_##STRUCTNAME)-1);                     \
42         XPut("\" ", 2);                                                 
43
44 #define TOKEN(NAME, STRUCT)                                             \
45         void serialize_##NAME(TheToken_##NAME *pdata, int Close)        \
46         {                                                               \
47         XPUT("<");                                                      \
48         XPut(#NAME, sizeof(#NAME));                                     \
49         XPUT(" ");                                                      \
50         STRUCT ;                                                        \
51         XPUT(">");                                                      \
52         if (Close)                                                      \
53         {                                                               \
54                 XPut("</", 2);                                          \
55                 XPut(#NAME, sizeof(#NAME));                             \
56                 XPut(">", 1);                                           \
57         }                                                               \
58         }
59
60 #include "token.def"
61 #undef STRPROP
62 #undef PAYLOAD
63 #undef TOKEN
64
65
66 #define STRPROP(STRUCTNAME, NAME)                                       \
67         FreeStrBuf(&pdata->NAME);
68
69 #define PAYLOAD(STRUCTNAME, NAME)                                       \
70         FreeStrBuf(&pdata->NAME);
71
72 #define TOKEN(NAME, STRUCT)                                             \
73         void free_buf_##NAME(TheToken_##NAME *pdata)                    \
74         {                                                               \
75                 STRUCT ;                                                \
76         }
77
78 #include "token.def"
79 #undef STRPROP
80 #undef PAYLOAD
81 #undef TOKEN
82
83 #define TOKEN(NAME, STRUCT)                                             \
84         void free_##NAME(TheToken_##NAME *pdata)                        \
85         {                                                               \
86                 free_buf_##NAME(pdata);                                 \
87                 free(pdata);                                            \
88         }
89
90 #include "token.def"
91 #undef STRPROP
92 #undef TOKEN
93
94
95
96 CTDL_MODULE_INIT(xmpp_xmacros)
97 {
98         if (!threading) {
99 #define STRPROP(TOKENNAME, PROPERTYNAME)                                \
100                 long offset##PROPERTYNAME =                             \
101                         offsetof(TheToken_##TOKENNAME, PROPERTYNAME);   \
102                 XMPP_RegisterTokenProperty(                             \
103                         NAMESPACE_##TOKENNAME,                          \
104                         sizeof(NAMESPACE_##TOKENNAME)-1,                \
105                         #TOKENNAME, sizeof(#TOKENNAME)-1,               \
106                         #PROPERTYNAME, sizeof(#PROPERTYNAME)-1,         \
107                         GetToken_##TOKENNAME,                           \
108                         offset##PROPERTYNAME);
109 #define PAYLOAD(TOKENNAME, PROPERTYNAME)                                \
110                 long offset##PROPERTYNAME =                             \
111                         offsetof(TheToken_##TOKENNAME, PROPERTYNAME);   \
112                 XMPP_RegisterTokenProperty(                             \
113                         NAMESPACE_##TOKENNAME,                          \
114                         sizeof(NAMESPACE_##TOKENNAME)-1,                \
115                         #TOKENNAME, sizeof(#TOKENNAME)-1,               \
116                         NULL, 0,                                        \
117                         GetToken_##TOKENNAME,                           \
118                         offset##PROPERTYNAME);
119 #define TOKEN(NAME, STRUCT) STRUCT
120 #include "token.def"
121 #undef STRPROP
122 #undef TOKEN
123         }
124
125         /* return our module name for the log */
126         return "xmpp_xmacros";
127 }