* BridgeEnter now contains the unique ID of the channel that is to be swapped out, if applicable.
* There is a ParkedCallSwap event that is sent when a parked channel has a new channel take its place.
(closes issue ASTERISK-22193)
reported by Mark Michelson
Review: https://reviewboard.asterisk.org/r/2712
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@396107
65c4cc65-6c06-0410-ace0-
fbb531ad65f3
PARKED_CALL_GIVEUP,
PARKED_CALL_UNPARKED,
PARKED_CALL_FAILED,
+ PARKED_CALL_SWAP,
};
/*!
*
* \param bridge The bridge a channel entered
* \param chan The channel that entered the bridge
+ * \param swap The channel being swapped out of the bridge
*/
-void ast_bridge_publish_enter(struct ast_bridge *bridge, struct ast_channel *chan);
+void ast_bridge_publish_enter(struct ast_bridge *bridge, struct ast_channel *chan,
+ struct ast_channel *swap);
/*!
* \since 12
bridge->v_table->name,
bridge->uniqueid);
- ast_bridge_publish_enter(bridge, bridge_channel->chan);
+ ast_bridge_publish_enter(bridge, bridge_channel->chan, swap ? swap->chan : NULL);
if (swap) {
ast_bridge_channel_leave_bridge(swap, BRIDGE_CHANNEL_STATE_END_NO_DISSOLVE);
bridge_channel_internal_pull(swap);
case PARKED_CALL_FAILED:
reason = "ParkedCallFailed";
break;
+ case PARKED_CALL_SWAP:
+ reason = "ParkedCallSwap";
+ break;
}
extra = ast_json_pack("{s: s}", "reason", reason);
<syntax>
<bridge_snapshot/>
<channel_snapshot/>
+ <parameter name="SwapUniqueid">
+ <para>The uniqueid of the channel being swapped out of the bridge</para>
+ </parameter>
</syntax>
</managerEventInstance>
</managerEvent>
struct stasis_topic *topic,
struct stasis_message *message)
{
+ static const char *swap_name = "SwapUniqueid: ";
struct ast_bridge_blob *blob = stasis_message_data(message);
RAII_VAR(struct ast_str *, bridge_text, NULL, ast_free);
RAII_VAR(struct ast_str *, channel_text, NULL, ast_free);
+ const char *swap_id;
bridge_text = ast_manager_build_bridge_state_string(blob->bridge, "");
channel_text = ast_manager_build_channel_state_string(blob->channel);
return;
}
+ swap_id = ast_json_string_get(ast_json_object_get(blob->blob, "swap"));
+
manager_event(EVENT_FLAG_CALL, "BridgeEnter",
"%s"
- "%s",
+ "%s"
+ "%s%s%s",
ast_str_buffer(bridge_text),
- ast_str_buffer(channel_text));
+ ast_str_buffer(channel_text),
+ swap_id ? swap_name : "",
+ S_OR(swap_id, ""),
+ swap_id ? "\r\n" : "");
}
static void channel_leave_cb(void *data, struct stasis_subscription *sub,
return msg;
}
-void ast_bridge_publish_enter(struct ast_bridge *bridge, struct ast_channel *chan)
+void ast_bridge_publish_enter(struct ast_bridge *bridge, struct ast_channel *chan,
+ struct ast_channel *swap)
{
RAII_VAR(struct stasis_message *, msg, NULL, ao2_cleanup);
+ RAII_VAR(struct ast_json *, blob, NULL, ao2_cleanup);
- msg = ast_bridge_blob_create(ast_channel_entered_bridge_type(), bridge, chan, NULL);
+ if (swap) {
+ blob = ast_json_pack("{s: s}", "swap", ast_channel_uniqueid(swap));
+ if (!blob) {
+ return;
+ }
+ }
+
+ msg = ast_bridge_blob_create(ast_channel_entered_bridge_type(), bridge, chan, blob);
if (!msg) {
return;
}
ast_channel_name(bridge_channel->chan));
}
+ publish_parked_call(pu, PARKED_CALL_SWAP);
+
return 0;
}
case PARKED_CALL_UNPARKED:
event_type = "UnParkedCall";
break;
+ case PARKED_CALL_SWAP:
+ event_type = "ParkedCallSwap";
+ break;
case PARKED_CALL_FAILED:
/* PARKED_CALL_FAILED doesn't currently get a message and is used exclusively for bridging */
return;