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
changes/78/78/1
Mark Michelson 12 years ago
parent 41d6be2432
commit 328e99f41d

@ -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;

Loading…
Cancel
Save