[SR-Dev] git:master: Refurbished event header field parser.
Klaus Darilion
klaus.mailinglists at pernau.at
Fri Mar 20 10:14:23 CET 2009
Hi Jan!
Have you also upated the affected modules (presence_dialoginfo ....)?
regards
klaus
Jan Janak schrieb:
> Module: sip-router
> Branch: master
> Commit: 1ee365faf8047d7a921da5a0bf5cc7d20f766a27
> URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=1ee365faf8047d7a921da5a0bf5cc7d20f766a27
>
> Author: Jan Janak <jan at iptel.org>
> Committer: Jan Janak <jan at iptel.org>
> Date: Tue Mar 17 17:41:19 2009 +0100
>
> Refurbished event header field parser.
>
> This is a new refurbished version of the Event header parser which adds
> support for extra event packages and parameters needed by kamailio
> presence modules, however both the implementation and the parser API
> are different. It turned out that the original k. event parser (which
> is an extended version of the same parser in ser) did not parse dialog
> event packages correctly. The parser relies on the recently added
> extensions to the generic parameter parser.
>
> First off, the event structure contains different fields now, field
> text has been renamed to name and field parsed has been renamed to type.
> In addition that that there is a new structure dialog which contains
> the linked list of all parsed parameters in variable list and pointers
> to well known dialog event package parameters in structure dialog.
>
> The test for the presence of the sla dialog event parameter would then
> look like this:
>
> if (e->type == EVENT_DIALOG && e->params.dialog.sla) ...
>
> Support for new event types can be easily added by extending the global
> variable events in parse_event.c, previously it was necessary to modify
> the parser function, in the refurbished version it is sufficient just
> to add a new element in the array and define a new event type in
> parse_event.h
>
> The original k. version handled "dialog;sla" and "dialog" as different
> event types. This is no more so, in both cases event->type will be set
> to EVENT_DIALOG and the caller can descriminate them by testing for
> the presence of the sla parameter as described in the text above.
>
> Function free_event has been modified to free the linked list of parsed
> parameters in event->params.list.
>
> ---
>
> parser/parse_event.c | 101 ++++++++++++++++++++++++++++++-------------------
> parser/parse_event.h | 42 +++++++++++++--------
> 2 files changed, 88 insertions(+), 55 deletions(-)
>
> diff --git a/parser/parse_event.c b/parser/parse_event.c
> index 75b7017..98ca5e5 100644
> --- a/parser/parse_event.c
> +++ b/parser/parse_event.c
> @@ -44,18 +44,19 @@
> #include <stdio.h> /* printf */
> #include "../ut.h"
>
> -
> -#define PRES_STR "presence"
> -#define PRES_STR_LEN 8
> -
> -#define PRES_WINFO_STR "presence.winfo"
> -#define PRES_WINFO_STR_LEN 14
> -
> -#define PRES_XCAP_CHANGE_STR "xcap-change"
> -#define PRES_XCAP_CHANGE_STR_LEN 11
> -
> -#define PRES_SIP_PROFILE_STR "sip-profile"
> -#define PRES_SIP_PROFILE_STR_LEN 11
> +static struct {
> + str name;
> + int type;
> +} events[] = {
> + {STR_STATIC_INIT("presence"), EVENT_PRESENCE},
> + {STR_STATIC_INIT("presence.winfo"), EVENT_PRESENCE_WINFO},
> + {STR_STATIC_INIT("xcap-change"), EVENT_XCAP_CHANGE},
> + {STR_STATIC_INIT("sip-profile"), EVENT_SIP_PROFILE},
> + {STR_STATIC_INIT("message-summary"), EVENT_MESSAGE_SUMMARY},
> + {STR_STATIC_INIT("dialog"), EVENT_DIALOG},
> + /* The following must be the last element in the array */
> + {STR_NULL, EVENT_OTHER}
> +};
>
>
> static inline char* skip_token(char* _b, int _l)
> @@ -77,41 +78,58 @@ static inline char* skip_token(char* _b, int _l)
> }
>
>
> -static inline int event_parser(char* _s, int _l, event_t* _e)
> +int event_parser(char* s, int len, event_t* e)
> {
> + int i;
> str tmp;
> char* end;
> + param_hooks_t* phooks = NULL;
> + enum pclass pclass = CLASS_ANY;
>
> - tmp.s = _s;
> - tmp.len = _l;
> + if (e == NULL) {
> + ERR("event_parser: Invalid parameter value\n");
> + return -1;
> + }
>
> + tmp.s = s;
> + tmp.len = len;
> trim_leading(&tmp);
>
> if (tmp.len == 0) {
> - LOG(L_ERR, "event_parser(): Empty body\n");
> + LOG(L_ERR, "event_parser: Empty body\n");
> return -1;
> }
>
> - _e->text.s = tmp.s;
> -
> + e->name.s = tmp.s;
> end = skip_token(tmp.s, tmp.len);
> + e->name.len = end - tmp.s;
> +
> + e->type = EVENT_OTHER;
> + for(i = 0; events[i].name.len; i++) {
> + if (e->name.len == events[i].name.len &&
> + !strncasecmp(e->name.s, events[i].name.s, e->name.len)) {
> + e->type = events[i].type;
> + break;
> + }
> + }
> +
> + tmp.len -= end - tmp.s;
> + tmp.s = end;
> + trim_leading(&tmp);
> +
> + if (tmp.s[0] == ';') {
> + /* We have parameters to parse */
> + if (e->type == EVENT_DIALOG) {
> + pclass = CLASS_EVENT_DIALOG;
> + phooks = (param_hooks_t*)&e->params.dialog;
> + }
>
> - _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 if ((_e->text.len == PRES_XCAP_CHANGE_STR_LEN) &&
> - !strncasecmp(PRES_XCAP_CHANGE_STR, tmp.s, _e->text.len)) {
> - _e->parsed = EVENT_XCAP_CHANGE;
> - } else if ((_e->text.len == PRES_WINFO_STR_LEN) &&
> - !strncasecmp(PRES_WINFO_STR, tmp.s, _e->text.len)) {
> - _e->parsed = EVENT_PRESENCE_WINFO;
> - } else if ((_e->text.len == PRES_SIP_PROFILE_STR_LEN) &&
> - !strncasecmp(PRES_SIP_PROFILE_STR, tmp.s, _e->text.len)) {
> - _e->parsed = EVENT_SIP_PROFILE;
> + if (parse_params(&tmp, pclass, phooks, &e->params.list) < 0) {
> + ERR("event_parser: Error while parsing parameters parameters\n");
> + return -1;
> + }
> } else {
> - _e->parsed = EVENT_OTHER;
> + e->params.list = NULL;
> }
>
> return 0;
> @@ -153,19 +171,24 @@ int parse_event(struct hdr_field* _h)
> */
> void free_event(event_t** _e)
> {
> - if (*_e) pkg_free(*_e);
> - *_e = 0;
> + if (*_e) {
> + if ((*_e)->params.list) free_params((*_e)->params.list);
> + pkg_free(*_e);
> + *_e = NULL;
> + }
> }
>
>
> /*
> * Print structure, for debugging only
> */
> -void print_event(event_t* _e)
> +void print_event(event_t* e)
> {
> printf("===Event===\n");
> - printf("text : \'%.*s\'\n", _e->text.len, ZSW(_e->text.s));
> - printf("parsed: %s\n",
> - (_e->parsed == EVENT_PRESENCE) ? ("EVENT_PRESENCE") : ("EVENT_OTHER"));
> + printf("name : \'%.*s\'\n", STR_FMT(&e->name));
> + printf("type: %d\n", e->type);
> + if (e->params.list) {
> + print_params(stdout, e->params.list);
> + }
> printf("===/Event===\n");
> }
> diff --git a/parser/parse_event.h b/parser/parse_event.h
> index 03feb5e..4e90a52 100644
> --- a/parser/parse_event.h
> +++ b/parser/parse_event.h
> @@ -1,12 +1,6 @@
> /*
> * $Id$
> *
> - * Event header field body parser
> - * This parser was written for Presence Agent module only.
> - * it recognizes 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.
> @@ -37,35 +31,51 @@
>
> #include "../str.h"
> #include "hf.h"
> +#include "parse_param.h"
> +
> +/* Recognized event types */
> +enum event_type {
> + EVENT_OTHER = 0,
> + EVENT_PRESENCE,
> + EVENT_PRESENCE_WINFO,
> + EVENT_SIP_PROFILE,
> + EVENT_XCAP_CHANGE,
> + EVENT_DIALOG,
> + EVENT_MESSAGE_SUMMARY
> +};
> +
> +
> +struct event_params {
> + struct event_dialog_hooks dialog; /* Well known dialog package params */
> + param_t* list; /* Linked list of all parsed parameters */
> +};
>
> -#define EVENT_OTHER 0
> -#define EVENT_PRESENCE 1
> -#define EVENT_PRESENCE_WINFO 2
> -#define EVENT_SIP_PROFILE 3
> -#define EVENT_XCAP_CHANGE 4
>
> typedef struct event {
> - str text; /* Original string representation */
> - int parsed; /* Parsed variant */
> + enum event_type type; /* Parsed variant */
> + str name; /* Original string representation */
> + struct event_params params;
> } event_t;
>
>
> /*
> * Parse Event HF body
> */
> -int parse_event(struct hdr_field* _h);
> +int parse_event(struct hdr_field* hf);
>
>
> /*
> * Release memory
> */
> -void free_event(event_t** _e);
> +void free_event(event_t** e);
>
>
> /*
> * Print structure, for debugging only
> */
> -void print_event(event_t* _e);
> +void print_event(event_t* e);
> +
> +int event_parser(char* s, int l, event_t* e);
>
>
> #endif /* PARSE_EVENT_H */
>
>
> _______________________________________________
> sr-dev mailing list
> sr-dev at lists.sip-router.org
> http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev
More information about the sr-dev
mailing list