summaryrefslogtreecommitdiff
path: root/main
diff options
context:
space:
mode:
authorJonathan Rose <jrose@digium.com>2013-12-17 23:25:49 +0000
committerJonathan Rose <jrose@digium.com>2013-12-17 23:25:49 +0000
commitb0bb03e916da4b4a37aa65b694e3aa1cecee8648 (patch)
tree697d4ba1137ca3b28fc79d1c976b2e342274c1fe /main
parent91d0f305061a6111d9996750c04d54daa67b67bb (diff)
bridging: Give bridges a name and a known creator
Bridges have two new optional properties, a creator and a name. Certain consumers of bridges will automatically provide bridges that they create with these properties. Examples include app_bridgewait, res_parking, app_confbridge, and app_agent_pool. In addition, a name may now be provided as an argument to the POST function for creating new bridges via ARI. (closes issue AFS-47) Review: https://reviewboard.asterisk.org/r/3070/ ........ Merged revisions 404042 from http://svn.asterisk.org/svn/asterisk/branches/12 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@404043 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main')
-rw-r--r--main/bridge.c39
-rw-r--r--main/bridge_basic.c2
-rw-r--r--main/manager_bridges.c4
-rw-r--r--main/stasis_bridges.c6
4 files changed, 40 insertions, 11 deletions
diff --git a/main/bridge.c b/main/bridge.c
index e2c46ac74..8fd7847ec 100644
--- a/main/bridge.c
+++ b/main/bridge.c
@@ -533,9 +533,11 @@ static void bridge_tech_deferred_destroy(struct ast_bridge *bridge, struct ast_f
struct ast_bridge dummy_bridge = {
.technology = deferred->tech,
.tech_pvt = deferred->tech_pvt,
+ .creator = bridge->creator,
+ .name = bridge->name,
+ .uniqueid = bridge->uniqueid,
};
- ast_copy_string(dummy_bridge.uniqueid, bridge->uniqueid, sizeof(dummy_bridge.uniqueid));
ast_debug(1, "Bridge %s: calling %s technology destructor (deferred, dummy)\n",
dummy_bridge.uniqueid, dummy_bridge.technology->name);
dummy_bridge.technology->destroy(&dummy_bridge);
@@ -679,6 +681,8 @@ static void destroy_bridge(void *obj)
cleanup_video_mode(bridge);
stasis_cp_single_unsubscribe(bridge->topics);
+
+ ast_string_field_free_memory(bridge);
}
struct ast_bridge *bridge_register(struct ast_bridge *bridge)
@@ -714,19 +718,35 @@ struct ast_bridge *bridge_alloc(size_t size, const struct ast_bridge_methods *v_
}
bridge = ao2_alloc(size, destroy_bridge);
- if (bridge) {
- bridge->v_table = v_table;
+ if (!bridge) {
+ return NULL;
+ }
+
+ if (ast_string_field_init(bridge, 80)) {
+ ao2_cleanup(bridge);
+ return NULL;
}
+
+ bridge->v_table = v_table;
+
return bridge;
}
-struct ast_bridge *bridge_base_init(struct ast_bridge *self, uint32_t capabilities, unsigned int flags)
+struct ast_bridge *bridge_base_init(struct ast_bridge *self, uint32_t capabilities, unsigned int flags, const char *creator, const char *name)
{
+ char uuid_hold[AST_UUID_STR_LEN];
+
if (!self) {
return NULL;
}
- ast_uuid_generate_str(self->uniqueid, sizeof(self->uniqueid));
+ ast_uuid_generate_str(uuid_hold, AST_UUID_STR_LEN);
+ ast_string_field_set(self, uniqueid, uuid_hold);
+ ast_string_field_set(self, creator, creator);
+ if (!ast_strlen_zero(creator)) {
+ ast_string_field_set(self, name, name);
+ }
+
ast_set_flag(&self->feature_flags, flags);
self->allowed_capabilities = capabilities;
@@ -881,12 +901,12 @@ struct ast_bridge_methods ast_bridge_base_v_table = {
.get_merge_priority = bridge_base_get_merge_priority,
};
-struct ast_bridge *ast_bridge_base_new(uint32_t capabilities, unsigned int flags)
+struct ast_bridge *ast_bridge_base_new(uint32_t capabilities, unsigned int flags, const char *creator, const char *name)
{
void *bridge;
bridge = bridge_alloc(sizeof(struct ast_bridge), &ast_bridge_base_v_table);
- bridge = bridge_base_init(bridge, capabilities, flags);
+ bridge = bridge_base_init(bridge, capabilities, flags, creator, name);
bridge = bridge_register(bridge);
return bridge;
}
@@ -991,6 +1011,9 @@ static int smart_bridge_operation(struct ast_bridge *bridge)
struct ast_bridge dummy_bridge = {
.technology = bridge->technology,
.tech_pvt = bridge->tech_pvt,
+ .creator = bridge->creator,
+ .name = bridge->name,
+ .uniqueid = bridge->uniqueid,
};
if (bridge->dissolved) {
@@ -1043,8 +1066,6 @@ static int smart_bridge_operation(struct ast_bridge *bridge)
return 0;
}
- ast_copy_string(dummy_bridge.uniqueid, bridge->uniqueid, sizeof(dummy_bridge.uniqueid));
-
if (old_technology->destroy) {
struct tech_deferred_destroy deferred_tech_destroy = {
.tech = dummy_bridge.technology,
diff --git a/main/bridge_basic.c b/main/bridge_basic.c
index eaec68995..317c574a6 100644
--- a/main/bridge_basic.c
+++ b/main/bridge_basic.c
@@ -3239,7 +3239,7 @@ struct ast_bridge *ast_bridge_basic_new(void)
bridge = bridge_alloc(sizeof(struct ast_bridge), &ast_bridge_basic_v_table);
bridge = bridge_base_init(bridge,
AST_BRIDGE_CAPABILITY_NATIVE | AST_BRIDGE_CAPABILITY_1TO1MIX
- | AST_BRIDGE_CAPABILITY_MULTIMIX, NORMAL_FLAGS);
+ | AST_BRIDGE_CAPABILITY_MULTIMIX, NORMAL_FLAGS, NULL, NULL);
bridge = bridge_basic_personality_alloc(bridge);
bridge = bridge_register(bridge);
return bridge;
diff --git a/main/manager_bridges.c b/main/manager_bridges.c
index e012ebb6d..90281283d 100644
--- a/main/manager_bridges.c
+++ b/main/manager_bridges.c
@@ -156,10 +156,14 @@ struct ast_str *ast_manager_build_bridge_state_string_prefix(
"%sBridgeUniqueid: %s\r\n"
"%sBridgeType: %s\r\n"
"%sBridgeTechnology: %s\r\n"
+ "%sBridgeCreator: %s\r\n"
+ "%sBridgeName: %s\r\n"
"%sBridgeNumChannels: %d\r\n",
prefix, snapshot->uniqueid,
prefix, snapshot->subclass,
prefix, snapshot->technology,
+ prefix, ast_strlen_zero(snapshot->creator) ? "<unknown>": snapshot->creator,
+ prefix, ast_strlen_zero(snapshot->name) ? "<unknown>": snapshot->name,
prefix, snapshot->num_channels);
if (!res) {
ast_free(out);
diff --git a/main/stasis_bridges.c b/main/stasis_bridges.c
index b92d048bc..7f6679b00 100644
--- a/main/stasis_bridges.c
+++ b/main/stasis_bridges.c
@@ -242,6 +242,8 @@ struct ast_bridge_snapshot *ast_bridge_snapshot_create(struct ast_bridge *bridge
ast_string_field_set(snapshot, uniqueid, bridge->uniqueid);
ast_string_field_set(snapshot, technology, bridge->technology->name);
ast_string_field_set(snapshot, subclass, bridge->v_table->name);
+ ast_string_field_set(snapshot, creator, bridge->creator);
+ ast_string_field_set(snapshot, name, bridge->name);
snapshot->feature_flags = bridge->feature_flags;
snapshot->capabilities = bridge->technology->capabilities;
@@ -548,11 +550,13 @@ struct ast_json *ast_bridge_snapshot_to_json(
return NULL;
}
- json_bridge = ast_json_pack("{s: s, s: s, s: s, s: s, s: o}",
+ json_bridge = ast_json_pack("{s: s, s: s, s: s, s: s, s: s, s: s, s: o}",
"id", snapshot->uniqueid,
"technology", snapshot->technology,
"bridge_type", capability2str(snapshot->capabilities),
"bridge_class", snapshot->subclass,
+ "creator", snapshot->creator,
+ "name", snapshot->name,
"channels", json_channels);
if (!json_bridge) {
return NULL;