123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- /*
- * $Id$
- *
- * Event header field body parser.
- * The parser was written for Presence Agent module only.
- * it recognize presence package only, no subpackages, no parameters
- * It should be replaced by a more generic parser if subpackages or
- * parameters should be parsed too.
- *
- * Copyright (C) 2001-2003 Fhg Fokus
- *
- * This file is part of ser, a free SIP server.
- *
- * ser is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version
- *
- * For a license to use the ser software under conditions
- * other than those described here, or to purchase support for this
- * software, please contact iptel.org by e-mail at the following addresses:
- * [email protected]
- *
- * ser is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
- #include "parse_event.h"
- #include "../mem/mem.h" /* pkg_malloc, pkg_free */
- #include "../dprint.h"
- #include <string.h> /* memset */
- #include "../trim.h" /* trim_leading */
- #include <stdio.h> /* printf */
- #define PRES_STR "presence"
- #define PRES_STR_LEN 8
- static inline char* skip_token_nodot(char* _b, int _l)
- {
- int i = 0;
- for(i = 0; i < _l; i++) {
- switch(_b[i]) {
- case ' ':
- case '\r':
- case '\n':
- case '\t':
- case ';':
- case '.':
- return _b + i;
- }
- }
- return _b + _l;
- }
- static inline int event_parser(char* _s, int _l, event_t* _e)
- {
- str tmp;
- char* end;
- tmp.s = _s;
- tmp.len = _l;
- trim_leading(&tmp);
- if (tmp.len == 0) {
- LOG(L_ERR, "event_parser(): Empty body\n");
- return -1;
- }
- _e->text.s = tmp.s;
- end = skip_token_nodot(tmp.s, tmp.len);
- _e->text.len = end - tmp.s;
- if ((_e->text.len == PRES_STR_LEN) &&
- !strncasecmp(PRES_STR, tmp.s, _e->text.len)) {
- _e->parsed = EVENT_PRESENCE;
- } else {
- _e->parsed = EVENT_OTHER;
- }
- return 0;
- }
- /*
- * Parse Event header field body
- */
- int parse_event(struct hdr_field* _h)
- {
- event_t* e;
- if (_h->parsed != 0) {
- return 0;
- }
- e = (event_t*)pkg_malloc(sizeof(event_t));
- if (e == 0) {
- LOG(L_ERR, "parse_event(): No memory left\n");
- return -1;
- }
- memset(e, 0, sizeof(event_t));
- if (event_parser(_h->body.s, _h->body.len, e) < 0) {
- LOG(L_ERR, "parse_event(): Error in event_parser\n");
- pkg_free(e);
- return -2;
- }
- _h->parsed = (void*)e;
- return 0;
- }
- /*
- * Free all memory
- */
- void free_event(event_t** _e)
- {
- if (*_e) pkg_free(*_e);
- *_e = 0;
- }
- /*
- * Print structure, for debugging only
- */
- void print_event(event_t* _e)
- {
- printf("===Event===\n");
- printf("text : \'%.*s\'\n", _e->text.len, _e->text.s);
- printf("parsed: %s\n",
- (_e->parsed == EVENT_PRESENCE) ? ("EVENT_PRESENCE") : ("EVENT_OTHER"));
- printf("===/Event===\n");
- }
|