
- new module 'msg' for generic message handling (SIP, HTTP) - decode content-type field in HTTP and SIP
120 lines
2.7 KiB
C
120 lines
2.7 KiB
C
/**
|
|
* @file sipevent/msg.c SIP event messages
|
|
*
|
|
* Copyright (C) 2010 Creytiv.com
|
|
*/
|
|
#include <re_types.h>
|
|
#include <re_fmt.h>
|
|
#include <re_mbuf.h>
|
|
#include <re_uri.h>
|
|
#include <re_list.h>
|
|
#include <re_sa.h>
|
|
#include <re_msg.h>
|
|
#include <re_sip.h>
|
|
#include <re_sipevent.h>
|
|
|
|
|
|
int sipevent_event_decode(struct sipevent_event *se, const struct pl *pl)
|
|
{
|
|
struct pl param;
|
|
int err;
|
|
|
|
if (!se || !pl)
|
|
return EINVAL;
|
|
|
|
err = re_regex(pl->p, pl->l, "[^; \t\r\n]+[ \t\r\n]*[^]*",
|
|
&se->event, NULL, &se->params);
|
|
if (err)
|
|
return EBADMSG;
|
|
|
|
if (!msg_param_decode(&se->params, "id", ¶m))
|
|
se->id = param;
|
|
else
|
|
se->id = pl_null;
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
int sipevent_substate_decode(struct sipevent_substate *ss, const struct pl *pl)
|
|
{
|
|
struct pl state, param;
|
|
int err;
|
|
|
|
if (!ss || !pl)
|
|
return EINVAL;
|
|
|
|
err = re_regex(pl->p, pl->l, "[a-z]+[ \t\r\n]*[^]*",
|
|
&state, NULL, &ss->params);
|
|
if (err)
|
|
return EBADMSG;
|
|
|
|
if (!pl_strcasecmp(&state, "active"))
|
|
ss->state = SIPEVENT_ACTIVE;
|
|
else if (!pl_strcasecmp(&state, "pending"))
|
|
ss->state = SIPEVENT_PENDING;
|
|
else if (!pl_strcasecmp(&state, "terminated"))
|
|
ss->state = SIPEVENT_TERMINATED;
|
|
else
|
|
ss->state = -1;
|
|
|
|
if (!msg_param_decode(&ss->params, "reason", ¶m)) {
|
|
|
|
if (!pl_strcasecmp(¶m, "deactivated"))
|
|
ss->reason = SIPEVENT_DEACTIVATED;
|
|
else if (!pl_strcasecmp(¶m, "probation"))
|
|
ss->reason = SIPEVENT_PROBATION;
|
|
else if (!pl_strcasecmp(¶m, "rejected"))
|
|
ss->reason = SIPEVENT_REJECTED;
|
|
else if (!pl_strcasecmp(¶m, "timeout"))
|
|
ss->reason = SIPEVENT_TIMEOUT;
|
|
else if (!pl_strcasecmp(¶m, "giveup"))
|
|
ss->reason = SIPEVENT_GIVEUP;
|
|
else if (!pl_strcasecmp(¶m, "noresource"))
|
|
ss->reason = SIPEVENT_NORESOURCE;
|
|
else
|
|
ss->reason = -1;
|
|
}
|
|
else {
|
|
ss->reason = -1;
|
|
}
|
|
|
|
if (!msg_param_decode(&ss->params, "expires", ¶m))
|
|
ss->expires = param;
|
|
else
|
|
ss->expires = pl_null;
|
|
|
|
if (!msg_param_decode(&ss->params, "retry-after", ¶m))
|
|
ss->retry_after = param;
|
|
else
|
|
ss->retry_after = pl_null;
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
const char *sipevent_substate_name(enum sipevent_subst state)
|
|
{
|
|
switch (state) {
|
|
|
|
case SIPEVENT_ACTIVE: return "active";
|
|
case SIPEVENT_PENDING: return "pending";
|
|
case SIPEVENT_TERMINATED: return "terminated";
|
|
default: return "unknown";
|
|
}
|
|
}
|
|
|
|
|
|
const char *sipevent_reason_name(enum sipevent_reason reason)
|
|
{
|
|
switch (reason) {
|
|
|
|
case SIPEVENT_DEACTIVATED: return "deactivated";
|
|
case SIPEVENT_PROBATION: return "probation";
|
|
case SIPEVENT_REJECTED: return "rejected";
|
|
case SIPEVENT_TIMEOUT: return "timeout";
|
|
case SIPEVENT_GIVEUP: return "giveup";
|
|
case SIPEVENT_NORESOURCE: return "noresource";
|
|
default: return "unknown";
|
|
}
|
|
}
|