Merge changes from svn/asterisk/team/russell/sla_updates

* Add support for the "barge=no" option for trunks.  If this option is set,
  then stations will not be able to join in on a call that is on progress
  on this trunk.


git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@57144 65c4cc65-6c06-0410-ace0-fbb531ad65f3
1.4
Russell Bryant 18 years ago
parent 6bc3d77c05
commit 9d3ff33b25

@ -411,6 +411,9 @@ struct sla_trunk {
unsigned int hold_stations; unsigned int hold_stations;
struct ast_channel *chan; struct ast_channel *chan;
unsigned int ring_timeout; unsigned int ring_timeout;
/*! If set to 1, no station will be able to join an active call with
* this trunk. */
unsigned int barge_disabled:1;
}; };
struct sla_trunk_ref { struct sla_trunk_ref {
@ -1013,10 +1016,12 @@ static int sla_show_trunks(int fd, int argc, char **argv)
"=== ==> Device: %s\n" "=== ==> Device: %s\n"
"=== ==> AutoContext: %s\n" "=== ==> AutoContext: %s\n"
"=== ==> RingTimeout: %s\n" "=== ==> RingTimeout: %s\n"
"=== ==> BargeAllowed: %s\n"
"=== ==> Stations ...\n", "=== ==> Stations ...\n",
trunk->name, trunk->device, trunk->name, trunk->device,
S_OR(trunk->autocontext, "(none)"), S_OR(trunk->autocontext, "(none)"),
ring_timeout); ring_timeout,
trunk->barge_disabled ? "No" : "Yes");
AST_RWLIST_RDLOCK(&sla_stations); AST_RWLIST_RDLOCK(&sla_stations);
AST_LIST_TRAVERSE(&trunk->stations, station_ref, entry) AST_LIST_TRAVERSE(&trunk->stations, station_ref, entry)
ast_cli(fd, "=== ==> Station name: %s\n", station_ref->station->name); ast_cli(fd, "=== ==> Station name: %s\n", station_ref->station->name);
@ -3065,13 +3070,23 @@ static struct sla_station *sla_find_station(const char *name)
return station; return station;
} }
/*! \brief Find a trunk reference on a station by name
* \param station the station
* \param name the trunk's name
* \return a pointer to the station's trunk reference. If the trunk
* is not found, or if it is not idle and barge is disabled,
* then NULL will be returned.
*/
static struct sla_trunk_ref *sla_find_trunk_ref_byname(const struct sla_station *station, static struct sla_trunk_ref *sla_find_trunk_ref_byname(const struct sla_station *station,
const char *name) const char *name)
{ {
struct sla_trunk_ref *trunk_ref = NULL; struct sla_trunk_ref *trunk_ref = NULL;
AST_LIST_TRAVERSE(&station->trunks, trunk_ref, entry) { AST_LIST_TRAVERSE(&station->trunks, trunk_ref, entry) {
if (!strcasecmp(trunk_ref->trunk->name, name)) if (strcasecmp(trunk_ref->trunk->name, name))
continue;
if (trunk_ref->trunk->barge_disabled && trunk_ref->state != SLA_TRUNK_STATE_IDLE)
trunk_ref = NULL;
break; break;
} }
@ -4007,7 +4022,7 @@ static int sla_station_exec(struct ast_channel *chan, void *data)
trunk_ref = sla_choose_idle_trunk(station); trunk_ref = sla_choose_idle_trunk(station);
AST_RWLIST_UNLOCK(&sla_trunks); AST_RWLIST_UNLOCK(&sla_trunks);
if (ast_strlen_zero(trunk_name) && !trunk_ref) { if (!trunk_ref) {
ast_log(LOG_NOTICE, "No trunks available for call.\n"); ast_log(LOG_NOTICE, "No trunks available for call.\n");
pbx_builtin_setvar_helper(chan, "SLASTATION_STATUS", "CONGESTION"); pbx_builtin_setvar_helper(chan, "SLASTATION_STATUS", "CONGESTION");
return 0; return 0;
@ -4339,7 +4354,9 @@ static int sla_build_trunk(struct ast_config *cfg, const char *cat)
var->value, trunk->name); var->value, trunk->name);
trunk->ring_timeout = 0; trunk->ring_timeout = 0;
} }
} else if (strcasecmp(var->name, "type") && strcasecmp(var->name, "device")) { } else if (!strcasecmp(var->name, "barge"))
trunk->barge_disabled = ast_false(var->value);
else if (strcasecmp(var->name, "type") && strcasecmp(var->name, "device")) {
ast_log(LOG_ERROR, "Invalid option '%s' specified at line %d of %s!\n", ast_log(LOG_ERROR, "Invalid option '%s' specified at line %d of %s!\n",
var->name, var->lineno, SLA_CONFIG_FILE); var->name, var->lineno, SLA_CONFIG_FILE);
} }

@ -27,6 +27,10 @@
;ringtimeout=30 ; Set how long to allow this trunk to ring on an inbound call before hanging ;ringtimeout=30 ; Set how long to allow this trunk to ring on an inbound call before hanging
; it up as an unanswered call. The value is in seconds. ; it up as an unanswered call. The value is in seconds.
;barge=no ; If this option is set to "no", then no station will be
; allowed to join a call that is in progress. The default
; value is "yes".
;[line2] ;[line2]
;type=trunk ;type=trunk
;device=Zap/4 ;device=Zap/4

Loading…
Cancel
Save