ARI: Add events for Contact and Peer Status changes

This patch adds support for receiving events regarding Peer status changes
and Contact status changes. This is particularly useful in scenarios where
we are subscribed to all endpoints and channels, where we often want to know
more about the state of channel technology specific items than a single
endpoint's state.

ASTERISK-24870

Change-Id: I6137459cdc25ce27efc134ad58abf065653da4e9
This commit is contained in:
Matt Jordan
2015-09-03 21:19:21 -05:00
parent 3502c0431d
commit b50e372394
6 changed files with 626 additions and 12 deletions

View File

@@ -124,12 +124,7 @@ struct stasis_topic *ast_endpoint_topic_all_cached(void)
return stasis_cp_all_topic_cached(endpoint_cache_all);
}
static struct ast_manager_event_blob *peerstatus_to_ami(struct stasis_message *msg);
STASIS_MESSAGE_TYPE_DEFN(ast_endpoint_snapshot_type);
STASIS_MESSAGE_TYPE_DEFN(ast_endpoint_state_type,
.to_ami = peerstatus_to_ami,
);
static struct ast_manager_event_blob *peerstatus_to_ami(struct stasis_message *msg)
{
@@ -166,10 +161,44 @@ static struct ast_manager_event_blob *peerstatus_to_ami(struct stasis_message *m
ast_str_buffer(peerstatus_event_string));
}
static struct ast_manager_event_blob *contactstatus_to_ami(struct stasis_message *msg);
static struct ast_json *peerstatus_to_json(struct stasis_message *msg, const struct stasis_message_sanitizer *sanitize)
{
struct ast_endpoint_blob *obj = stasis_message_data(msg);
struct ast_json *json_endpoint;
struct ast_json *json_peer;
struct ast_json *json_final;
const struct timeval *tv = stasis_message_timestamp(msg);
STASIS_MESSAGE_TYPE_DEFN(ast_endpoint_contact_state_type,
.to_ami = contactstatus_to_ami,
json_endpoint = ast_endpoint_snapshot_to_json(obj->snapshot, NULL);
if (!json_endpoint) {
return NULL;
}
json_peer = ast_json_object_create();
if (!json_peer) {
ast_json_unref(json_endpoint);
return NULL;
}
/* Copy all fields from the blob */
ast_json_object_update(json_peer, obj->blob);
json_final = ast_json_pack("{s: s, s: o, s: o, s: o }",
"type", "PeerStatusChange",
"timestamp", ast_json_timeval(*tv, NULL),
"endpoint", json_endpoint,
"peer", json_peer);
if (!json_final) {
ast_json_unref(json_endpoint);
ast_json_unref(json_peer);
}
return json_final;
}
STASIS_MESSAGE_TYPE_DEFN(ast_endpoint_state_type,
.to_ami = peerstatus_to_ami,
.to_json = peerstatus_to_json,
);
static struct ast_manager_event_blob *contactstatus_to_ami(struct stasis_message *msg)
@@ -206,6 +235,39 @@ static struct ast_manager_event_blob *contactstatus_to_ami(struct stasis_message
"%s", ast_str_buffer(contactstatus_event_string));
}
static struct ast_json *contactstatus_to_json(struct stasis_message *msg, const struct stasis_message_sanitizer *sanitize)
{
struct ast_endpoint_blob *obj = stasis_message_data(msg);
struct ast_json *json_endpoint;
struct ast_json *json_final;
const struct timeval *tv = stasis_message_timestamp(msg);
json_endpoint = ast_endpoint_snapshot_to_json(obj->snapshot, NULL);
if (!json_endpoint) {
return NULL;
}
json_final = ast_json_pack("{s: s, s: o, s: o, s: { s: s, s: s, s: s } } ",
"type", "ContactStatusChange",
"timestamp", ast_json_timeval(*tv, NULL),
"endpoint", json_endpoint,
"contact_info",
"uri", ast_json_string_get(ast_json_object_get(obj->blob, "uri")),
"contact_status", ast_json_string_get(ast_json_object_get(obj->blob, "contact_status")),
"aor", ast_json_string_get(ast_json_object_get(obj->blob, "aor")),
"roundtrip_usec", ast_json_string_get(ast_json_object_get(obj->blob, "roundtrip_usec")));
if (!json_final) {
ast_json_unref(json_endpoint);
}
return json_final;
}
STASIS_MESSAGE_TYPE_DEFN(ast_endpoint_contact_state_type,
.to_ami = contactstatus_to_ami,
.to_json = contactstatus_to_json
);
static void endpoint_blob_dtor(void *obj)
{
struct ast_endpoint_blob *event = obj;