pvar.h 8.7 KB

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