00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef _PVAR_H_
00030 #define _PVAR_H_
00031
00032 #include "str.h"
00033 #include "usr_avp.h"
00034 #include "parser/msg_parser.h"
00035
00036 #define PV_MARKER_STR "$"
00037 #define PV_MARKER '$'
00038
00039 #define PV_LNBRACKET_STR "("
00040 #define PV_LNBRACKET '('
00041 #define PV_RNBRACKET_STR ")"
00042 #define PV_RNBRACKET ')'
00043
00044 #define PV_LIBRACKET_STR "["
00045 #define PV_LIBRACKET '['
00046 #define PV_RIBRACKET_STR "]"
00047 #define PV_RIBRACKET ']'
00048
00049 #define PV_VAL_NONE 0
00050 #define PV_VAL_NULL 1
00051 #define PV_VAL_EMPTY 2
00052 #define PV_VAL_STR 4
00053 #define PV_VAL_INT 8
00054 #define PV_TYPE_INT 16
00055 #define PV_VAL_PKG 32
00056 #define PV_VAL_SHM 64
00057
00058 #define PV_NAME_INTSTR 0
00059 #define PV_NAME_PVAR 1
00060 #define PV_NAME_OTHER 2
00061
00062 #define PV_IDX_INT 0
00063 #define PV_IDX_PVAR 1
00064 #define PV_IDX_ALL 2
00065
00066
00067 #define pv_has_dname(pv) ((pv)->pvp.pvn.type==PV_NAME_PVAR)
00068 #define pv_has_iname(pv) ((pv)->pvp.pvn.type==PV_NAME_INTSTR \
00069 && !((pv)->pvp.pvn.u.isname.type&AVP_NAME_STR))
00070 #define pv_has_sname(pv) ((pv)->pvp.pvn.type==PV_NAME_INTSTR \
00071 && (pv)->pvp.pvn.u.isname.type&AVP_NAME_STR)
00072 #define pv_is_w(pv) ((pv)->setf!=NULL)
00073
00074 enum _pv_type {
00075 PVT_NONE=0, PVT_EMPTY, PVT_NULL,
00076 PVT_MARKER, PVT_AVP, PVT_HDR,
00077 PVT_RURI, PVT_RURI_USERNAME, PVT_RURI_DOMAIN,
00078 PVT_DSTURI, PVT_COLOR, PVT_BRANCH,
00079 PVT_FROM, PVT_TO, PVT_OURI,
00080 PVT_SCRIPTVAR, PVT_MSG_BODY, PVT_CONTEXT,
00081 PVT_OTHER, PVT_EXTRA
00082 };
00083
00084 typedef enum _pv_type pv_type_t;
00085 typedef int pv_flags_t;
00086
00087
00088 typedef struct _pv_value
00089 {
00090 str rs;
00091 int ri;
00092 int flags;
00093 } pv_value_t, *pv_value_p;
00094
00095 typedef struct _pv_name
00096 {
00097 int type;
00098 union {
00099 struct {
00100 int type;
00101 int_str name;
00102 } isname;
00103 void *dname;
00104 } u;
00105 } pv_name_t, *pv_name_p;
00106
00107 typedef struct _pv_index
00108 {
00109 int type;
00110 union {
00111 int ival;
00112 void *dval;
00113 } u;
00114 } pv_index_t, *pv_index_p;
00115
00116 typedef struct _pv_param
00117 {
00118 pv_name_t pvn;
00119 pv_index_t pvi;
00120 } pv_param_t, *pv_param_p;
00121
00122 typedef int (*pv_getf_t) (struct sip_msg*, pv_param_t*, pv_value_t*);
00123 typedef int (*pv_setf_t) (struct sip_msg*, pv_param_t*, int, pv_value_t*);
00124
00125 typedef struct _pv_spec {
00126 pv_type_t type;
00127 pv_getf_t getf;
00128 pv_setf_t setf;
00129 pv_param_t pvp;
00130 void *trans;
00131 } pv_spec_t, *pv_spec_p;
00132
00133 typedef int (*pv_parse_name_f)(pv_spec_p sp, str *in);
00134 typedef int (*pv_parse_index_f)(pv_spec_p sp, str *in);
00135 typedef int (*pv_init_param_f)(pv_spec_p sp, int param);
00136
00137 #define pv_alter_context(pv) ((pv)->type==PVT_CONTEXT \
00138 || (pv)->type==PVT_BRANCH)
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151 typedef struct _pv_export {
00152 str name;
00153 pv_type_t type;
00154 pv_getf_t getf;
00155 pv_setf_t setf;
00156 pv_parse_name_f parse_name;
00157 pv_parse_index_f parse_index;
00158 pv_init_param_f init_param;
00159 int iparam;
00160 } pv_export_t;
00161
00162 typedef struct _pv_elem
00163 {
00164 str text;
00165 pv_spec_t spec;
00166 struct _pv_elem *next;
00167 } pv_elem_t, *pv_elem_p;
00168
00169 char* pv_parse_spec(str *in, pv_spec_p sp);
00170 int pv_get_spec_value(struct sip_msg* msg, pv_spec_p sp, pv_value_t *value);
00171 int pv_set_spec_value(struct sip_msg* msg, pv_spec_p sp, int op,
00172 pv_value_t *value);
00173 int pv_printf(struct sip_msg* msg, pv_elem_p list, char *buf, int *len);
00174 int pv_elem_free_all(pv_elem_p log);
00175 void pv_value_destroy(pv_value_t *val);
00176 void pv_spec_free(pv_spec_t *spec);
00177 int pv_spec_dbg(pv_spec_p sp);
00178 int pv_get_spec_index(struct sip_msg* msg, pv_param_p ip, int *idx, int *flags);
00179 int pv_get_avp_name(struct sip_msg* msg, pv_param_p ip, int_str *avp_name,
00180 unsigned short *name_type);
00181 int pv_get_spec_name(struct sip_msg* msg, pv_param_p ip, pv_value_t *name);
00182 int pv_parse_format(str *in, pv_elem_p *el);
00183 int pv_parse_index(pv_spec_p sp, str *in);
00184 int pv_init_iname(pv_spec_p sp, int param);
00185 int pv_printf_s(struct sip_msg* msg, pv_elem_p list, str *s);
00186 void pv_api_destroy(void);
00187
00188 typedef struct _pvname_list {
00189 pv_spec_t sname;
00190 struct _pvname_list *next;
00191 } pvname_list_t, *pvname_list_p;
00192
00193 typedef struct pv_spec_list {
00194 pv_spec_p spec;
00195 struct pv_spec_list *next;
00196 } pv_spec_list_t, *pv_spec_list_p;
00197
00198 pvname_list_t* parse_pvname_list(str *in, unsigned int type);
00199
00200 int register_pvars_mod(char *mod_name, pv_export_t *items);
00201 int pv_free_extra_list(void);
00202
00203
00204 int pv_get_null(struct sip_msg *msg, pv_param_t *param, pv_value_t *res);
00205
00206 int pv_get_uintval(struct sip_msg *msg, pv_param_t *param,
00207 pv_value_t *res, unsigned int uival);
00208 int pv_get_sintval(struct sip_msg *msg, pv_param_t *param,
00209 pv_value_t *res, int sival);
00210 int pv_get_strval(struct sip_msg *msg, pv_param_t *param,
00211 pv_value_t *res, str *sval);
00212 int pv_get_strintval(struct sip_msg *msg, pv_param_t *param,
00213 pv_value_t *res, str *sval, int ival);
00214 int pv_get_intstrval(struct sip_msg *msg, pv_param_t *param,
00215 pv_value_t *res, int ival, str *sval);
00216
00217
00218
00219
00220 #define TR_LBRACKET_STR "{"
00221 #define TR_LBRACKET '{'
00222 #define TR_RBRACKET_STR "}"
00223 #define TR_RBRACKET '}'
00224 #define TR_CLASS_MARKER '.'
00225 #define TR_PARAM_MARKER ','
00226
00227 enum _tr_param_type { TR_PARAM_NONE=0, TR_PARAM_STRING, TR_PARAM_NUMBER,
00228 TR_PARAM_SPEC, TR_PARAM_SUBST, TR_PARAM_OTHER };
00229
00230 typedef struct _tr_param {
00231 int type;
00232 union {
00233 int n;
00234 str s;
00235 void *data;
00236 } v;
00237 struct _tr_param *next;
00238 } tr_param_t, *tr_param_p;
00239
00240 typedef int (*tr_func_t) (struct sip_msg *, tr_param_t*, int, pv_value_t*);
00241
00242 typedef struct _trans {
00243 str name;
00244 int type;
00245 int subtype;
00246 tr_func_t trf;
00247 tr_param_t *params;
00248 struct _trans *next;
00249 } trans_t, *trans_p;
00250
00251 typedef char* (*tr_parsef_t)(str *, trans_t *);
00252 typedef struct _tr_export {
00253 str tclass;
00254 tr_parsef_t tparse;
00255 } tr_export_t, *tr_export_p;
00256
00257 char* tr_lookup(str *in, trans_t **tr);
00258 tr_export_t* tr_lookup_class(str *tclass);
00259 int tr_exec(struct sip_msg *msg, trans_t *t, pv_value_t *v);
00260 void tr_param_free(tr_param_t *tp);
00261
00262 int register_trans_mod(char *mod_name, tr_export_t *items);
00263
00264 #endif
00265