4c8365d07de4764124414f747d181d1debee79a4
[sip-router] / parser / parse_event.c
1 /*
2  * $Id$
3  *
4  * Event header field body parser.
5  * The parser was written for Presence Agent module only.
6  * it recognize presence package only, no subpackages, no parameters
7  * It should be replaced by a more generic parser if subpackages or
8  * parameters should be parsed too.
9  */
10
11 #include "parse_event.h"
12 #include "../mem/mem.h"    /* pkg_malloc, pkg_free */
13 #include "../dprint.h"
14 #include <string.h>        /* memset */
15 #include "../trim.h"       /* trim_leading */
16 #include <stdio.h>         /* printf */
17
18
19 #define PRES_STR "presence"
20 #define PRES_STR_LEN 8
21
22
23 static inline char* skip_token_nodot(char* _b, int _l)
24 {
25         int i = 0;
26
27         for(i = 0; i < _l; i++) {
28                 switch(_b[i]) {
29                 case ' ':
30                 case '\r':
31                 case '\n':
32                 case '\t':
33                 case ';':
34                 case '.':
35                         return _b + i;
36                 }
37         }
38
39         return _b + _l;
40 }
41
42
43 static inline int event_parser(char* _s, int _l, event_t* _e)
44 {
45         str tmp;
46         char* end;
47
48         tmp.s = _s;
49         tmp.len = _l;
50
51         trim_leading(&tmp);
52
53         if (tmp.len == 0) {
54                 LOG(L_ERR, "event_parser(): Empty body\n");
55                 return -1;
56         }
57
58         _e->text.s = tmp.s;
59
60         end = skip_token_nodot(tmp.s, tmp.len);
61
62         _e->text.len = end - tmp.s;
63
64         if ((_e->text.len == PRES_STR_LEN) && 
65             !strncasecmp(PRES_STR, tmp.s, _e->text.len)) {
66                 _e->parsed = EVENT_PRESENCE;
67         } else {
68                 _e->parsed = EVENT_OTHER;
69         }
70
71         return 0;
72 }
73
74
75 /*
76  * Parse Event header field body
77  */
78 int parse_event(struct hdr_field* _h)
79 {
80         event_t* e;
81
82         if (_h->parsed != 0) {
83                 return 0;
84         }
85
86         e = (event_t*)pkg_malloc(sizeof(event_t));
87         if (e == 0) {
88                 LOG(L_ERR, "parse_event(): No memory left\n");
89                 return -1;
90         }
91
92         memset(e, 0, sizeof(event_t));
93
94         if (event_parser(_h->body.s, _h->body.len, e) < 0) {
95                 LOG(L_ERR, "parse_event(): Error in event_parser\n");
96                 pkg_free(e);
97                 return -2;
98         }
99
100         _h->parsed = (void*)e;
101         return 0;
102 }
103
104
105 /*
106  * Free all memory
107  */
108 void free_event(event_t** _e)
109 {
110         if (*_e) pkg_free(*_e);
111         *_e = 0;
112 }
113
114
115 /*
116  * Print structure, for debugging only
117  */
118 void print_event(event_t* _e)
119 {
120         printf("===Event===\n");
121         printf("text  : \'%.*s\'\n", _e->text.len, _e->text.s);
122         printf("parsed: %s\n", 
123                (_e->parsed == EVENT_PRESENCE) ? ("EVENT_PRESENCE") : ("EVENT_OTHER"));
124         printf("===/Event===\n");
125 }