|
|
|
@ -107,6 +107,9 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
|
|
|
|
|
#define ZT_EVENT_DTMFUP 0
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/* define this to send PRI user-user information elements */
|
|
|
|
|
#undef SUPPORT_USERUSER
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
* \note Define ZHONE_HACK to cause us to go off hook and then back on hook when
|
|
|
|
|
* the user hangs up to reset the state machine so ring works properly.
|
|
|
|
@ -2004,7 +2007,9 @@ static int zt_call(struct ast_channel *ast, char *rdest, int timeout)
|
|
|
|
|
#ifdef ZAPATA_PRI
|
|
|
|
|
if (p->pri) {
|
|
|
|
|
struct pri_sr *sr;
|
|
|
|
|
#ifdef SUPPORT_USERUSER
|
|
|
|
|
char *useruser;
|
|
|
|
|
#endif
|
|
|
|
|
int pridialplan;
|
|
|
|
|
int dp_strip;
|
|
|
|
|
int prilocaldialplan;
|
|
|
|
@ -2118,11 +2123,14 @@ static int zt_call(struct ast_channel *ast, char *rdest, int timeout)
|
|
|
|
|
l ? (p->use_callingpres ? ast->cid.cid_pres : PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN) :
|
|
|
|
|
PRES_NUMBER_NOT_AVAILABLE);
|
|
|
|
|
pri_sr_set_redirecting(sr, ast->cid.cid_rdnis, p->pri->localdialplan - 1, PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN, PRI_REDIR_UNCONDITIONAL);
|
|
|
|
|
|
|
|
|
|
#ifdef SUPPORT_USERUSER
|
|
|
|
|
/* User-user info */
|
|
|
|
|
useruser = pbx_builtin_getvar_helper(p->owner, "USERUSERINFO");
|
|
|
|
|
|
|
|
|
|
if (useruser)
|
|
|
|
|
pri_sr_set_useruser(sr, useruser);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
if (pri_setup(p->pri->pri, p->call, sr)) {
|
|
|
|
|
ast_log(LOG_WARNING, "Unable to setup call to %s (using %s)\n",
|
|
|
|
@ -2462,13 +2470,20 @@ static int zt_hangup(struct ast_channel *ast)
|
|
|
|
|
/* Perform low level hangup if no owner left */
|
|
|
|
|
#ifdef ZAPATA_PRI
|
|
|
|
|
if (p->pri) {
|
|
|
|
|
#ifdef SUPPORT_USERUSER
|
|
|
|
|
char *useruser = pbx_builtin_getvar_helper(ast,"USERUSERINFO");
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/* Make sure we have a call (or REALLY have a call in the case of a PRI) */
|
|
|
|
|
if (p->call && (!p->bearer || (p->bearer->call == p->call))) {
|
|
|
|
|
if (!pri_grab(p, p->pri)) {
|
|
|
|
|
if (p->alreadyhungup) {
|
|
|
|
|
ast_log(LOG_DEBUG, "Already hungup... Calling hangup once, and clearing call\n");
|
|
|
|
|
|
|
|
|
|
#ifdef SUPPORT_USERUSER
|
|
|
|
|
pri_call_set_useruser(p->call, useruser);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
pri_hangup(p->pri->pri, p->call, -1);
|
|
|
|
|
p->call = NULL;
|
|
|
|
|
if (p->bearer)
|
|
|
|
@ -2477,7 +2492,11 @@ static int zt_hangup(struct ast_channel *ast)
|
|
|
|
|
char *cause = pbx_builtin_getvar_helper(ast,"PRI_CAUSE");
|
|
|
|
|
int icause = ast->hangupcause ? ast->hangupcause : -1;
|
|
|
|
|
ast_log(LOG_DEBUG, "Not yet hungup... Calling hangup once with icause, and clearing call\n");
|
|
|
|
|
|
|
|
|
|
#ifdef SUPPORT_USERUSER
|
|
|
|
|
pri_call_set_useruser(p->call, useruser);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
p->alreadyhungup = 1;
|
|
|
|
|
if (p->bearer)
|
|
|
|
|
p->bearer->alreadyhungup = 1;
|
|
|
|
@ -8507,9 +8526,13 @@ static void *pri_dchannel(void *vpri)
|
|
|
|
|
snprintf(ani2str, 5, "%.2d", e->ring.ani2);
|
|
|
|
|
pbx_builtin_setvar_helper(c, "ANI2", ani2str);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef SUPPORT_USERUSER
|
|
|
|
|
if (!ast_strlen_zero(e->ring.useruserinfo)) {
|
|
|
|
|
pbx_builtin_setvar_helper(c, "USERUSERINFO", e->ring.useruserinfo);
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
snprintf(calledtonstr, sizeof(calledtonstr)-1, "%d", e->ring.calledplan);
|
|
|
|
|
pbx_builtin_setvar_helper(c, "CALLEDTON", calledtonstr);
|
|
|
|
|
if (e->ring.redirectingreason >= 0)
|
|
|
|
@ -8542,9 +8565,13 @@ static void *pri_dchannel(void *vpri)
|
|
|
|
|
snprintf(ani2str, 5, "%d", e->ring.ani2);
|
|
|
|
|
pbx_builtin_setvar_helper(c, "ANI2", ani2str);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef SUPPORT_USERUSER
|
|
|
|
|
if (!ast_strlen_zero(e->ring.useruserinfo)) {
|
|
|
|
|
pbx_builtin_setvar_helper(c, "USERUSERINFO", e->ring.useruserinfo);
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
if (e->ring.redirectingreason >= 0)
|
|
|
|
|
pbx_builtin_setvar_helper(c, "PRIREDIRECTREASON", redirectingreason2str(e->ring.redirectingreason));
|
|
|
|
|
|
|
|
|
@ -8610,9 +8637,13 @@ static void *pri_dchannel(void *vpri)
|
|
|
|
|
pri->pvts[chanpos]->dsp_features = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef SUPPORT_USERUSER
|
|
|
|
|
if (!ast_strlen_zero(e->ringing.useruserinfo)) {
|
|
|
|
|
pbx_builtin_setvar_helper(pri->pvts[chanpos]->owner, "USERUSERINFO", e->ringing.useruserinfo);
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
ast_mutex_unlock(&pri->pvts[chanpos]->lock);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -8767,9 +8798,13 @@ static void *pri_dchannel(void *vpri)
|
|
|
|
|
/* Enable echo cancellation if it's not on already */
|
|
|
|
|
zt_enable_ec(pri->pvts[chanpos]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef SUPPORT_USERUSER
|
|
|
|
|
if (!ast_strlen_zero(e->answer.useruserinfo)) {
|
|
|
|
|
pbx_builtin_setvar_helper(pri->pvts[chanpos]->owner, "USERUSERINFO", e->answer.useruserinfo);
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
ast_mutex_unlock(&pri->pvts[chanpos]->lock);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -8827,9 +8862,13 @@ static void *pri_dchannel(void *vpri)
|
|
|
|
|
if (option_verbose > 2)
|
|
|
|
|
ast_verbose(VERBOSE_PREFIX_3 "Channel %d/%d, span %d received AOC-E charging %d unit%s\n",
|
|
|
|
|
pri->pvts[chanpos]->logicalspan, pri->pvts[chanpos]->prioffset, pri->span, (int)e->hangup.aoc_units, (e->hangup.aoc_units == 1) ? "" : "s");
|
|
|
|
|
|
|
|
|
|
#ifdef SUPPORT_USERUSER
|
|
|
|
|
if (!ast_strlen_zero(e->hangup.useruserinfo)) {
|
|
|
|
|
pbx_builtin_setvar_helper(pri->pvts[chanpos]->owner, "USERUSERINFO", e->hangup.useruserinfo);
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
ast_mutex_unlock(&pri->pvts[chanpos]->lock);
|
|
|
|
|
} else {
|
|
|
|
|
ast_log(LOG_WARNING, "Hangup on bad channel %d/%d on span %d\n",
|
|
|
|
@ -8887,9 +8926,13 @@ static void *pri_dchannel(void *vpri)
|
|
|
|
|
pri_reset(pri->pri, PVT_TO_CHANNEL(pri->pvts[chanpos]));
|
|
|
|
|
pri->pvts[chanpos]->resetting = 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef SUPPORT_USERUSER
|
|
|
|
|
if (!ast_strlen_zero(e->hangup.useruserinfo)) {
|
|
|
|
|
pbx_builtin_setvar_helper(pri->pvts[chanpos]->owner, "USERUSERINFO", e->hangup.useruserinfo);
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
ast_mutex_unlock(&pri->pvts[chanpos]->lock);
|
|
|
|
|
} else {
|
|
|
|
|
ast_log(LOG_WARNING, "Hangup REQ on bad channel %d/%d on span %d\n", PRI_SPAN(e->hangup.channel), PRI_CHANNEL(e->hangup.channel), pri->span);
|
|
|
|
@ -8913,9 +8956,13 @@ static void *pri_dchannel(void *vpri)
|
|
|
|
|
if (option_verbose > 2)
|
|
|
|
|
ast_verbose(VERBOSE_PREFIX_3 "Channel %d/%d, span %d got hangup ACK\n", PRI_SPAN(e->hangup.channel), PRI_CHANNEL(e->hangup.channel), pri->span);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef SUPPORT_USERUSER
|
|
|
|
|
if (!ast_strlen_zero(e->hangup.useruserinfo)) {
|
|
|
|
|
pbx_builtin_setvar_helper(pri->pvts[chanpos]->owner, "USERUSERINFO", e->hangup.useruserinfo);
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
ast_mutex_unlock(&pri->pvts[chanpos]->lock);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|