diff options
author | Jonathan Rose <jrose@digium.com> | 2013-12-17 23:25:49 +0000 |
---|---|---|
committer | Jonathan Rose <jrose@digium.com> | 2013-12-17 23:25:49 +0000 |
commit | b0bb03e916da4b4a37aa65b694e3aa1cecee8648 (patch) | |
tree | 697d4ba1137ca3b28fc79d1c976b2e342274c1fe /main | |
parent | 91d0f305061a6111d9996750c04d54daa67b67bb (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.c | 39 | ||||
-rw-r--r-- | main/bridge_basic.c | 2 | ||||
-rw-r--r-- | main/manager_bridges.c | 4 | ||||
-rw-r--r-- | main/stasis_bridges.c | 6 |
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; |