New script element, Jan's select function framework (@xxx), extended for
[sip-router] / select.h
1 #ifndef _SELECT_H
2 #define _SELECT_H
3
4 #include "str.h"
5 #include "parser/msg_parser.h"
6
7 #define MAX_SELECT_PARAMS 32
8
9 // Flags for parser table FLAG bitfiels
10 #define DIVERSION_MASK   0x00FF
11 // if DIVERSION is set and the function is accepted and has STR param
12 // the param is changed into PARAM_DIV and the value is set to (flags & DIVERSION_MASK)
13 #define DIVERSION        1<<8
14 // if any parameter is expected at this stage
15 #define PARAM_EXPECTED   1<<9
16 // accept if following parameter is STR (any)
17 #define CONSUME_NEXT_STR 1<<10
18 // accept if following parameter is INT
19 #define CONSUME_NEXT_INT 1<<11
20 // next parameter is optional (use with CONSUME_NEXT_STR or CONSUME_NEXT_INT
21 #define OPTIONAL         1<<12
22 // if conversion to common alias is needed
23 // up-to now parsed function would be stored in parent_f
24 // NOTE: the parameter is not consumed for ALIAS, 
25 // so you can leave it as ..,PARAM_INT, STR_NULL,..
26 #define IS_ALIAS         1<<13
27
28 /*
29  * Selector call parameter
30  */
31 typedef enum {
32         PARAM_INT,  /* Integer parameter */
33         PARAM_STR,  /* String parameter */
34         PARAM_DIV,  /* Integer value got from parsing table */
35 } select_param_type_t;
36         
37 typedef union {
38         int i;  /* Integer value */
39         str s;  /* String value */
40 } select_param_value_t;
41         
42 typedef struct sel_param {
43         select_param_type_t type;
44         select_param_value_t v;
45 } select_param_t;
46
47 struct select;
48
49 typedef int (*select_f)(str* res, struct select* s, struct sip_msg* msg);
50
51 typedef struct select {
52         select_f f;
53         select_f parent_f;
54         select_param_t params[MAX_SELECT_PARAMS];
55         int n;
56 } select_t;
57
58 typedef struct {
59         select_f curr_f;
60         select_param_type_t type;
61         str name;
62         select_f new_f;
63         int flags;
64 } select_row_t;
65
66 typedef struct select_table {
67   select_row_t *table;
68   struct select_table *next;
69 } select_table_t;
70
71 /*
72  * Lookup corresponding select function based on
73  * the select parameters
74  */
75 int resolve_select(select_t* s);
76
77 /*
78  * Run the select function
79  */
80 int run_select(str* res, select_t* s, struct sip_msg* msg);
81
82 /*
83  * Print select for debugging purposes 
84  */
85 void print_select(select_t* s);
86
87 /*
88  * Register modules' own select parser table
89  */
90 int register_select_table(select_row_t *table);
91
92 #define SELECT_F(function) extern int function (str* res, select_t* s, struct sip_msg* msg);
93 #define ABSTRACT_F(function) int function (str* res, select_t* s, struct sip_msg* msg) {return -1;}
94
95 #endif /* _SELECT_H */