AST_BRIDGE_FLAG_TRANSFER_PROHIBITED = (1 << 8),
/*! Bridge transfers require transfer of entire bridge rather than individual channels */
AST_BRIDGE_FLAG_TRANSFER_BRIDGE_ONLY = (1 << 9),
+ /*! Bridge is invisible to AMI/CLI/ARI/etc. */
+ AST_BRIDGE_FLAG_INVISIBLE = (1 << 10),
};
/*! \brief Flags used for per bridge channel features */
ast_set_flag(&self->feature_flags, flags);
self->allowed_capabilities = capabilities;
- if (bridge_topics_init(self) != 0) {
- ast_log(LOG_WARNING, "Bridge %s: Could not initialize topics\n",
- self->uniqueid);
- ao2_ref(self, -1);
- return NULL;
+ if (!(flags & AST_BRIDGE_FLAG_INVISIBLE)) {
+ if (bridge_topics_init(self) != 0) {
+ ast_log(LOG_WARNING, "Bridge %s: Could not initialize topics\n",
+ self->uniqueid);
+ ao2_ref(self, -1);
+ return NULL;
+ }
}
/* Use our helper function to find the "best" bridge technology. */
return NULL;
}
- if (!ast_bridge_topic(self)) {
- ao2_ref(self, -1);
- return NULL;
+ if (!(flags & AST_BRIDGE_FLAG_INVISIBLE)) {
+ if (!ast_bridge_topic(self)) {
+ ao2_ref(self, -1);
+ return NULL;
+ }
}
return self;
bridge = ast_channel_get_bridge(chan);
ast_channel_unlock(chan);
- if (bridge
- && ast_test_flag(&bridge->feature_flags, AST_BRIDGE_FLAG_MASQUERADE_ONLY)) {
+ if (bridge && ast_test_flag(&bridge->feature_flags,
+ (AST_BRIDGE_FLAG_MASQUERADE_ONLY | AST_BRIDGE_FLAG_INVISIBLE))) {
ao2_ref(bridge, -1);
bridge = NULL;
}
}
} else {
bridge = ast_bridge_find_by_id(bridge_uniqueid);
- if (!bridge) {
+ if (!bridge || ast_test_flag(&bridge->feature_flags, AST_BRIDGE_FLAG_INVISIBLE)) {
astman_send_error(s, m, "Bridge not found");
return 0;
}
RAII_VAR(struct ast_bridge_snapshot *, snapshot, NULL, ao2_cleanup);
struct ast_bridge_channel *bridge_channel;
+ if (ast_test_flag(&bridge->feature_flags, AST_BRIDGE_FLAG_INVISIBLE)) {
+ return NULL;
+ }
+
snapshot = ao2_alloc_options(sizeof(*snapshot), bridge_snapshot_dtor,
AO2_ALLOC_OPT_LOCK_NOLOCK);
if (!snapshot || ast_string_field_init(snapshot, 128)) {
ast_assert(to != NULL);
ast_assert(from != NULL);
+ ast_assert(ast_test_flag(&to->feature_flags, AST_BRIDGE_FLAG_INVISIBLE) == 0);
+ ast_assert(ast_test_flag(&from->feature_flags, AST_BRIDGE_FLAG_INVISIBLE) == 0);
merge_msg = bridge_merge_message_create(to, from);
if (!merge_msg) {
RAII_VAR(struct stasis_message *, msg, NULL, ao2_cleanup);
RAII_VAR(struct ast_json *, blob, NULL, ast_json_unref);
+ if (ast_test_flag(&bridge->feature_flags, AST_BRIDGE_FLAG_INVISIBLE)) {
+ return;
+ }
+
if (swap) {
blob = ast_json_pack("{s: s}", "swap", ast_channel_uniqueid(swap));
if (!blob) {
{
RAII_VAR(struct stasis_message *, msg, NULL, ao2_cleanup);
+ if (ast_test_flag(&bridge->feature_flags, AST_BRIDGE_FLAG_INVISIBLE)) {
+ return;
+ }
msg = ast_bridge_blob_create(ast_channel_left_bridge_type(), bridge, chan, NULL);
if (!msg) {
return;
ast_string_field_set(snapshot, language, ast_channel_language(chan));
if ((bridge = ast_channel_get_bridge(chan))) {
- ast_string_field_set(snapshot, bridgeid, bridge->uniqueid);
+ if (!ast_test_flag(&bridge->feature_flags, AST_BRIDGE_FLAG_INVISIBLE)) {
+ ast_string_field_set(snapshot, bridgeid, bridge->uniqueid);
+ }
ao2_cleanup(bridge);
}