blob: 472c828130fccac48d5a73fea25ca3ba427dd171 [file] [log] [blame]
James Kuszmaul82f6c042021-01-17 11:30:16 -08001/**
2 * @file sipevent/msg.c SIP event messages
3 *
4 * Copyright (C) 2010 Creytiv.com
5 */
6#include <re_types.h>
7#include <re_fmt.h>
8#include <re_mbuf.h>
9#include <re_uri.h>
10#include <re_list.h>
11#include <re_sa.h>
12#include <re_msg.h>
13#include <re_sip.h>
14#include <re_sipevent.h>
15
16
17int sipevent_event_decode(struct sipevent_event *se, const struct pl *pl)
18{
19 struct pl param;
20 int err;
21
22 if (!se || !pl)
23 return EINVAL;
24
25 err = re_regex(pl->p, pl->l, "[^; \t\r\n]+[ \t\r\n]*[^]*",
26 &se->event, NULL, &se->params);
27 if (err)
28 return EBADMSG;
29
30 if (!msg_param_decode(&se->params, "id", &param))
31 se->id = param;
32 else
33 se->id = pl_null;
34
35 return 0;
36}
37
38
39int sipevent_substate_decode(struct sipevent_substate *ss, const struct pl *pl)
40{
41 struct pl state, param;
42 int err;
43
44 if (!ss || !pl)
45 return EINVAL;
46
47 err = re_regex(pl->p, pl->l, "[a-z]+[ \t\r\n]*[^]*",
48 &state, NULL, &ss->params);
49 if (err)
50 return EBADMSG;
51
52 if (!pl_strcasecmp(&state, "active"))
53 ss->state = SIPEVENT_ACTIVE;
54 else if (!pl_strcasecmp(&state, "pending"))
55 ss->state = SIPEVENT_PENDING;
56 else if (!pl_strcasecmp(&state, "terminated"))
57 ss->state = SIPEVENT_TERMINATED;
58 else
59 ss->state = -1;
60
61 if (!msg_param_decode(&ss->params, "reason", &param)) {
62
63 if (!pl_strcasecmp(&param, "deactivated"))
64 ss->reason = SIPEVENT_DEACTIVATED;
65 else if (!pl_strcasecmp(&param, "probation"))
66 ss->reason = SIPEVENT_PROBATION;
67 else if (!pl_strcasecmp(&param, "rejected"))
68 ss->reason = SIPEVENT_REJECTED;
69 else if (!pl_strcasecmp(&param, "timeout"))
70 ss->reason = SIPEVENT_TIMEOUT;
71 else if (!pl_strcasecmp(&param, "giveup"))
72 ss->reason = SIPEVENT_GIVEUP;
73 else if (!pl_strcasecmp(&param, "noresource"))
74 ss->reason = SIPEVENT_NORESOURCE;
75 else
76 ss->reason = -1;
77 }
78 else {
79 ss->reason = -1;
80 }
81
82 if (!msg_param_decode(&ss->params, "expires", &param))
83 ss->expires = param;
84 else
85 ss->expires = pl_null;
86
87 if (!msg_param_decode(&ss->params, "retry-after", &param))
88 ss->retry_after = param;
89 else
90 ss->retry_after = pl_null;
91
92 return 0;
93}
94
95
96const char *sipevent_substate_name(enum sipevent_subst state)
97{
98 switch (state) {
99
100 case SIPEVENT_ACTIVE: return "active";
101 case SIPEVENT_PENDING: return "pending";
102 case SIPEVENT_TERMINATED: return "terminated";
103 default: return "unknown";
104 }
105}
106
107
108const char *sipevent_reason_name(enum sipevent_reason reason)
109{
110 switch (reason) {
111
112 case SIPEVENT_DEACTIVATED: return "deactivated";
113 case SIPEVENT_PROBATION: return "probation";
114 case SIPEVENT_REJECTED: return "rejected";
115 case SIPEVENT_TIMEOUT: return "timeout";
116 case SIPEVENT_GIVEUP: return "giveup";
117 case SIPEVENT_NORESOURCE: return "noresource";
118 default: return "unknown";
119 }
120}