GPLization banner introduced to *.[hc] files
[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  * Copyright (C) 2001-2003 Fhg Fokus
11  *
12  * This file is part of ser, a free SIP server.
13  *
14  * ser is free software; you can redistribute it and/or modify
15  * it under the terms of the GNU General Public License as published by
16  * the Free Software Foundation; either version 2 of the License, or
17  * (at your option) any later version
18  *
19  * For a license to use the ser software under conditions
20  * other than those described here, or to purchase support for this
21  * software, please contact iptel.org by e-mail at the following addresses:
22  *    info@iptel.org
23  *
24  * ser is distributed in the hope that it will be useful,
25  * but WITHOUT ANY WARRANTY; without even the implied warranty of
26  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
27  * GNU General Public License for more details.
28  *
29  * You should have received a copy of the GNU General Public License 
30  * along with this program; if not, write to the Free Software 
31  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
32  */
33
34
35 #include "parse_event.h"
36 #include "../mem/mem.h"    /* pkg_malloc, pkg_free */
37 #include "../dprint.h"
38 #include <string.h>        /* memset */
39 #include "../trim.h"       /* trim_leading */
40 #include <stdio.h>         /* printf */
41
42
43 #define PRES_STR "presence"
44 #define PRES_STR_LEN 8
45
46
47 static inline char* skip_token_nodot(char* _b, int _l)
48 {
49         int i = 0;
50
51         for(i = 0; i < _l; i++) {
52                 switch(_b[i]) {
53                 case ' ':
54                 case '\r':
55                 case '\n':
56                 case '\t':
57                 case ';':
58                 case '.':
59                         return _b + i;
60                 }
61         }
62
63         return _b + _l;
64 }
65
66
67 static inline int event_parser(char* _s, int _l, event_t* _e)
68 {
69         str tmp;
70         char* end;
71
72         tmp.s = _s;
73         tmp.len = _l;
74
75         trim_leading(&tmp);
76
77         if (tmp.len == 0) {
78                 LOG(L_ERR, "event_parser(): Empty body\n");
79                 return -1;
80         }
81
82         _e->text.s = tmp.s;
83
84         end = skip_token_nodot(tmp.s, tmp.len);
85
86         _e->text.len = end - tmp.s;
87
88         if ((_e->text.len == PRES_STR_LEN) && 
89             !strncasecmp(PRES_STR, tmp.s, _e->text.len)) {
90                 _e->parsed = EVENT_PRESENCE;
91         } else {
92                 _e->parsed = EVENT_OTHER;
93         }
94
95         return 0;
96 }
97
98
99 /*
100  * Parse Event header field body
101  */
102 int parse_event(struct hdr_field* _h)
103 {
104         event_t* e;
105
106         if (_h->parsed != 0) {
107                 return 0;
108         }
109
110         e = (event_t*)pkg_malloc(sizeof(event_t));
111         if (e == 0) {
112                 LOG(L_ERR, "parse_event(): No memory left\n");
113                 return -1;
114         }
115
116         memset(e, 0, sizeof(event_t));
117
118         if (event_parser(_h->body.s, _h->body.len, e) < 0) {
119                 LOG(L_ERR, "parse_event(): Error in event_parser\n");
120                 pkg_free(e);
121                 return -2;
122         }
123
124         _h->parsed = (void*)e;
125         return 0;
126 }
127
128
129 /*
130  * Free all memory
131  */
132 void free_event(event_t** _e)
133 {
134         if (*_e) pkg_free(*_e);
135         *_e = 0;
136 }
137
138
139 /*
140  * Print structure, for debugging only
141  */
142 void print_event(event_t* _e)
143 {
144         printf("===Event===\n");
145         printf("text  : \'%.*s\'\n", _e->text.len, _e->text.s);
146         printf("parsed: %s\n", 
147                (_e->parsed == EVENT_PRESENCE) ? ("EVENT_PRESENCE") : ("EVENT_OTHER"));
148         printf("===/Event===\n");
149 }