[svn-commits] russell: branch russell/iax2_frame_queue r87464 - in /team/russell/iax2_frame...
SVN commits to the Digium repositories
svn-commits at lists.digium.com
Mon Oct 29 17:13:47 CDT 2007
Author: russell
Date: Mon Oct 29 17:13:46 2007
New Revision: 87464
URL: http://svn.digium.com/view/asterisk?view=rev&rev=87464
Log:
resolve, reset
Modified:
team/russell/iax2_frame_queue/ (props changed)
team/russell/iax2_frame_queue/CHANGES
team/russell/iax2_frame_queue/Makefile
team/russell/iax2_frame_queue/UPGRADE.txt
team/russell/iax2_frame_queue/apps/app_controlplayback.c
team/russell/iax2_frame_queue/apps/app_meetme.c
team/russell/iax2_frame_queue/apps/app_minivm.c
team/russell/iax2_frame_queue/apps/app_mixmonitor.c
team/russell/iax2_frame_queue/apps/app_osplookup.c
team/russell/iax2_frame_queue/apps/app_playback.c
team/russell/iax2_frame_queue/apps/app_queue.c
team/russell/iax2_frame_queue/apps/app_record.c
team/russell/iax2_frame_queue/apps/app_rpt.c
team/russell/iax2_frame_queue/apps/app_voicemail.c
team/russell/iax2_frame_queue/channels/chan_agent.c
team/russell/iax2_frame_queue/channels/chan_alsa.c
team/russell/iax2_frame_queue/channels/chan_features.c
team/russell/iax2_frame_queue/channels/chan_gtalk.c
team/russell/iax2_frame_queue/channels/chan_h323.c
team/russell/iax2_frame_queue/channels/chan_iax2.c
team/russell/iax2_frame_queue/channels/chan_jingle.c
team/russell/iax2_frame_queue/channels/chan_local.c
team/russell/iax2_frame_queue/channels/chan_mgcp.c
team/russell/iax2_frame_queue/channels/chan_misdn.c
team/russell/iax2_frame_queue/channels/chan_oss.c
team/russell/iax2_frame_queue/channels/chan_sip.c
team/russell/iax2_frame_queue/channels/chan_skinny.c
team/russell/iax2_frame_queue/channels/chan_usbradio.c
team/russell/iax2_frame_queue/channels/chan_zap.c
team/russell/iax2_frame_queue/channels/iax2-provision.c
team/russell/iax2_frame_queue/channels/misdn/isdn_lib.c
team/russell/iax2_frame_queue/channels/misdn/isdn_lib.h
team/russell/iax2_frame_queue/channels/misdn/isdn_msg_parser.c
team/russell/iax2_frame_queue/codecs/codec_zap.c
team/russell/iax2_frame_queue/configs/queues.conf.sample
team/russell/iax2_frame_queue/configs/zapata.conf.sample
team/russell/iax2_frame_queue/configure
team/russell/iax2_frame_queue/configure.ac
team/russell/iax2_frame_queue/funcs/func_curl.c
team/russell/iax2_frame_queue/funcs/func_cut.c
team/russell/iax2_frame_queue/funcs/func_devstate.c
team/russell/iax2_frame_queue/funcs/func_lock.c
team/russell/iax2_frame_queue/funcs/func_logic.c
team/russell/iax2_frame_queue/funcs/func_odbc.c
team/russell/iax2_frame_queue/funcs/func_realtime.c
team/russell/iax2_frame_queue/funcs/func_shell.c
team/russell/iax2_frame_queue/funcs/func_strings.c
team/russell/iax2_frame_queue/include/asterisk/app.h
team/russell/iax2_frame_queue/include/asterisk/autoconfig.h.in
team/russell/iax2_frame_queue/include/asterisk/cli.h
team/russell/iax2_frame_queue/include/asterisk/linkedlists.h
team/russell/iax2_frame_queue/include/asterisk/lock.h
team/russell/iax2_frame_queue/include/asterisk/pval.h
team/russell/iax2_frame_queue/main/Makefile
team/russell/iax2_frame_queue/main/acl.c
team/russell/iax2_frame_queue/main/app.c
team/russell/iax2_frame_queue/main/ast_expr2.c
team/russell/iax2_frame_queue/main/ast_expr2.y
team/russell/iax2_frame_queue/main/ast_expr2f.c
team/russell/iax2_frame_queue/main/asterisk.c
team/russell/iax2_frame_queue/main/astmm.c
team/russell/iax2_frame_queue/main/astobj2.c
team/russell/iax2_frame_queue/main/cdr.c
team/russell/iax2_frame_queue/main/channel.c
team/russell/iax2_frame_queue/main/cli.c
team/russell/iax2_frame_queue/main/config.c
team/russell/iax2_frame_queue/main/db.c
team/russell/iax2_frame_queue/main/dnsmgr.c
team/russell/iax2_frame_queue/main/file.c
team/russell/iax2_frame_queue/main/frame.c
team/russell/iax2_frame_queue/main/http.c
team/russell/iax2_frame_queue/main/image.c
team/russell/iax2_frame_queue/main/loader.c
team/russell/iax2_frame_queue/main/logger.c
team/russell/iax2_frame_queue/main/manager.c
team/russell/iax2_frame_queue/main/pbx.c
team/russell/iax2_frame_queue/main/rtp.c
team/russell/iax2_frame_queue/main/threadstorage.c
team/russell/iax2_frame_queue/main/translate.c
team/russell/iax2_frame_queue/main/udptl.c
team/russell/iax2_frame_queue/main/utils.c
team/russell/iax2_frame_queue/pbx/ael/ael-test/ref.ael-ntest22
team/russell/iax2_frame_queue/pbx/ael/ael-test/ref.ael-test16
team/russell/iax2_frame_queue/pbx/ael/ael-test/ref.ael-test19
team/russell/iax2_frame_queue/pbx/ael/ael-test/ref.ael-test2
team/russell/iax2_frame_queue/pbx/ael/ael-test/ref.ael-test3
team/russell/iax2_frame_queue/pbx/ael/ael-test/ref.ael-test4
team/russell/iax2_frame_queue/pbx/pbx_ael.c
team/russell/iax2_frame_queue/pbx/pbx_config.c
team/russell/iax2_frame_queue/pbx/pbx_dundi.c
team/russell/iax2_frame_queue/res/ael/ael.flex
team/russell/iax2_frame_queue/res/ael/ael.tab.c
team/russell/iax2_frame_queue/res/ael/ael.tab.h
team/russell/iax2_frame_queue/res/ael/ael.y
team/russell/iax2_frame_queue/res/ael/ael_lex.c
team/russell/iax2_frame_queue/res/ael/pval.c
team/russell/iax2_frame_queue/res/res_agi.c
team/russell/iax2_frame_queue/res/res_clioriginate.c
team/russell/iax2_frame_queue/res/res_config_pgsql.c
team/russell/iax2_frame_queue/res/res_config_sqlite.c
team/russell/iax2_frame_queue/res/res_convert.c
team/russell/iax2_frame_queue/res/res_crypto.c
team/russell/iax2_frame_queue/res/res_features.c
team/russell/iax2_frame_queue/res/res_indications.c
team/russell/iax2_frame_queue/res/res_jabber.c
team/russell/iax2_frame_queue/res/res_limit.c
team/russell/iax2_frame_queue/res/res_monitor.c
team/russell/iax2_frame_queue/res/res_musiconhold.c
team/russell/iax2_frame_queue/res/res_odbc.c
team/russell/iax2_frame_queue/res/res_realtime.c
team/russell/iax2_frame_queue/utils/ael_main.c
team/russell/iax2_frame_queue/utils/conf2ael.c
Propchange: team/russell/iax2_frame_queue/
------------------------------------------------------------------------------
automerge = *
Propchange: team/russell/iax2_frame_queue/
------------------------------------------------------------------------------
Binary property 'branch-1.4-blocked' - no diff available.
Propchange: team/russell/iax2_frame_queue/
------------------------------------------------------------------------------
Binary property 'branch-1.4-merged' - no diff available.
Propchange: team/russell/iax2_frame_queue/
------------------------------------------------------------------------------
--- svnmerge-integrated (original)
+++ svnmerge-integrated Mon Oct 29 17:13:46 2007
@@ -1,1 +1,1 @@
-/trunk:1-86529
+/trunk:1-87462
Modified: team/russell/iax2_frame_queue/CHANGES
URL: http://svn.digium.com/view/asterisk/team/russell/iax2_frame_queue/CHANGES?view=diff&rev=87464&r1=87463&r2=87464
==============================================================================
--- team/russell/iax2_frame_queue/CHANGES (original)
+++ team/russell/iax2_frame_queue/CHANGES Mon Oct 29 17:13:46 2007
@@ -165,6 +165,7 @@
* Added additional information to EXITWITHTIMEOUT and EXITWITHKEY events in the
queue log.
* Added ability for non-realtime queues to have realtime members
+ * Added the "linear" strategy to queues.
MeetMe Changes
--------------
Modified: team/russell/iax2_frame_queue/Makefile
URL: http://svn.digium.com/view/asterisk/team/russell/iax2_frame_queue/Makefile?view=diff&rev=87464&r1=87463&r2=87464
==============================================================================
--- team/russell/iax2_frame_queue/Makefile (original)
+++ team/russell/iax2_frame_queue/Makefile Mon Oct 29 17:13:46 2007
@@ -200,7 +200,11 @@
endif
endif
-ASTCFLAGS+=-pipe -Wall -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations $(DEBUG)
+ifeq ($(findstring -save-temps,$(ASTCFLAGS)),)
+ASTCFLAGS+=-pipe
+endif
+
+ASTCFLAGS+=-Wall -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations $(DEBUG)
ASTCFLAGS+=-include $(ASTTOPDIR)/include/asterisk/autoconfig.h
Modified: team/russell/iax2_frame_queue/UPGRADE.txt
URL: http://svn.digium.com/view/asterisk/team/russell/iax2_frame_queue/UPGRADE.txt?view=diff&rev=87464&r1=87463&r2=87464
==============================================================================
--- team/russell/iax2_frame_queue/UPGRADE.txt (original)
+++ team/russell/iax2_frame_queue/UPGRADE.txt Mon Oct 29 17:13:46 2007
@@ -79,6 +79,11 @@
these functions in any location where you desire to ensure that only one
channel is executing that path at any one time.
+Dialplan Functions:
+
+* QUEUE_MEMBER_COUNT() has been deprecated in favor of the QUEUE_MEMBER() function. For
+ more information, issue a "show function QUEUE_MEMBER" from the CLI.
+
CDR:
* The cdr_sqlite module has been marked as deprecated in favor of
Modified: team/russell/iax2_frame_queue/apps/app_controlplayback.c
URL: http://svn.digium.com/view/asterisk/team/russell/iax2_frame_queue/apps/app_controlplayback.c?view=diff&rev=87464&r1=87463&r2=87464
==============================================================================
--- team/russell/iax2_frame_queue/apps/app_controlplayback.c (original)
+++ team/russell/iax2_frame_queue/apps/app_controlplayback.c Mon Oct 29 17:13:46 2007
@@ -142,7 +142,7 @@
res = ast_control_streamfile(chan, args.filename, args.fwd, args.rev, args.stop, args.pause, args.restart, skipms, &offsetms);
/* If we stopped on one of our stop keys, return 0 */
- if (args.stop && strchr(args.stop, res)) {
+ if (res > 0 && args.stop && strchr(args.stop, res)) {
res = 0;
pbx_builtin_setvar_helper(chan, "CPLAYBACKSTATUS", "USERSTOPPED");
} else {
Modified: team/russell/iax2_frame_queue/apps/app_meetme.c
URL: http://svn.digium.com/view/asterisk/team/russell/iax2_frame_queue/apps/app_meetme.c?view=diff&rev=87464&r1=87463&r2=87464
==============================================================================
--- team/russell/iax2_frame_queue/apps/app_meetme.c (original)
+++ team/russell/iax2_frame_queue/apps/app_meetme.c Mon Oct 29 17:13:46 2007
@@ -82,7 +82,9 @@
enum {
ADMINFLAG_MUTED = (1 << 1), /*!< User is muted */
ADMINFLAG_SELFMUTED = (1 << 2), /*!< User muted self */
- ADMINFLAG_KICKME = (1 << 3) /*!< User has been kicked */
+ ADMINFLAG_KICKME = (1 << 3), /*!< User has been kicked */
+ /*! User has requested to speak */
+ ADMINFLAG_T_REQUEST = (1 << 4),
};
#define MEETME_DELAYDETECTTALK 300
@@ -1050,7 +1052,7 @@
min = ((now - user->jointime) % 3600) / 60;
sec = (now - user->jointime) % 60;
if ( !concise )
- ast_cli(a->fd, "User #: %-2.2d %12.12s %-20.20s Channel: %s %s %s %s %s %02d:%02d:%02d\n",
+ ast_cli(a->fd, "User #: %-2.2d %12.12s %-20.20s Channel: %s %s %s %s %s %s %02d:%02d:%02d\n",
user->user_no,
S_OR(user->chan->cid.cid_num, "<unknown>"),
S_OR(user->chan->cid.cid_name, "<no name>"),
@@ -1058,9 +1060,10 @@
user->userflags & CONFFLAG_ADMIN ? "(Admin)" : "",
user->userflags & CONFFLAG_MONITOR ? "(Listen only)" : "",
user->adminflags & ADMINFLAG_MUTED ? "(Admin Muted)" : user->adminflags & ADMINFLAG_SELFMUTED ? "(Muted)" : "",
+ user->adminflags & ADMINFLAG_T_REQUEST ? "(Request to Talk)" : "",
istalking(user->talking), hr, min, sec);
else
- ast_cli(a->fd, "%d!%s!%s!%s!%s!%s!%s!%d!%02d:%02d:%02d\n",
+ ast_cli(a->fd, "%d!%s!%s!%s!%s!%s!%s!%s!%d!%02d:%02d:%02d\n",
user->user_no,
S_OR(user->chan->cid.cid_num, ""),
S_OR(user->chan->cid.cid_name, ""),
@@ -1068,6 +1071,7 @@
user->userflags & CONFFLAG_ADMIN ? "1" : "",
user->userflags & CONFFLAG_MONITOR ? "1" : "",
user->adminflags & (ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED) ? "1" : "",
+ user->adminflags & ADMINFLAG_T_REQUEST ? "1" : "",
user->talking, hr, min, sec);
}
@@ -1244,9 +1248,9 @@
}
static struct ast_cli_entry cli_meetme[] = {
- NEW_CLI(meetme_cmd, "Execute a command on a conference or conferee"),
- NEW_CLI(sla_show_trunks, "Show SLA Trunks"),
- NEW_CLI(sla_show_stations, "Show SLA Stations"),
+ AST_CLI_DEFINE(meetme_cmd, "Execute a command on a conference or conferee"),
+ AST_CLI_DEFINE(sla_show_trunks, "Show SLA Trunks"),
+ AST_CLI_DEFINE(sla_show_stations, "Show SLA Stations"),
};
static void conf_flush(int fd, struct ast_channel *chan)
@@ -1445,6 +1449,7 @@
int ret = -1;
int x;
int menu_active = 0;
+ int talkreq_manager = 0;
int using_pseudo = 0;
int duration=20;
int hr, min, sec;
@@ -1798,7 +1803,7 @@
x = 1;
ast_channel_setoption(chan, AST_OPTION_TONE_VERIFY, &x, sizeof(char), 0);
}
- if (!(dsp = ast_dsp_new())) {
+ if (!(confflags & CONFFLAG_MONITOR) && !(dsp = ast_dsp_new())) {
ast_log(LOG_WARNING, "Unable to allocate DSP!\n");
res = -1;
}
@@ -1991,7 +1996,33 @@
"Status: off\r\n",
chan->name, chan->uniqueid, conf->confno, user->user_no);
}
-
+
+ if ((user->adminflags & (ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED)) &&
+ (user->adminflags & ADMINFLAG_T_REQUEST) && !(talkreq_manager)) {
+ talkreq_manager = 1;
+
+ manager_event(EVENT_FLAG_CALL, "MeetmeTalkRequest",
+ "Channel: %s\r\n"
+ "Uniqueid: %s\r\n"
+ "Meetme: %s\r\n"
+ "Usernum: %i\r\n"
+ "Status: on\r\n",
+ chan->name, chan->uniqueid, conf->confno, user->user_no);
+ }
+
+
+ if (!(user->adminflags & (ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED)) &&
+ !(user->adminflags & ADMINFLAG_T_REQUEST) && (talkreq_manager)) {
+ talkreq_manager = 0;
+ manager_event(EVENT_FLAG_CALL, "MeetmeTalkRequest",
+ "Channel: %s\r\n"
+ "Uniqueid: %s\r\n"
+ "Meetme: %s\r\n"
+ "Usernum: %i\r\n"
+ "Status: off\r\n",
+ chan->name, chan->uniqueid, conf->confno, user->user_no);
+ }
+
/* If I have been kicked, exit the conference */
if (user->adminflags & ADMINFLAG_KICKME) {
//You have been kicked.
@@ -2029,7 +2060,7 @@
if (user->talk.actual)
ast_frame_adjust_volume(f, user->talk.actual);
- {
+ if (!(confflags & CONFFLAG_MONITOR)) {
int totalsilence;
if (user->talking == -1)
@@ -2226,6 +2257,15 @@
if (!ast_streamfile(chan, "conf-unmuted", chan->language))
ast_waitstream(chan, "");
}
+ break;
+ case '2':
+ menu_active = 0;
+ if (user->adminflags & (ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED))
+ user->adminflags |= ADMINFLAG_T_REQUEST;
+
+ if (user->adminflags & ADMINFLAG_T_REQUEST)
+ if (!ast_streamfile(chan, "beep", chan->language))
+ ast_waitstream(chan, "");
break;
case '4':
tweak_listen_volume(user, VOL_DOWN);
@@ -3022,13 +3062,13 @@
break;
case 109: /* m: Unmute */
if (user) {
- user->adminflags &= ~(ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED);
+ user->adminflags &= ~(ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED | ADMINFLAG_T_REQUEST);
} else
ast_log(LOG_NOTICE, "Specified User not found!\n");
break;
case 110: /* n: Unmute all users */
AST_LIST_TRAVERSE(&cnf->userlist, user, list)
- user->adminflags &= ~(ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED);
+ user->adminflags &= ~(ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED | ADMINFLAG_T_REQUEST);
break;
case 107: /* k: Kick user */
if (user)
@@ -3210,7 +3250,7 @@
if (mute)
user->adminflags |= ADMINFLAG_MUTED; /* request user muting */
else
- user->adminflags &= ~(ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED); /* request user unmuting */
+ user->adminflags &= ~(ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED | ADMINFLAG_T_REQUEST); /* request user unmuting */
AST_LIST_UNLOCK(&confs);
Modified: team/russell/iax2_frame_queue/apps/app_minivm.c
URL: http://svn.digium.com/view/asterisk/team/russell/iax2_frame_queue/apps/app_minivm.c?view=diff&rev=87464&r1=87463&r2=87464
==============================================================================
--- team/russell/iax2_frame_queue/apps/app_minivm.c (original)
+++ team/russell/iax2_frame_queue/apps/app_minivm.c Mon Oct 29 17:13:46 2007
@@ -2991,12 +2991,12 @@
/*! \brief CLI commands for Mini-voicemail */
static struct ast_cli_entry cli_minivm[] = {
- NEW_CLI(handle_minivm_show_users, "List defined mini-voicemail boxes"),
- NEW_CLI(handle_minivm_show_zones, "List zone message formats"),
- NEW_CLI(handle_minivm_list_templates, "List message templates"),
- NEW_CLI(handle_minivm_reload, "Reload Mini-voicemail configuration"),
- NEW_CLI(handle_minivm_show_stats, "Show some mini-voicemail statistics"),
- NEW_CLI(handle_minivm_show_settings, "Show mini-voicemail general settings"),
+ AST_CLI_DEFINE(handle_minivm_show_users, "List defined mini-voicemail boxes"),
+ AST_CLI_DEFINE(handle_minivm_show_zones, "List zone message formats"),
+ AST_CLI_DEFINE(handle_minivm_list_templates, "List message templates"),
+ AST_CLI_DEFINE(handle_minivm_reload, "Reload Mini-voicemail configuration"),
+ AST_CLI_DEFINE(handle_minivm_show_stats, "Show some mini-voicemail statistics"),
+ AST_CLI_DEFINE(handle_minivm_show_settings, "Show mini-voicemail general settings"),
};
static struct ast_custom_function minivm_counter_function = {
Modified: team/russell/iax2_frame_queue/apps/app_mixmonitor.c
URL: http://svn.digium.com/view/asterisk/team/russell/iax2_frame_queue/apps/app_mixmonitor.c?view=diff&rev=87464&r1=87463&r2=87464
==============================================================================
--- team/russell/iax2_frame_queue/apps/app_mixmonitor.c (original)
+++ team/russell/iax2_frame_queue/apps/app_mixmonitor.c Mon Oct 29 17:13:46 2007
@@ -399,7 +399,7 @@
}
static struct ast_cli_entry cli_mixmonitor[] = {
- NEW_CLI(handle_cli_mixmonitor, "Execute a MixMonitor command")
+ AST_CLI_DEFINE(handle_cli_mixmonitor, "Execute a MixMonitor command")
};
static int unload_module(void)
Modified: team/russell/iax2_frame_queue/apps/app_osplookup.c
URL: http://svn.digium.com/view/asterisk/team/russell/iax2_frame_queue/apps/app_osplookup.c?view=diff&rev=87464&r1=87463&r2=87464
==============================================================================
--- team/russell/iax2_frame_queue/apps/app_osplookup.c (original)
+++ team/russell/iax2_frame_queue/apps/app_osplookup.c Mon Oct 29 17:13:46 2007
@@ -2000,7 +2000,7 @@
" SUCCESS | FAILED | ERROR \n";
static struct ast_cli_entry cli_osp[] = {
- NEW_CLI(handle_cli_osp_show, "Displays OSF information")
+ AST_CLI_DEFINE(handle_cli_osp_show, "Displays OSF information")
};
static int load_module(void)
Modified: team/russell/iax2_frame_queue/apps/app_playback.c
URL: http://svn.digium.com/view/asterisk/team/russell/iax2_frame_queue/apps/app_playback.c?view=diff&rev=87464&r1=87463&r2=87464
==============================================================================
--- team/russell/iax2_frame_queue/apps/app_playback.c (original)
+++ team/russell/iax2_frame_queue/apps/app_playback.c Mon Oct 29 17:13:46 2007
@@ -357,7 +357,6 @@
return 0;
}
-
static char *__say_cli_init(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
const char *old_mode = say_api_buf[0] ? say_new : say_old;
@@ -368,11 +367,11 @@
e->usage =
"Usage: say load [new|old]\n"
" say load\n"
- " Report status of current say mode\n"
+ " Report status of current say mode\n"
" say load new\n"
- " Set say method, configured in say.conf\n"
+ " Set say method, configured in say.conf\n"
" say load old\n"
- " Set old say metod, coded in asterisk core\n";
+ " Set old say method, coded in asterisk core\n";
return NULL;
case CLI_GENERATE:
return NULL;
@@ -380,24 +379,20 @@
if (a->argc == 2) {
ast_cli(a->fd, "say mode is [%s]\n", old_mode);
return CLI_SUCCESS;
- } else if (a->argc != 3)
- return CLI_SHOWUSAGE;
- mode = a->argv[2];
-
- if (!strcmp(mode, old_mode)) {
+ } else if (a->argc != 3)
+ return CLI_SHOWUSAGE;
+ mode = a->argv[2];
+ if (!strcmp(mode, old_mode))
ast_log(LOG_NOTICE, "say mode is %s already\n", mode);
- } else {
- if (say_init_mode(mode) == 0) {
+ else
+ if (say_init_mode(mode) == 0)
ast_log(LOG_NOTICE, "init say.c from %s to %s\n", old_mode, mode);
- }
- }
+
return CLI_SUCCESS;
}
static struct ast_cli_entry cli_playback[] = {
- NEW_CLI(__say_cli_init, "Set or show the say mode"),
- NEW_CLI(__say_cli_init, "Set the say mode"),
- NEW_CLI(__say_cli_init, "Set the say mode"),
+ AST_CLI_DEFINE(__say_cli_init, "Set or show the say mode"),
};
static int playback_exec(struct ast_channel *chan, void *data)
Modified: team/russell/iax2_frame_queue/apps/app_queue.c
URL: http://svn.digium.com/view/asterisk/team/russell/iax2_frame_queue/apps/app_queue.c?view=diff&rev=87464&r1=87463&r2=87464
==============================================================================
--- team/russell/iax2_frame_queue/apps/app_queue.c (original)
+++ team/russell/iax2_frame_queue/apps/app_queue.c Mon Oct 29 17:13:46 2007
@@ -100,7 +100,8 @@
QUEUE_STRATEGY_LEASTRECENT,
QUEUE_STRATEGY_FEWESTCALLS,
QUEUE_STRATEGY_RANDOM,
- QUEUE_STRATEGY_RRMEMORY
+ QUEUE_STRATEGY_RRMEMORY,
+ QUEUE_STRATEGY_LINEAR
};
static struct strategy {
@@ -112,6 +113,7 @@
{ QUEUE_STRATEGY_FEWESTCALLS, "fewestcalls" },
{ QUEUE_STRATEGY_RANDOM, "random" },
{ QUEUE_STRATEGY_RRMEMORY, "rrmemory" },
+ { QUEUE_STRATEGY_LINEAR, "linear" },
};
#define DEFAULT_RETRY 5
@@ -257,6 +259,9 @@
/*! \brief queues.conf [general] option */
static int montype_default = 0;
+/*! \brief queues.conf [general] option */
+static int shared_lastcall = 0;
+
/*! \brief Subscription to device state change events */
static struct ast_event_sub *device_state_sub;
@@ -300,6 +305,7 @@
int metric;
int oldstatus;
time_t lastcall;
+ struct call_queue *lastqueue;
struct member *member;
};
@@ -320,6 +326,8 @@
int opos; /*!< Where we started in the queue */
int handled; /*!< Whether our call was handled */
int max_penalty; /*!< Limit the members that can take this call to this penalty or lower */
+ int linpos; /*!< If using linear strategy, what position are we at? */
+ int linwrapped; /*!< Is the linpos wrapped? */
time_t start; /*!< When we started holding */
time_t expire; /*!< When this entry should expire (time out of queue) */
struct ast_channel *chan; /*!< Our channel */
@@ -336,6 +344,7 @@
int status; /*!< Status of queue member */
int paused; /*!< Are we paused (not accepting calls)? */
time_t lastcall; /*!< When last successful call was hungup */
+ struct call_queue *lastqueue; /*!< Last queue we received a call */
unsigned int dead:1; /*!< Used to detect members deleted in realtime */
unsigned int delme:1; /*!< Flag to delete entry on reload */
};
@@ -797,7 +806,7 @@
static int member_cmp_fn(void *obj1, void *obj2, int flags)
{
struct member *mem1 = obj1, *mem2 = obj2;
- return strcmp(mem1->interface, mem2->interface) ? 0 : CMP_MATCH;
+ return strcasecmp(mem1->interface, mem2->interface) ? 0 : CMP_MATCH;
}
static void init_queue(struct call_queue *q)
@@ -828,8 +837,13 @@
q->monfmt[0] = '\0';
q->periodicannouncefrequency = 0;
q->sound_callerannounce[0] = '\0'; /* Default, don't announce the caller that he has been answered */
- if(!q->members)
- q->members = ao2_container_alloc(37, member_hash_fn, member_cmp_fn);
+ if(!q->members) {
+ if(q->strategy == QUEUE_STRATEGY_LINEAR)
+ /* linear strategy depends on order, so we have to place all members in a single bucket */
+ q->members = ao2_container_alloc(1, member_hash_fn, member_cmp_fn);
+ else
+ q->members = ao2_container_alloc(37, member_hash_fn, member_cmp_fn);
+ }
q->membercount = 0;
q->found = 1;
ast_copy_string(q->sound_next, "queue-youarenext", sizeof(q->sound_next));
@@ -1058,12 +1072,8 @@
} else if (!strcasecmp(param, "servicelevel")) {
q->servicelevel= atoi(val);
} else if (!strcasecmp(param, "strategy")) {
- q->strategy = strat2int(val);
- if (q->strategy < 0) {
- ast_log(LOG_WARNING, "'%s' isn't a valid strategy for queue '%s', using ringall instead\n",
- val, q->name);
- q->strategy = QUEUE_STRATEGY_RINGALL;
- }
+ /* We already have set this, no need to do it again */
+ return;
} else if (!strcasecmp(param, "joinempty")) {
if (!strcasecmp(val, "loose"))
q->joinempty = QUEUE_EMPTY_LOOSE;
@@ -1858,8 +1868,10 @@
char *location;
/* on entry here, we know that tmp->chan == NULL */
- if (qe->parent->wrapuptime && (time(NULL) - tmp->lastcall < qe->parent->wrapuptime)) {
- ast_debug(1, "Wrapuptime not yet expired for %s\n", tmp->interface);
+ if ((tmp->lastqueue && tmp->lastqueue->wrapuptime && (time(NULL) - tmp->lastcall < tmp->lastqueue->wrapuptime)) ||
+ (!tmp->lastqueue && qe->parent->wrapuptime && (time(NULL) - tmp->lastcall < qe->parent->wrapuptime))) {
+ ast_debug(1, "Wrapuptime not yet expired on queue %s for %s\n",
+ (tmp->lastqueue ? tmp->lastqueue->name : qe->parent->name), tmp->interface);
if (qe->chan->cdr)
ast_cdr_busy(qe->chan->cdr);
tmp->stillgoing = 0;
@@ -1907,7 +1919,9 @@
ao2_lock(qe->parent);
qe->parent->rrpos++;
+ qe->linpos++;
ao2_unlock(qe->parent);
+
(*busies)++;
return 0;
@@ -2014,7 +2028,7 @@
return ret;
}
-static int store_next(struct queue_ent *qe, struct callattempt *outgoing)
+static int store_next_rr(struct queue_ent *qe, struct callattempt *outgoing)
{
struct callattempt *best = find_best(outgoing);
@@ -2033,6 +2047,29 @@
}
}
qe->parent->wrapped = 0;
+
+ return 0;
+}
+
+static int store_next_lin(struct queue_ent *qe, struct callattempt *outgoing)
+{
+ struct callattempt *best = find_best(outgoing);
+
+ if (best) {
+ /* Ring just the best channel */
+ ast_debug(1, "Next is '%s' with metric %d\n", best->interface, best->metric);
+ qe->linpos = best->metric % 1000;
+ } else {
+ /* Just increment rrpos */
+ if (qe->linwrapped) {
+ /* No more channels, start over */
+ qe->linpos = 0;
+ } else {
+ /* Prioritize next entry */
+ qe->linpos++;
+ }
+ }
+ qe->linwrapped = 0;
return 0;
}
@@ -2492,9 +2529,31 @@
static int update_queue(struct call_queue *q, struct member *member, int callcompletedinsl)
{
+ struct member *mem;
+ struct call_queue *qtmp;
+ struct ao2_iterator queue_iter;
+
+ if (shared_lastcall) {
+ queue_iter = ao2_iterator_init(queues, 0);
+ while ((qtmp = ao2_iterator_next(&queue_iter))) {
+ ao2_lock(qtmp);
+ if ((mem = ao2_find(qtmp->members, member, OBJ_POINTER))) {
+ time(&mem->lastcall);
+ mem->calls++;
+ mem->lastqueue = q;
+ ao2_ref(mem, -1);
+ }
+ ao2_unlock(qtmp);
+ ao2_ref(qtmp, -1);
+ }
+ } else {
+ ao2_lock(q);
+ time(&member->lastcall);
+ member->calls++;
+ member->lastqueue = q;
+ ao2_unlock(q);
+ }
ao2_lock(q);
- time(&member->lastcall);
- member->calls++;
q->callscompleted++;
if (callcompletedinsl)
q->callscompletedinsl++;
@@ -2511,6 +2570,17 @@
case QUEUE_STRATEGY_RINGALL:
/* Everyone equal, except for penalty */
tmp->metric = mem->penalty * 1000000;
+ break;
+ case QUEUE_STRATEGY_LINEAR:
+ if (pos < qe->linpos) {
+ tmp->metric = 1000 + pos;
+ } else {
+ if (pos > qe->linpos)
+ /* Indicate there is another priority */
+ qe->linwrapped = 1;
+ tmp->metric = pos;
+ }
+ tmp->metric += mem->penalty * 1000000;
break;
case QUEUE_STRATEGY_RRMEMORY:
if (pos < q->rrpos) {
@@ -2660,7 +2730,7 @@
ast_set_flag(&(bridge_config.features_caller), AST_FEATURE_PARKCALL);
break;
case 'n':
- if (qe->parent->strategy == QUEUE_STRATEGY_RRMEMORY)
+ if (qe->parent->strategy == QUEUE_STRATEGY_RRMEMORY || qe->parent->strategy == QUEUE_STRATEGY_LINEAR)
(*tries)++;
else
*tries = qe->parent->membercount;
@@ -2698,6 +2768,7 @@
tmp->member = cur;
tmp->oldstatus = cur->status;
tmp->lastcall = cur->lastcall;
+ tmp->lastqueue = cur->lastqueue;
ast_copy_string(tmp->interface, cur->interface, sizeof(tmp->interface));
/* Special case: If we ring everyone, go ahead and ring them, otherwise
just calculate their metric for the appropriate strategy */
@@ -2727,7 +2798,10 @@
lpeer = wait_for_answer(qe, outgoing, &to, &digit, numbusies, ast_test_flag(&(bridge_config.features_caller), AST_FEATURE_DISCONNECT), forwardsallowed);
ao2_lock(qe->parent);
if (qe->parent->strategy == QUEUE_STRATEGY_RRMEMORY) {
- store_next(qe, outgoing);
+ store_next_rr(qe, outgoing);
+ }
+ if (qe->parent->strategy == QUEUE_STRATEGY_LINEAR) {
+ store_next_lin(qe, outgoing);
}
ao2_unlock(qe->parent);
peer = lpeer ? lpeer->chan : NULL;
@@ -3959,6 +4033,67 @@
struct call_queue *q, tmpq;
struct member *m;
struct ao2_iterator mem_iter;
+ char *queuename, *option;
+
+ buf[0] = '\0';
+
+ if (ast_strlen_zero(data)) {
+ ast_log(LOG_ERROR, "%s requires an argument: queuename\n", cmd);
+ return -1;
+ }
+
+ queuename = data;
+ if ((option = strchr(data, ',')))
+ *option++ = '\0';
+ else
+ option = "logged";
+
+ ast_copy_string(tmpq.name, queuename, sizeof(tmpq.name));
+
+ if ((q = ao2_find(queues, &tmpq, OBJ_POINTER))) {
+ ao2_lock(q);
+ if(!strcasecmp(option, "logged")) {
+ mem_iter = ao2_iterator_init(q->members, 0);
+ while ((m = ao2_iterator_next(&mem_iter))) {
+ /* Count the agents who are logged in and presently answering calls */
+ if ((m->status != AST_DEVICE_UNAVAILABLE) && (m->status != AST_DEVICE_INVALID)) {
+ count++;
+ }
+ ao2_ref(m, -1);
+ }
+ } else if(!strcasecmp(option, "free")) {
+ mem_iter = ao2_iterator_init(q->members, 0);
+ while ((m = ao2_iterator_next(&mem_iter))) {
+ /* Count the agents who are logged in and presently answering calls */
+ if ((m->status == AST_DEVICE_NOT_INUSE) && (!m->paused)) {
+ count++;
+ }
+ ao2_ref(m, -1);
+ }
+ } else /* must be "count" */
+ count = q->membercount;
+ ao2_unlock(q);
+ queue_unref(q);
+ } else
+ ast_log(LOG_WARNING, "queue %s was not found\n", data);
+
+ snprintf(buf, len, "%d", count);
+
+ return 0;
+}
+
+static int queue_function_qac_dep(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
+{
+ int count = 0;
+ struct call_queue *q, tmpq;
+ struct member *m;
+ struct ao2_iterator mem_iter;
+ static int depflag = 1;
+ if(depflag)
+ {
+ depflag = 0;
+ ast_log(LOG_NOTICE, "The function QUEUE_MEMBER_COUNT has been deprecated in favor of the QUEUE_MEMBER function and will not be in further releases.\n");
+ }
buf[0] = '\0';
@@ -3988,6 +4123,7 @@
return 0;
}
+
static int queue_function_queuewaitingcount(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
{
@@ -4082,12 +4218,26 @@
};
static struct ast_custom_function queuemembercount_function = {
+ .name = "QUEUE_MEMBER",
+ .synopsis = "Count number of members answering a queue",
+ .syntax = "QUEUE_MEMBER(<queuename>, <option>)",
+ .desc =
+"Returns the number of members currently associated with the specified queue.\n"
+"One of three options may be passed to determine the count returned:\n"
+ "\"logged\" - Returns the number of logged-in members for the specified queue\n"
+ "\"free\" - Returns the number of logged-in members for the specified queue available to take a call\n"
+ "\"count\" - Returns the total number of members for the specified queue\n",
+ .read = queue_function_qac,
+};
+
+static struct ast_custom_function queuemembercount_dep = {
.name = "QUEUE_MEMBER_COUNT",
.synopsis = "Count number of members answering a queue",
.syntax = "QUEUE_MEMBER_COUNT(<queuename>)",
.desc =
-"Returns the number of members currently associated with the specified queue.\n",
- .read = queue_function_qac,
+"Returns the number of members currently associated with the specified queue.\n\n"
+"This function has been deprecated in favor of the QUEUE_MEMBER function\n",
+ .read = queue_function_qac_dep,
};
static struct ast_custom_function queuewaitingcount_function = {
@@ -4169,6 +4319,9 @@
update_cdr = 0;
if ((general_val = ast_variable_retrieve(cfg, "general", "updatecdr")))
update_cdr = ast_true(general_val);
+ shared_lastcall = 0;
+ if ((general_val = ast_variable_retrieve(cfg, "general", "shared_lastcall")))
+ shared_lastcall = ast_true(general_val);
} else { /* Define queue */
/* Look for an existing one */
ast_copy_string(tmpq.name, cat, sizeof(tmpq.name));
@@ -4181,6 +4334,7 @@
} else
new = 0;
if (q) {
+ const char *tmpvar;
if (!new)
ao2_lock(q);
/* Check if a queue with this name already exists */
@@ -4190,6 +4344,20 @@
ao2_unlock(q);
continue;
}
+ /* Due to the fact that the "linear" strategy will have a different allocation
+ * scheme for queue members, we must devise the queue's strategy before other initializations
+ */
+ if((tmpvar = ast_variable_retrieve(cfg, cat, "strategy"))) {
+ ast_log(LOG_DEBUG, "Success!!\n");
+ q->strategy = strat2int(tmpvar);
+ ast_log(LOG_DEBUG, "Queue strategy set to '%s'\n", int2strat(q->strategy));
+ if (q->strategy < 0) {
+ ast_log(LOG_WARNING, "'%s' isn't a valid strategy for queue '%s', using ringall instead\n",
+ tmpvar, q->name);
+ q->strategy = QUEUE_STRATEGY_RINGALL;
+ }
+ } else
+ q->strategy = QUEUE_STRATEGY_RINGALL;
/* Re-initialize the queue, and clear statistics */
init_queue(q);
if (!queue_keep_stats)
@@ -5004,10 +5172,10 @@
"Usage: queue unpause member <channel> in <queue> reason <reason>\n";
static struct ast_cli_entry cli_queue[] = {
- NEW_CLI(queue_show, "Show status of a specified queue"),
- NEW_CLI(handle_queue_add_member, "Add a channel to a specified queue"),
- NEW_CLI(handle_queue_remove_member, "Removes a channel from a specified queue"),
- NEW_CLI(handle_queue_pause_member, "Pause or unpause a queue member"),
+ AST_CLI_DEFINE(queue_show, "Show status of a specified queue"),
+ AST_CLI_DEFINE(handle_queue_add_member, "Add a channel to a specified queue"),
+ AST_CLI_DEFINE(handle_queue_remove_member, "Removes a channel from a specified queue"),
+ AST_CLI_DEFINE(handle_queue_pause_member, "Pause or unpause a queue member"),
};
static int unload_module(void)
@@ -5040,6 +5208,7 @@
res |= ast_unregister_application(app);
res |= ast_custom_function_unregister(&queuevar_function);
res |= ast_custom_function_unregister(&queuemembercount_function);
+ res |= ast_custom_function_unregister(&queuemembercount_dep);
res |= ast_custom_function_unregister(&queuememberlist_function);
res |= ast_custom_function_unregister(&queuewaitingcount_function);
@@ -5098,6 +5267,7 @@
res |= ast_manager_register("QueueLog", EVENT_FLAG_AGENT, manager_queue_log_custom, "Adds custom entry in queue_log");
res |= ast_custom_function_register(&queuevar_function);
res |= ast_custom_function_register(&queuemembercount_function);
+ res |= ast_custom_function_register(&queuemembercount_dep);
res |= ast_custom_function_register(&queuememberlist_function);
res |= ast_custom_function_register(&queuewaitingcount_function);
if (!(device_state_sub = ast_event_subscribe(AST_EVENT_DEVICE_STATE, device_state_cb, NULL, AST_EVENT_IE_END)))
Modified: team/russell/iax2_frame_queue/apps/app_record.c
URL: http://svn.digium.com/view/asterisk/team/russell/iax2_frame_queue/apps/app_record.c?view=diff&rev=87464&r1=87463&r2=87464
==============================================================================
--- team/russell/iax2_frame_queue/apps/app_record.c (original)
+++ team/russell/iax2_frame_queue/apps/app_record.c Mon Oct 29 17:13:46 2007
@@ -117,7 +117,7 @@
int ioflags;
int waitres;
struct ast_silence_generator *silgen = NULL;
- struct ast_flags flags;
+ struct ast_flags flags = { 0, };
AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(filename);
AST_APP_ARG(silence);
Modified: team/russell/iax2_frame_queue/apps/app_rpt.c
URL: http://svn.digium.com/view/asterisk/team/russell/iax2_frame_queue/apps/app_rpt.c?view=diff&rev=87464&r1=87463&r2=87464
==============================================================================
--- team/russell/iax2_frame_queue/apps/app_rpt.c (original)
+++ team/russell/iax2_frame_queue/apps/app_rpt.c Mon Oct 29 17:13:46 2007
@@ -706,12 +706,12 @@
static char *handle_cli_rpt_restart(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a);
static struct ast_cli_entry cli_rpt[] = {
- NEW_CLI(handle_cli_rpt_debug_level, "Enable app_rpt debuggin"),
- NEW_CLI(handle_cli_rpt_dump, "Dump app_rpt structs for debugging"),
- NEW_CLI(handle_cli_rpt_stats, "Dump node statistics"),
- NEW_CLI(handle_cli_rpt_lstats, "Dump link statistics"),
- NEW_CLI(handle_cli_rpt_reload, "Reload app_rpt config"),
- NEW_CLI(handle_cli_rpt_restart, "Restart app_rpt")
+ AST_CLI_DEFINE(handle_cli_rpt_debug_level, "Enable app_rpt debuggin"),
+ AST_CLI_DEFINE(handle_cli_rpt_dump, "Dump app_rpt structs for debugging"),
+ AST_CLI_DEFINE(handle_cli_rpt_stats, "Dump node statistics"),
+ AST_CLI_DEFINE(handle_cli_rpt_lstats, "Dump link statistics"),
+ AST_CLI_DEFINE(handle_cli_rpt_reload, "Reload app_rpt config"),
+ AST_CLI_DEFINE(handle_cli_rpt_restart, "Restart app_rpt")
};
/*
Modified: team/russell/iax2_frame_queue/apps/app_voicemail.c
URL: http://svn.digium.com/view/asterisk/team/russell/iax2_frame_queue/apps/app_voicemail.c?view=diff&rev=87464&r1=87463&r2=87464
==============================================================================
--- team/russell/iax2_frame_queue/apps/app_voicemail.c (original)
+++ team/russell/iax2_frame_queue/apps/app_voicemail.c Mon Oct 29 17:13:46 2007
@@ -69,7 +69,6 @@
#include <errno.h>
#include <unistd.h>
#include <string.h>
-#include <stdlib.h>
#include <stdio.h>
#include <sys/time.h>
#include <sys/stat.h>
@@ -7735,8 +7734,8 @@
}
static struct ast_cli_entry cli_voicemail[] = {
- NEW_CLI(handle_voicemail_show_users, "List defined voicemail boxes"),
- NEW_CLI(handle_voicemail_show_zones, "List zone message formats"),
+ AST_CLI_DEFINE(handle_voicemail_show_users, "List defined voicemail boxes"),
+ AST_CLI_DEFINE(handle_voicemail_show_zones, "List zone message formats"),
};
static void poll_subscribed_mailboxes(void)
@@ -9383,8 +9382,8 @@
memset(buf, 0, len);
ast_copy_string(buf, start+taglen, len);
- eol_pnt = strchr(buf,'\n');
- *eol_pnt = '\0';
+ if ((eol_pnt = strchr(buf,'\r')) || (eol_pnt = strchr(buf,'\n')))
+ *eol_pnt = '\0';
return buf;
}
Modified: team/russell/iax2_frame_queue/channels/chan_agent.c
URL: http://svn.digium.com/view/asterisk/team/russell/iax2_frame_queue/channels/chan_agent.c?view=diff&rev=87464&r1=87463&r2=87464
==============================================================================
--- team/russell/iax2_frame_queue/channels/chan_agent.c (original)
+++ team/russell/iax2_frame_queue/channels/chan_agent.c Mon Oct 29 17:13:46 2007
@@ -1765,9 +1765,9 @@
" If 'soft' is specified, do not hangup existing calls.\n";
static struct ast_cli_entry cli_agents[] = {
- NEW_CLI(agents_show, "Show status of agents"),
- NEW_CLI(agents_show_online, "Show all online agents"),
- NEW_CLI(agent_logoff_cmd, "Sets an agent offline"),
+ AST_CLI_DEFINE(agents_show, "Show status of agents"),
+ AST_CLI_DEFINE(agents_show_online, "Show all online agents"),
+ AST_CLI_DEFINE(agent_logoff_cmd, "Sets an agent offline"),
};
/*!
@@ -2339,7 +2339,7 @@
/* Make sure we can register our agent channel type */
if (ast_channel_register(&agent_tech)) {
[... 14735 lines stripped ...]
More information about the svn-commits
mailing list