mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-05 12:16:00 +00:00
Make a couple of changes to help AMI events to be more clear in what is occurring.
* 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
This commit is contained in:
@@ -45,6 +45,7 @@ enum ast_parked_call_event_type {
|
|||||||
PARKED_CALL_GIVEUP,
|
PARKED_CALL_GIVEUP,
|
||||||
PARKED_CALL_UNPARKED,
|
PARKED_CALL_UNPARKED,
|
||||||
PARKED_CALL_FAILED,
|
PARKED_CALL_FAILED,
|
||||||
|
PARKED_CALL_SWAP,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
@@ -215,8 +215,10 @@ struct stasis_message *ast_bridge_blob_create(struct stasis_message_type *type,
|
|||||||
*
|
*
|
||||||
* \param bridge The bridge a channel entered
|
* \param bridge The bridge a channel entered
|
||||||
* \param chan The channel that entered the bridge
|
* \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
|
* \since 12
|
||||||
|
@@ -1429,7 +1429,7 @@ int bridge_channel_internal_push(struct ast_bridge_channel *bridge_channel)
|
|||||||
bridge->v_table->name,
|
bridge->v_table->name,
|
||||||
bridge->uniqueid);
|
bridge->uniqueid);
|
||||||
|
|
||||||
ast_bridge_publish_enter(bridge, bridge_channel->chan);
|
ast_bridge_publish_enter(bridge, bridge_channel->chan, swap ? swap->chan : NULL);
|
||||||
if (swap) {
|
if (swap) {
|
||||||
ast_bridge_channel_leave_bridge(swap, BRIDGE_CHANNEL_STATE_END_NO_DISSOLVE);
|
ast_bridge_channel_leave_bridge(swap, BRIDGE_CHANNEL_STATE_END_NO_DISSOLVE);
|
||||||
bridge_channel_internal_pull(swap);
|
bridge_channel_internal_pull(swap);
|
||||||
|
@@ -1304,6 +1304,9 @@ static void cel_parking_cb(
|
|||||||
case PARKED_CALL_FAILED:
|
case PARKED_CALL_FAILED:
|
||||||
reason = "ParkedCallFailed";
|
reason = "ParkedCallFailed";
|
||||||
break;
|
break;
|
||||||
|
case PARKED_CALL_SWAP:
|
||||||
|
reason = "ParkedCallSwap";
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
extra = ast_json_pack("{s: s}", "reason", reason);
|
extra = ast_json_pack("{s: s}", "reason", reason);
|
||||||
|
@@ -58,6 +58,9 @@ static struct stasis_message_router *bridge_state_router;
|
|||||||
<syntax>
|
<syntax>
|
||||||
<bridge_snapshot/>
|
<bridge_snapshot/>
|
||||||
<channel_snapshot/>
|
<channel_snapshot/>
|
||||||
|
<parameter name="SwapUniqueid">
|
||||||
|
<para>The uniqueid of the channel being swapped out of the bridge</para>
|
||||||
|
</parameter>
|
||||||
</syntax>
|
</syntax>
|
||||||
</managerEventInstance>
|
</managerEventInstance>
|
||||||
</managerEvent>
|
</managerEvent>
|
||||||
@@ -247,9 +250,11 @@ static void channel_enter_cb(void *data, struct stasis_subscription *sub,
|
|||||||
struct stasis_topic *topic,
|
struct stasis_topic *topic,
|
||||||
struct stasis_message *message)
|
struct stasis_message *message)
|
||||||
{
|
{
|
||||||
|
static const char *swap_name = "SwapUniqueid: ";
|
||||||
struct ast_bridge_blob *blob = stasis_message_data(message);
|
struct ast_bridge_blob *blob = stasis_message_data(message);
|
||||||
RAII_VAR(struct ast_str *, bridge_text, NULL, ast_free);
|
RAII_VAR(struct ast_str *, bridge_text, NULL, ast_free);
|
||||||
RAII_VAR(struct ast_str *, channel_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, "");
|
bridge_text = ast_manager_build_bridge_state_string(blob->bridge, "");
|
||||||
channel_text = ast_manager_build_channel_state_string(blob->channel);
|
channel_text = ast_manager_build_channel_state_string(blob->channel);
|
||||||
@@ -257,11 +262,17 @@ static void channel_enter_cb(void *data, struct stasis_subscription *sub,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
swap_id = ast_json_string_get(ast_json_object_get(blob->blob, "swap"));
|
||||||
|
|
||||||
manager_event(EVENT_FLAG_CALL, "BridgeEnter",
|
manager_event(EVENT_FLAG_CALL, "BridgeEnter",
|
||||||
"%s"
|
"%s"
|
||||||
"%s",
|
"%s"
|
||||||
|
"%s%s%s",
|
||||||
ast_str_buffer(bridge_text),
|
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,
|
static void channel_leave_cb(void *data, struct stasis_subscription *sub,
|
||||||
|
@@ -380,11 +380,20 @@ struct stasis_message *ast_bridge_blob_create(
|
|||||||
return msg;
|
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 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) {
|
if (!msg) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@@ -254,6 +254,8 @@ static int bridge_parking_push(struct ast_bridge_parking *self, struct ast_bridg
|
|||||||
ast_channel_name(bridge_channel->chan));
|
ast_channel_name(bridge_channel->chan));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
publish_parked_call(pu, PARKED_CALL_SWAP);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -526,6 +526,9 @@ static void parked_call_message_response(struct ast_parked_call_payload *parked_
|
|||||||
case PARKED_CALL_UNPARKED:
|
case PARKED_CALL_UNPARKED:
|
||||||
event_type = "UnParkedCall";
|
event_type = "UnParkedCall";
|
||||||
break;
|
break;
|
||||||
|
case PARKED_CALL_SWAP:
|
||||||
|
event_type = "ParkedCallSwap";
|
||||||
|
break;
|
||||||
case PARKED_CALL_FAILED:
|
case PARKED_CALL_FAILED:
|
||||||
/* PARKED_CALL_FAILED doesn't currently get a message and is used exclusively for bridging */
|
/* PARKED_CALL_FAILED doesn't currently get a message and is used exclusively for bridging */
|
||||||
return;
|
return;
|
||||||
|
Reference in New Issue
Block a user