static struct ast_json *dial_to_json( struct stasis_message *message, const struct stasis_message_sanitizer *sanitize) { struct ast_multi_channel_blob *payload = stasis_message_data(message); struct ast_json *blob = ast_multi_channel_blob_get_json(payload); struct ast_json *caller_json = ast_channel_snapshot_to_json(ast_multi_channel_blob_get_channel(payload, "caller"), sanitize); struct ast_json *peer_json = ast_channel_snapshot_to_json(ast_multi_channel_blob_get_channel(payload, "peer"), sanitize); struct ast_json *forwarded_json = ast_channel_snapshot_to_json(ast_multi_channel_blob_get_channel(payload, "forwarded"), sanitize); struct ast_json *json; const struct timeval *tv = stasis_message_timestamp(message); int res = 0; json = ast_json_pack("{s: s, s: o, s: O, s: O, s: O}", "type", "Dial", "timestamp", ast_json_timeval(*tv, NULL), "dialstatus", ast_json_object_get(blob, "dialstatus"), "forward", ast_json_object_get(blob, "forward"), "dialstring", ast_json_object_get(blob, "dialstring")); if (!json) { ast_json_unref(caller_json); ast_json_unref(peer_json); ast_json_unref(forwarded_json); return NULL; } if (caller_json) { res |= ast_json_object_set(json, "caller", caller_json); } if (peer_json) { res |= ast_json_object_set(json, "peer", peer_json); } if (forwarded_json) { res |= ast_json_object_set(json, "forwarded", forwarded_json); } if (res) { ast_json_unref(json); return NULL; } return json; }
static struct ast_manager_event_blob *local_message_to_ami(struct stasis_message *message) { struct ast_multi_channel_blob *obj = stasis_message_data(message); struct ast_json *blob = ast_multi_channel_blob_get_json(obj); struct ast_channel_snapshot *local_snapshot_one; struct ast_channel_snapshot *local_snapshot_two; RAII_VAR(struct ast_str *, local_channel_one, NULL, ast_free); RAII_VAR(struct ast_str *, local_channel_two, NULL, ast_free); RAII_VAR(struct ast_str *, event_buffer, NULL, ast_free); const char *event; local_snapshot_one = ast_multi_channel_blob_get_channel(obj, "1"); local_snapshot_two = ast_multi_channel_blob_get_channel(obj, "2"); if (!local_snapshot_one || !local_snapshot_two) { return NULL; } event_buffer = ast_str_create(1024); local_channel_one = ast_manager_build_channel_state_string_prefix(local_snapshot_one, "LocalOne"); local_channel_two = ast_manager_build_channel_state_string_prefix(local_snapshot_two, "LocalTwo"); if (!event_buffer || !local_channel_one || !local_channel_two) { return NULL; } if (stasis_message_type(message) == ast_local_optimization_begin_type()) { struct ast_channel_snapshot *source_snapshot; RAII_VAR(struct ast_str *, source_str, NULL, ast_free); const char *dest_uniqueid; source_snapshot = ast_multi_channel_blob_get_channel(obj, "source"); if (source_snapshot) { source_str = ast_manager_build_channel_state_string_prefix(source_snapshot, "Source"); if (!source_str) { return NULL; } } dest_uniqueid = ast_json_object_get(blob, "dest") == AST_UNREAL_OWNER ? local_snapshot_one->uniqueid : local_snapshot_two->uniqueid; event = "LocalOptimizationBegin"; if (source_str) { ast_str_append(&event_buffer, 0, "%s", ast_str_buffer(source_str)); } ast_str_append(&event_buffer, 0, "DestUniqueId: %s\r\n", dest_uniqueid); ast_str_append(&event_buffer, 0, "Id: %u\r\n", (unsigned int) ast_json_integer_get(ast_json_object_get(blob, "id"))); } else if (stasis_message_type(message) == ast_local_optimization_end_type()) { event = "LocalOptimizationEnd"; ast_str_append(&event_buffer, 0, "Success: %s\r\n", ast_json_integer_get(ast_json_object_get(blob, "success")) ? "Yes" : "No"); ast_str_append(&event_buffer, 0, "Id: %u\r\n", (unsigned int) ast_json_integer_get(ast_json_object_get(blob, "id"))); } else if (stasis_message_type(message) == ast_local_bridge_type()) { event = "LocalBridge"; ast_str_append(&event_buffer, 0, "Context: %s\r\n", ast_json_string_get(ast_json_object_get(blob, "context"))); ast_str_append(&event_buffer, 0, "Exten: %s\r\n", ast_json_string_get(ast_json_object_get(blob, "exten"))); ast_str_append(&event_buffer, 0, "LocalOptimization: %s\r\n", ast_json_is_true(ast_json_object_get(blob, "can_optimize")) ? "Yes" : "No"); } else { return NULL; } return ast_manager_event_blob_create(EVENT_FLAG_CALL, event, "%s" "%s" "%s", ast_str_buffer(local_channel_one), ast_str_buffer(local_channel_two), ast_str_buffer(event_buffer)); }