Make the new SIP_CAUSE backend behave more like the original SIP_CAUSE

There was a slight discrepancy in the behaviors of the old SIP_CAUSE and the
new SIP_CAUSE/HANGUPCAUSE when a channel had been originated and had not yet
been answered. This caused the noload_res_srtp_attempt_srtp test to fail since
the SIP_CAUSE variable was never actually set. This behavior has been restored.


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@366843 65c4cc65-6c06-0410-ace0-fbb531ad65f3
certified/11.2
Kinsey Moore 14 years ago
parent cd37bec058
commit 8e875bf298

@ -4201,6 +4201,21 @@ static int attribute_const is_visible_indication(enum ast_control_frame_type con
return 0; return 0;
} }
/*! \brief Sets the HANGUPCAUSE hash and optionally the SIP_CAUSE hash
* on the given channel */
static void set_hangupcause_hash(struct ast_channel *chan, const void *data)
{
char causevar[256];
const struct ast_control_pvt_cause_code *cause_code = data;
snprintf(causevar, sizeof(causevar), "HASH(HANGUPCAUSE,%s)", cause_code->chan_name);
ast_func_write(chan, causevar, cause_code->code);
if (cause_code->emulate_sip_cause) {
snprintf(causevar, sizeof(causevar), "HASH(SIP_CAUSE,%s)", cause_code->chan_name);
ast_func_write(chan, causevar, cause_code->code);
}
}
int ast_indicate_data(struct ast_channel *chan, int _condition, int ast_indicate_data(struct ast_channel *chan, int _condition,
const void *data, size_t datalen) const void *data, size_t datalen)
{ {
@ -4346,20 +4361,9 @@ int ast_indicate_data(struct ast_channel *chan, int _condition,
ts = ast_get_indication_tone(ast_channel_zone(chan), "congestion"); ts = ast_get_indication_tone(ast_channel_zone(chan), "congestion");
break; break;
case AST_CONTROL_PVT_CAUSE_CODE: case AST_CONTROL_PVT_CAUSE_CODE:
{ set_hangupcause_hash(chan, data);
char causevar[256];
const struct ast_control_pvt_cause_code *cause_code = data;
snprintf(causevar, sizeof(causevar), "HASH(HANGUPCAUSE,%s)", cause_code->chan_name);
ast_func_write(chan, causevar, cause_code->code);
if (cause_code->emulate_sip_cause) {
snprintf(causevar, sizeof(causevar), "HASH(SIP_CAUSE,%s)", cause_code->chan_name);
ast_func_write(chan, causevar, cause_code->code);
}
res = 0; res = 0;
break; break;
}
case AST_CONTROL_PROGRESS: case AST_CONTROL_PROGRESS:
case AST_CONTROL_PROCEEDING: case AST_CONTROL_PROCEEDING:
case AST_CONTROL_VIDUPDATE: case AST_CONTROL_VIDUPDATE:
@ -5506,8 +5510,11 @@ struct ast_channel *__ast_request_and_dial(const char *type, struct ast_format_c
timeout = 0; /* trick to force exit from the while() */ timeout = 0; /* trick to force exit from the while() */
break; break;
/* Ignore these */
case AST_CONTROL_PVT_CAUSE_CODE: case AST_CONTROL_PVT_CAUSE_CODE:
set_hangupcause_hash(chan, f->data.ptr);
break;
/* Ignore these */
case AST_CONTROL_PROGRESS: case AST_CONTROL_PROGRESS:
case AST_CONTROL_PROCEEDING: case AST_CONTROL_PROCEEDING:
case AST_CONTROL_HOLD: case AST_CONTROL_HOLD:

Loading…
Cancel
Save