Squashed 'third_party/rawrtc/re/' content from commit f3163ce8b
Change-Id: I6a235e6ac0f03269d951026f9d195da05c40fdab
git-subtree-dir: third_party/rawrtc/re
git-subtree-split: f3163ce8b526a13b35ef71ce4dd6f43585064d8a
diff --git a/src/sipevent/msg.c b/src/sipevent/msg.c
new file mode 100644
index 0000000..472c828
--- /dev/null
+++ b/src/sipevent/msg.c
@@ -0,0 +1,120 @@
+/**
+ * @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";
+ }
+}