mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-03 03:20:57 +00:00
channel: Always provide cause code in ChannelHangupRequest.
When queueing a channel to be hung up a cause code can be specified in one of two ways: 1. ast_queue_hangup_with_cause This function takes in a cause code and queues it as part of the hangup request, which ultimately results in it being set on the channel. 2. ast_channel_hangupcause_set + ast_queue_hangup This combination sets the hangup cause on the channel before queueing the hangup instead of as part of that process. In the #2 case the ChannelHangupRequest event would not contain the cause code. For consistency if a cause code has been set on the channel it will now be added to the event. Resolves: #1197
This commit is contained in:
@@ -1168,13 +1168,21 @@ int ast_queue_frame_head(struct ast_channel *chan, struct ast_frame *fin)
|
|||||||
/*! \brief Queue a hangup frame for channel */
|
/*! \brief Queue a hangup frame for channel */
|
||||||
int ast_queue_hangup(struct ast_channel *chan)
|
int ast_queue_hangup(struct ast_channel *chan)
|
||||||
{
|
{
|
||||||
|
RAII_VAR(struct ast_json *, blob, NULL, ast_json_unref);
|
||||||
struct ast_frame f = { AST_FRAME_CONTROL, .subclass.integer = AST_CONTROL_HANGUP };
|
struct ast_frame f = { AST_FRAME_CONTROL, .subclass.integer = AST_CONTROL_HANGUP };
|
||||||
int res;
|
int res, cause;
|
||||||
|
|
||||||
/* Yeah, let's not change a lock-critical value without locking */
|
/* Yeah, let's not change a lock-critical value without locking */
|
||||||
ast_channel_lock(chan);
|
ast_channel_lock(chan);
|
||||||
ast_channel_softhangup_internal_flag_add(chan, AST_SOFTHANGUP_DEV);
|
ast_channel_softhangup_internal_flag_add(chan, AST_SOFTHANGUP_DEV);
|
||||||
ast_channel_publish_blob(chan, ast_channel_hangup_request_type(), NULL);
|
|
||||||
|
cause = ast_channel_hangupcause(chan);
|
||||||
|
if (cause) {
|
||||||
|
blob = ast_json_pack("{s: i}",
|
||||||
|
"cause", cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
ast_channel_publish_blob(chan, ast_channel_hangup_request_type(), blob);
|
||||||
|
|
||||||
res = ast_queue_frame(chan, &f);
|
res = ast_queue_frame(chan, &f);
|
||||||
ast_channel_unlock(chan);
|
ast_channel_unlock(chan);
|
||||||
|
Reference in New Issue
Block a user