core, lib, modules: restructured source code tree
[sip-router] / src / core / pvar.h
1 /*
2  * Copyright (C) 2001-2003 FhG Fokus
3  *
4  * This file is part of Kamailio, a free SIP server.
5  *
6  * Kamailio is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version
10  *
11  * Kamailio 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
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
19  */
20
21 /*!
22  * \file
23  * \brief Kamailio core :: Definitions for Pseudo-variable support
24  */
25
26
27 #ifndef _PVAR_H_
28 #define _PVAR_H_
29
30 #include "str.h"
31 #include "usr_avp.h"
32 #include "parser/msg_parser.h"
33
34 #define PV_MARKER_STR   "$"
35 #define PV_MARKER               '$'
36
37 #define PV_LNBRACKET_STR        "("
38 #define PV_LNBRACKET            '('
39 #define PV_RNBRACKET_STR        ")"
40 #define PV_RNBRACKET            ')'
41
42 #define PV_LIBRACKET_STR        "["
43 #define PV_LIBRACKET            '['
44 #define PV_RIBRACKET_STR        "]"
45 #define PV_RIBRACKET            ']'
46
47 #define PV_VAL_NONE                     0
48 #define PV_VAL_NULL                     1
49 #define PV_VAL_EMPTY            2
50 #define PV_VAL_STR                      4
51 #define PV_VAL_INT                      8
52 #define PV_TYPE_INT                     16
53 #define PV_VAL_PKG                      32
54 #define PV_VAL_SHM                      64
55
56 #define PV_NAME_INTSTR  0
57 #define PV_NAME_PVAR    1
58 #define PV_NAME_OTHER   2
59
60 #define PV_IDX_INT      0
61 #define PV_IDX_PVAR     1
62 #define PV_IDX_ALL      2
63 #define PV_IDX_ITR      3
64
65 /*! if PV name is dynamic, integer, or str */
66 #define pv_has_dname(pv) ((pv)->pvp.pvn.type==PV_NAME_PVAR)
67 #define pv_has_iname(pv) ((pv)->pvp.pvn.type==PV_NAME_INTSTR \
68                                                         && !((pv)->pvp.pvn.u.isname.type&AVP_NAME_STR))
69 #define pv_has_sname(pv) ((pv)->pvp.pvn.type==PV_NAME_INTSTR \
70                                                         && (pv)->pvp.pvn.u.isname.type&AVP_NAME_STR)
71 #define pv_is_w(pv)     ((pv)->setf!=NULL)
72
73 enum _pv_type {
74         PVT_NONE=0,           PVT_EMPTY,             PVT_NULL,
75         PVT_MARKER,           PVT_AVP,               PVT_HDR,
76         PVT_RURI,             PVT_RURI_USERNAME,     PVT_RURI_DOMAIN,
77         PVT_DSTURI,           PVT_COLOR,             PVT_BRANCH,
78         PVT_FROM,             PVT_TO,                PVT_OURI,
79         PVT_SCRIPTVAR,        PVT_MSG_BODY,          PVT_CONTEXT,
80         PVT_XAVP,             PVT_OTHER,             PVT_EXTRA /* keep it last */
81 };
82
83 typedef enum _pv_type pv_type_t;
84 typedef int pv_flags_t;
85
86 typedef void (*pv_name_free_f)(void*);
87
88 typedef struct _pv_value
89 {
90         str rs;    /*!< string value */
91         int ri;    /*!< integer value */
92         int flags; /*!< flags about the type of value */
93 } pv_value_t, *pv_value_p;
94
95 typedef struct _pv_name
96 {
97         int type;             /*!< type of name */
98         pv_name_free_f nfree; /*!< function to free name structure */
99         union {
100                 struct {
101                         int type;     /*!< type of int_str name - compatibility with AVPs */
102                         int_str name; /*!< the value of the name */
103                 } isname;
104                 void *dname;      /*!< PV value - dynamic name */
105         } u;
106 } pv_name_t, *pv_name_p;
107
108 typedef struct _pv_index
109 {
110         int type; /*!< type of PV index */
111         union {
112                 int ival;   /*!< integer value */
113                 void *dval; /*!< PV value - dynamic index */
114         } u;
115 } pv_index_t, *pv_index_p;
116
117 typedef struct _pv_param
118 {
119         pv_name_t    pvn; /*!< PV name */
120         pv_index_t   pvi; /*!< PV index */
121 } pv_param_t, *pv_param_p;
122
123 typedef int (*pv_getf_t) (struct sip_msg*,  pv_param_t*, pv_value_t*);
124 typedef int (*pv_setf_t) (struct sip_msg*,  pv_param_t*, int, pv_value_t*);
125
126 typedef struct _pv_spec {
127         pv_type_t    type;   /*!< type of PV */
128         pv_getf_t    getf;   /*!< get PV value function */
129         pv_setf_t    setf;   /*!< set PV value function */
130         pv_param_t   pvp;    /*!< parameter to be given to get/set functions */
131         void         *trans; /*!< transformations */
132 } pv_spec_t, *pv_spec_p;
133
134 typedef int (*pv_parse_name_f)(pv_spec_p sp, str *in);
135 typedef int (*pv_parse_index_f)(pv_spec_p sp, str *in);
136 typedef int (*pv_init_param_f)(pv_spec_p sp, int param);
137
138 #define pv_alter_context(pv)    ((pv)->type==PVT_CONTEXT \
139                                                                         || (pv)->type==PVT_BRANCH)
140
141 /*! \brief
142  * PV spec format:
143  * - $class_name
144  * - $class_name(inner_name)
145  * - $(class_name[index])
146  * - $(class_name(inner_name)[index])
147  * - $(class_name{transformation})
148  * - $(class_name(inner_name){transformation})
149  * - $(class_name[index]{transformation})
150  * - $(class_name(inner_name)[index]{transformation})
151  */
152 typedef struct _pv_export {
153         str name;                      /*!< class name of PV */
154         pv_type_t type;                /*!< type of PV */
155         pv_getf_t  getf;               /*!< function to get the value */
156         pv_setf_t  setf;               /*!< function to set the value */
157         pv_parse_name_f parse_name;    /*!< function to parse the inner name */
158         pv_parse_index_f parse_index;  /*!< function to parse the index of PV */
159         pv_init_param_f init_param;    /*!< function to init the PV spec */
160         int iparam;                    /*!< parameter for the init function */
161 } pv_export_t;
162
163 typedef struct _pv_elem
164 {
165         str text;
166         pv_spec_t *spec;
167         struct _pv_elem *next;
168 } pv_elem_t, *pv_elem_p;
169
170 char* pv_parse_spec2(str *in, pv_spec_p sp, int silent);
171 #define pv_parse_spec(in, sp) pv_parse_spec2((in), (sp), 0)
172 int pv_get_spec_value(struct sip_msg* msg, pv_spec_p sp, pv_value_t *value);
173 int pv_set_spec_value(struct sip_msg* msg, pv_spec_p sp, int op,
174                 pv_value_t *value);
175 int pv_printf(struct sip_msg* msg, pv_elem_p list, char *buf, int *len);
176 int pv_elem_free_all(pv_elem_p log);
177 void pv_value_destroy(pv_value_t *val);
178 void pv_spec_destroy(pv_spec_t *spec);
179 void pv_spec_free(pv_spec_t *spec);
180 int pv_spec_dbg(pv_spec_p sp);
181 int pv_get_spec_index(struct sip_msg* msg, pv_param_p ip, int *idx, int *flags);
182 int pv_get_avp_name(struct sip_msg* msg, pv_param_p ip, int_str *avp_name,
183                 unsigned short *name_type);
184 int pv_parse_avp_name(pv_spec_p sp, str *in);
185 int pv_get_spec_name(struct sip_msg* msg, pv_param_p ip, pv_value_t *name);
186 int pv_parse_format(str *in, pv_elem_p *el);
187 int pv_parse_index(pv_spec_p sp, str *in);
188 int pv_init_iname(pv_spec_p sp, int param);
189 int pv_printf_s(struct sip_msg* msg, pv_elem_p list, str *s);
190 pv_spec_t* pv_spec_lookup(str *name, int *len);
191
192 typedef struct _pvname_list {
193         pv_spec_t sname;
194         struct _pvname_list *next;
195 } pvname_list_t, *pvname_list_p;
196
197 typedef struct pv_spec_list {
198         pv_spec_p spec;
199         struct pv_spec_list *next;
200 } pv_spec_list_t, *pv_spec_list_p;
201
202 pvname_list_t* parse_pvname_list(str *in, unsigned int type);
203
204 int register_pvars_mod(char *mod_name, pv_export_t *items);
205 int pv_free_extra_list(void);
206
207 int pv_locate_name(str *in);
208 pv_spec_t* pv_cache_get(str *name);
209 str* pv_cache_get_name(pv_spec_t *spec);
210
211 /*! \brief PV helper functions */
212 int pv_get_null(struct sip_msg *msg, pv_param_t *param, pv_value_t *res);
213 int pv_get_strempty(struct sip_msg *msg, pv_param_t *param, pv_value_t *res);
214
215 int pv_get_uintval(struct sip_msg *msg, pv_param_t *param,
216                 pv_value_t *res, unsigned int uival);
217 int pv_get_sintval(struct sip_msg *msg, pv_param_t *param,
218                 pv_value_t *res, int sival);
219 int pv_get_strval(struct sip_msg *msg, pv_param_t *param,
220                 pv_value_t *res, str *sval);
221 int pv_get_strzval(struct sip_msg *msg, pv_param_t *param,
222                 pv_value_t *res, char *sval);
223 int pv_get_strlval(struct sip_msg *msg, pv_param_t *param,
224                 pv_value_t *res, char *sval, int slen);
225 int pv_get_strintval(struct sip_msg *msg, pv_param_t *param,
226                 pv_value_t *res, str *sval, int ival);
227 int pv_get_intstrval(struct sip_msg *msg, pv_param_t *param,
228                 pv_value_t *res, int ival, str *sval);
229
230 /**
231  * Core PV Cache
232  */
233 typedef struct _pv_cache
234 {
235         str pvname;
236         unsigned int pvid;
237         pv_spec_t spec;
238         struct _pv_cache *next;
239 } pv_cache_t;
240
241 #define PV_CACHE_SIZE   32  /*!< pseudo-variables cache table size */
242
243 pv_cache_t **pv_cache_get_table(void);
244
245
246 /**
247  * Transformations
248  */
249 #define TR_LBRACKET_STR         "{"
250 #define TR_LBRACKET             '{'
251 #define TR_RBRACKET_STR         "}"
252 #define TR_RBRACKET             '}'
253 #define TR_CLASS_MARKER         '.'
254 #define TR_PARAM_MARKER         ','
255
256 enum _tr_param_type { TR_PARAM_NONE=0, TR_PARAM_STRING, TR_PARAM_NUMBER,
257         TR_PARAM_SPEC, TR_PARAM_SUBST, TR_PARAM_OTHER };
258
259 typedef struct _tr_param {
260         int type;
261         union {
262                 int n;
263                 str s;
264                 void *data;
265         } v;
266         struct _tr_param *next;
267 } tr_param_t, *tr_param_p;
268
269 typedef int (*tr_func_t) (struct sip_msg *, tr_param_t*, int, pv_value_t*);
270
271 typedef struct _trans {
272         str name;
273         int type;
274         int subtype;
275         tr_func_t trf;
276         tr_param_t *params;
277         struct _trans *next;
278 } trans_t, *trans_p;
279
280 typedef char* (*tr_parsef_t)(str *, trans_t *);
281 typedef struct _tr_export {
282         str tclass;
283         tr_parsef_t tparse;
284 } tr_export_t, *tr_export_p;
285
286 char* tr_lookup(str *in, trans_t **tr);
287 tr_export_t* tr_lookup_class(str *tclass);
288 int tr_exec(struct sip_msg *msg, trans_t *t, pv_value_t *v);
289 void tr_param_free(tr_param_t *tp);
290
291 int register_trans_mod(char *mod_name, tr_export_t *items);
292
293
294 /**
295  * XAVP
296  */
297 typedef struct _pv_xavp_name {
298         str name;
299         pv_spec_t index;
300         struct _pv_xavp_name *next;
301 } pv_xavp_name_t;
302
303 int pv_eval_str(sip_msg_t *msg, str *dst, str *src);
304
305 #endif
306