diff options
-rw-r--r-- | include/baresip.h | 8 | ||||
-rw-r--r-- | modules/mqtt/publish.c | 80 | ||||
-rw-r--r-- | src/event.c | 129 |
3 files changed, 138 insertions, 79 deletions
diff --git a/include/baresip.h b/include/baresip.h index a04d88f..f2aacad 100644 --- a/include/baresip.h +++ b/include/baresip.h @@ -1172,6 +1172,14 @@ double mos_calculate(double *r_factor, double rtt, /* + * Generic event + */ + +int event_encode_dict(struct odict *od, struct ua *ua, enum ua_event ev, + struct call *call, const char *prm); + + +/* * Baresip instance */ diff --git a/modules/mqtt/publish.c b/modules/mqtt/publish.c index dd250c2..524b0a2 100644 --- a/modules/mqtt/publish.c +++ b/modules/mqtt/publish.c @@ -16,50 +16,6 @@ */ -static int add_rtcp_stats(struct odict *od_parent, const struct rtcp_stats *rs) -{ - struct odict *od = NULL, *tx = NULL, *rx = NULL; - int err = 0; - - if (!od_parent || !rs) - return EINVAL; - - err = odict_alloc(&od, 8); - err |= odict_alloc(&tx, 8); - err |= odict_alloc(&rx, 8); - if (err) - goto out; - - err = odict_entry_add(tx, "sent", ODICT_INT, (int64_t)rs->tx.sent); - err |= odict_entry_add(tx, "lost", ODICT_INT, (int64_t)rs->tx.lost); - err |= odict_entry_add(tx, "jit", ODICT_INT, (int64_t)rs->tx.jit); - if (err) - goto out; - - err = odict_entry_add(rx, "sent", ODICT_INT, (int64_t)rs->rx.sent); - err |= odict_entry_add(rx, "lost", ODICT_INT, (int64_t)rs->rx.lost); - err |= odict_entry_add(rx, "jit", ODICT_INT, (int64_t)rs->rx.jit); - if (err) - goto out; - - err = odict_entry_add(od, "tx", ODICT_OBJECT, tx); - err |= odict_entry_add(od, "rx", ODICT_OBJECT, rx); - err |= odict_entry_add(od, "rtt", ODICT_INT, (int64_t)rs->rtt); - if (err) - goto out; - - /* add object to the parent */ - err = odict_entry_add(od_parent, "rtcp_stats", ODICT_OBJECT, od); - if (err) - goto out; - - out: - mem_deref(od); - - return err; -} - - /* * Relay UA events as publish messages to the Broker * @@ -69,7 +25,6 @@ static void ua_event_handler(struct ua *ua, enum ua_event ev, struct call *call, const char *prm, void *arg) { struct mqtt *mqtt = arg; - const char *event_str = uag_event_str(ev); struct odict *od = NULL; int err; @@ -77,43 +32,10 @@ static void ua_event_handler(struct ua *ua, enum ua_event ev, if (err) return; - err |= odict_entry_add(od, "type", ODICT_STRING, event_str); - err |= odict_entry_add(od, "accountaor", ODICT_STRING, ua_aor(ua)); + err = event_encode_dict(od, ua, ev, call, prm); if (err) goto out; - if (call) { - - const char *dir; - - dir = call_is_outgoing(call) ? "outgoing" : "incoming"; - - err |= odict_entry_add(od, "direction", ODICT_STRING, dir); - err |= odict_entry_add(od, "peeruri", - ODICT_STRING, call_peeruri(call)); - if (err) - goto out; - } - - if (str_isset(prm)) { - err = odict_entry_add(od, "param", ODICT_STRING, prm); - if (err) - goto out; - } - - if (ev == UA_EVENT_CALL_RTCP) { - struct stream *strm = NULL; - - if (0 == str_casecmp(prm, "audio")) - strm = audio_strm(call_audio(call)); - else if (0 == str_casecmp(prm, "video")) - strm = video_strm(call_video(call)); - - err = add_rtcp_stats(od, stream_rtcp_stats(strm)); - if (err) - goto out; - } - err = mqtt_publish_message(mqtt, "/baresip/event", "%H", json_encode_odict, od); if (err) { diff --git a/src/event.c b/src/event.c index 77b5676..6cf24cc 100644 --- a/src/event.c +++ b/src/event.c @@ -9,6 +9,135 @@ #include "core.h" +static const char *event_class_name(enum ua_event ev) +{ + switch (ev) { + + case UA_EVENT_REGISTERING: + case UA_EVENT_REGISTER_OK: + case UA_EVENT_REGISTER_FAIL: + case UA_EVENT_UNREGISTERING: + return "register"; + + case UA_EVENT_SHUTDOWN: + case UA_EVENT_EXIT: + return "application"; + + case UA_EVENT_CALL_INCOMING: + case UA_EVENT_CALL_RINGING: + case UA_EVENT_CALL_PROGRESS: + case UA_EVENT_CALL_ESTABLISHED: + case UA_EVENT_CALL_CLOSED: + case UA_EVENT_CALL_TRANSFER_FAILED: + case UA_EVENT_CALL_DTMF_START: + case UA_EVENT_CALL_DTMF_END: + case UA_EVENT_CALL_RTCP: + return "call"; + + default: + return "other"; + } +} + + +static int add_rtcp_stats(struct odict *od_parent, const struct rtcp_stats *rs) +{ + struct odict *od = NULL, *tx = NULL, *rx = NULL; + int err = 0; + + if (!od_parent || !rs) + return EINVAL; + + err = odict_alloc(&od, 8); + err |= odict_alloc(&tx, 8); + err |= odict_alloc(&rx, 8); + if (err) + goto out; + + err = odict_entry_add(tx, "sent", ODICT_INT, (int64_t)rs->tx.sent); + err |= odict_entry_add(tx, "lost", ODICT_INT, (int64_t)rs->tx.lost); + err |= odict_entry_add(tx, "jit", ODICT_INT, (int64_t)rs->tx.jit); + if (err) + goto out; + + err = odict_entry_add(rx, "sent", ODICT_INT, (int64_t)rs->rx.sent); + err |= odict_entry_add(rx, "lost", ODICT_INT, (int64_t)rs->rx.lost); + err |= odict_entry_add(rx, "jit", ODICT_INT, (int64_t)rs->rx.jit); + if (err) + goto out; + + err = odict_entry_add(od, "tx", ODICT_OBJECT, tx); + err |= odict_entry_add(od, "rx", ODICT_OBJECT, rx); + err |= odict_entry_add(od, "rtt", ODICT_INT, (int64_t)rs->rtt); + if (err) + goto out; + + /* add object to the parent */ + err = odict_entry_add(od_parent, "rtcp_stats", ODICT_OBJECT, od); + if (err) + goto out; + + out: + mem_deref(od); + + return err; +} + + +int event_encode_dict(struct odict *od, struct ua *ua, enum ua_event ev, + struct call *call, const char *prm) +{ + const char *event_str = uag_event_str(ev); + int err = 0; + + if (!od) + return EINVAL; + + err |= odict_entry_add(od, "type", ODICT_STRING, event_str); + err |= odict_entry_add(od, "class", + ODICT_STRING, event_class_name(ev)); + err |= odict_entry_add(od, "accountaor", ODICT_STRING, ua_aor(ua)); + if (err) + goto out; + + if (call) { + + const char *dir; + + dir = call_is_outgoing(call) ? "outgoing" : "incoming"; + + err |= odict_entry_add(od, "direction", ODICT_STRING, dir); + err |= odict_entry_add(od, "peeruri", + ODICT_STRING, call_peeruri(call)); + if (err) + goto out; + } + + if (str_isset(prm)) { + err = odict_entry_add(od, "param", ODICT_STRING, prm); + if (err) + goto out; + } + + if (ev == UA_EVENT_CALL_RTCP) { + struct stream *strm = NULL; + + if (0 == str_casecmp(prm, "audio")) + strm = audio_strm(call_audio(call)); + else if (0 == str_casecmp(prm, "video")) + strm = video_strm(call_video(call)); + + err = add_rtcp_stats(od, stream_rtcp_stats(strm)); + if (err) + goto out; + } + + out: + + return err; +} + + /** * Get the name of the User-Agent event * |