[asterisk-commits] oej: branch oej/pine-multiple-externip-trunk r379600 - in /team/oej/pine-mult...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Sun Jan 20 01:41:53 CST 2013
Author: oej
Date: Sun Jan 20 01:41:37 2013
New Revision: 379600
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=379600
Log:
Update to latest trunk and enable autmerge again
Added:
team/oej/pine-multiple-externip-trunk/include/asterisk/json.h
- copied unchanged from r379583, trunk/include/asterisk/json.h
team/oej/pine-multiple-externip-trunk/include/asterisk/threadpool.h
- copied unchanged from r379583, trunk/include/asterisk/threadpool.h
team/oej/pine-multiple-externip-trunk/main/threadpool.c
- copied unchanged from r379583, trunk/main/threadpool.c
team/oej/pine-multiple-externip-trunk/res/res_json.c
- copied unchanged from r379583, trunk/res/res_json.c
team/oej/pine-multiple-externip-trunk/res/res_json.exports.in
- copied unchanged from r379583, trunk/res/res_json.exports.in
team/oej/pine-multiple-externip-trunk/tests/test_json.c
- copied unchanged from r379583, trunk/tests/test_json.c
team/oej/pine-multiple-externip-trunk/tests/test_taskprocessor.c
- copied unchanged from r379583, trunk/tests/test_taskprocessor.c
team/oej/pine-multiple-externip-trunk/tests/test_threadpool.c
- copied unchanged from r379583, trunk/tests/test_threadpool.c
team/oej/pine-multiple-externip-trunk/tests/test_xml_escape.c
- copied unchanged from r379583, trunk/tests/test_xml_escape.c
Modified:
team/oej/pine-multiple-externip-trunk/ (props changed)
team/oej/pine-multiple-externip-trunk/CHANGES
team/oej/pine-multiple-externip-trunk/Makefile
team/oej/pine-multiple-externip-trunk/UPGRADE-11.txt
team/oej/pine-multiple-externip-trunk/UPGRADE.txt
team/oej/pine-multiple-externip-trunk/addons/app_mysql.c
team/oej/pine-multiple-externip-trunk/addons/chan_mobile.c
team/oej/pine-multiple-externip-trunk/apps/app_confbridge.c
team/oej/pine-multiple-externip-trunk/apps/app_directory.c
team/oej/pine-multiple-externip-trunk/apps/app_meetme.c
team/oej/pine-multiple-externip-trunk/apps/app_queue.c
team/oej/pine-multiple-externip-trunk/apps/app_voicemail.c
team/oej/pine-multiple-externip-trunk/apps/confbridge/conf_state_empty.c
team/oej/pine-multiple-externip-trunk/bridges/bridge_multiplexed.c
team/oej/pine-multiple-externip-trunk/bridges/bridge_simple.c
team/oej/pine-multiple-externip-trunk/bridges/bridge_softmix.c
team/oej/pine-multiple-externip-trunk/build_tools/menuselect-deps.in
team/oej/pine-multiple-externip-trunk/channels/chan_agent.c
team/oej/pine-multiple-externip-trunk/channels/chan_dahdi.c
team/oej/pine-multiple-externip-trunk/channels/chan_iax2.c
team/oej/pine-multiple-externip-trunk/channels/chan_local.c
team/oej/pine-multiple-externip-trunk/channels/chan_misdn.c
team/oej/pine-multiple-externip-trunk/channels/chan_sip.c
team/oej/pine-multiple-externip-trunk/channels/chan_skinny.c
team/oej/pine-multiple-externip-trunk/channels/sip/include/reqresp_parser.h
team/oej/pine-multiple-externip-trunk/channels/sip/include/sip.h
team/oej/pine-multiple-externip-trunk/channels/sip/reqresp_parser.c
team/oej/pine-multiple-externip-trunk/configs/queues.conf.sample
team/oej/pine-multiple-externip-trunk/configs/voicemail.conf.sample
team/oej/pine-multiple-externip-trunk/configure
team/oej/pine-multiple-externip-trunk/configure.ac
team/oej/pine-multiple-externip-trunk/contrib/realtime/mysql/voicemail.sql
team/oej/pine-multiple-externip-trunk/contrib/scripts/install_prereq
team/oej/pine-multiple-externip-trunk/doc/appdocsxml.dtd
team/oej/pine-multiple-externip-trunk/funcs/func_devstate.c
team/oej/pine-multiple-externip-trunk/funcs/func_realtime.c
team/oej/pine-multiple-externip-trunk/include/asterisk/autoconfig.h.in
team/oej/pine-multiple-externip-trunk/include/asterisk/bridging_features.h
team/oej/pine-multiple-externip-trunk/include/asterisk/causes.h
team/oej/pine-multiple-externip-trunk/include/asterisk/channel.h
team/oej/pine-multiple-externip-trunk/include/asterisk/compat.h
team/oej/pine-multiple-externip-trunk/include/asterisk/devicestate.h
team/oej/pine-multiple-externip-trunk/include/asterisk/event_defs.h
team/oej/pine-multiple-externip-trunk/include/asterisk/manager.h
team/oej/pine-multiple-externip-trunk/include/asterisk/strings.h
team/oej/pine-multiple-externip-trunk/include/asterisk/taskprocessor.h
team/oej/pine-multiple-externip-trunk/include/asterisk/test.h
team/oej/pine-multiple-externip-trunk/include/asterisk/utils.h
team/oej/pine-multiple-externip-trunk/main/Makefile
team/oej/pine-multiple-externip-trunk/main/asterisk.c
team/oej/pine-multiple-externip-trunk/main/bridging.c
team/oej/pine-multiple-externip-trunk/main/ccss.c
team/oej/pine-multiple-externip-trunk/main/channel.c
team/oej/pine-multiple-externip-trunk/main/channel_internal_api.c
team/oej/pine-multiple-externip-trunk/main/config.c
team/oej/pine-multiple-externip-trunk/main/devicestate.c
team/oej/pine-multiple-externip-trunk/main/event.c
team/oej/pine-multiple-externip-trunk/main/features.c
team/oej/pine-multiple-externip-trunk/main/http.c
team/oej/pine-multiple-externip-trunk/main/loader.c
team/oej/pine-multiple-externip-trunk/main/logger.c
team/oej/pine-multiple-externip-trunk/main/manager.c
team/oej/pine-multiple-externip-trunk/main/rtp_engine.c
team/oej/pine-multiple-externip-trunk/main/strcompat.c
team/oej/pine-multiple-externip-trunk/main/taskprocessor.c
team/oej/pine-multiple-externip-trunk/main/test.c
team/oej/pine-multiple-externip-trunk/main/udptl.c
team/oej/pine-multiple-externip-trunk/main/utils.c
team/oej/pine-multiple-externip-trunk/makeopts.in
team/oej/pine-multiple-externip-trunk/res/pjproject/aconfigure
team/oej/pine-multiple-externip-trunk/res/pjproject/aconfigure.ac
team/oej/pine-multiple-externip-trunk/res/pjproject/build/common.mak
team/oej/pine-multiple-externip-trunk/res/res_calendar.c
team/oej/pine-multiple-externip-trunk/res/res_config_ldap.c
team/oej/pine-multiple-externip-trunk/res/res_jabber.c
team/oej/pine-multiple-externip-trunk/res/res_rtp_asterisk.c
team/oej/pine-multiple-externip-trunk/res/res_srtp.c
team/oej/pine-multiple-externip-trunk/res/res_xmpp.c
Propchange: team/oej/pine-multiple-externip-trunk/
------------------------------------------------------------------------------
automerge = Is-there-life-off-net?
Propchange: team/oej/pine-multiple-externip-trunk/
('branch-11-blocked' removed)
Propchange: team/oej/pine-multiple-externip-trunk/
('branch-11-merged' removed)
Propchange: team/oej/pine-multiple-externip-trunk/
------------------------------------------------------------------------------
svn:mergeinfo = /team/mmichelson/threadpool:376024-379375
Propchange: team/oej/pine-multiple-externip-trunk/
------------------------------------------------------------------------------
--- svnmerge-integrated (original)
+++ svnmerge-integrated Sun Jan 20 01:41:37 2013
@@ -1,1 +1,1 @@
-/trunk:1-378018
+/trunk:1-379597
Modified: team/oej/pine-multiple-externip-trunk/CHANGES
URL: http://svnview.digium.com/svn/asterisk/team/oej/pine-multiple-externip-trunk/CHANGES?view=diff&rev=379600&r1=379599&r2=379600
==============================================================================
--- team/oej/pine-multiple-externip-trunk/CHANGES (original)
+++ team/oej/pine-multiple-externip-trunk/CHANGES Sun Jan 20 01:41:37 2013
@@ -11,6 +11,7 @@
--- Functionality changes from Asterisk 11 to Asterisk 12 --------------------
------------------------------------------------------------------------------
+
AMI (Asterisk Manager Interface)
------------------
* The SIPshowpeer action will now include a 'SubscribeContext' field for a peer
@@ -30,6 +31,26 @@
than 15 characters and no longer shows authorization requirement for commands.
'Manager Show Command' now displays the privileges needed for using a given
manager command instead.
+
+Channel Drivers
+------------------
+
+chan_mobile
+------------------
+ * Added general support for busy detection.
+
+ * Added ECAM command support for Sony Ericsson phones.
+
+
+Features
+-------------------
+ * The BRIDGE_FEATURES channel variable would previously only set features for
+ the calling party and would set this feature regardless of whether the
+ feature was in caps or in lowercase. Use of a caps feature for a letter
+ will now apply the feature to the calling party while use of a lowercase
+ letter will apply that feature to the called party.
+
+ * Add support for automixmonitor to the BRIDGE_FEATURES channel variable.
Logging
-------------------
@@ -939,8 +960,6 @@
* Added member option ignorebusy this when set and ringinuse is not
will allow per member control of multiple calls as ringinuse does for
the Queue.
- * Added global option check_state_unknown to enforce checking of device state
- when the device state is unknown app_queue will see unknown as available.
Applications
------------
Modified: team/oej/pine-multiple-externip-trunk/Makefile
URL: http://svnview.digium.com/svn/asterisk/team/oej/pine-multiple-externip-trunk/Makefile?view=diff&rev=379600&r1=379599&r2=379600
==============================================================================
--- team/oej/pine-multiple-externip-trunk/Makefile (original)
+++ team/oej/pine-multiple-externip-trunk/Makefile Sun Jan 20 01:41:37 2013
@@ -252,10 +252,8 @@
ifneq ($(findstring darwin,$(OSARCH)),)
_ASTCFLAGS+=-D__Darwin__
- _SOLINK=-Xlinker -macosx_version_min -Xlinker 10.4 -Xlinker -undefined -Xlinker dynamic_lookup -force_flat_namespace
- ifeq ($(shell if test `/usr/bin/sw_vers -productVersion | cut -c4` -gt 5; then echo 6; else echo 0; fi),6)
- _SOLINK+=/usr/lib/bundle1.o
- endif
+ _SOLINK=-Xlinker -macosx_version_min -Xlinker 10.6 -Xlinker -undefined -Xlinker dynamic_lookup
+ _SOLINK+=/usr/lib/bundle1.o
SOLINK=-bundle $(_SOLINK)
DYLINK=-Xlinker -dylib $(_SOLINK)
_ASTLDFLAGS+=-L/usr/local/lib
@@ -267,6 +265,9 @@
_ASTLDFLAGS+=-L/usr/local/lib
endif
endif
+
+# Include rpath settings
+_ASTLDFLAGS+=$(AST_RPATH)
ifeq ($(OSARCH),SunOS)
SOLINK=-shared -fpic -L/usr/local/ssl/lib -lrt
Modified: team/oej/pine-multiple-externip-trunk/UPGRADE-11.txt
URL: http://svnview.digium.com/svn/asterisk/team/oej/pine-multiple-externip-trunk/UPGRADE-11.txt?view=diff&rev=379600&r1=379599&r2=379600
==============================================================================
--- team/oej/pine-multiple-externip-trunk/UPGRADE-11.txt (original)
+++ team/oej/pine-multiple-externip-trunk/UPGRADE-11.txt Sun Jan 20 01:41:37 2013
@@ -19,6 +19,14 @@
=== UPGRADE-10.txt -- Upgrade info for 1.8 to 10
===
===========================================================
+
+From 11.2 to 11.3:
+
+* Now by default, when Asterisk is installed in a path other than /usr, the
+ Asterisk binary will search for shared libraries in ${libdir} in addition to
+ searching system libraries. This allows Asterisk to find its shared
+ libraries without having to specify LD_LIBRARY_PATH. This can be disabled by
+ passing --disable-rpath to configure.
From 10 to 11:
Modified: team/oej/pine-multiple-externip-trunk/UPGRADE.txt
URL: http://svnview.digium.com/svn/asterisk/team/oej/pine-multiple-externip-trunk/UPGRADE.txt?view=diff&rev=379600&r1=379599&r2=379600
==============================================================================
--- team/oej/pine-multiple-externip-trunk/UPGRADE.txt (original)
+++ team/oej/pine-multiple-externip-trunk/UPGRADE.txt Sun Jan 20 01:41:37 2013
@@ -21,12 +21,22 @@
===
===========================================================
-From 11 to 12:
AMI:
- The SIP SIPqualifypeer action now sends a response indicating it will qualify
a peer once a peer has been found to qualify. Once the qualify has been
completed it will now issue a SIPqualifypeerdone event.
+ - Version 1.4 - The details of what happens to a channel when a masquerade
+ happens (transfers, parking, etc) have changed.
+ - The Masquerade event now includes the Uniqueid's of the clone and original
+ channels.
+ - Channels no longer swap Uniqueid's as a result of the masquerade.
+ - Instead of a shell game of renames, there's now a single rename, appending
+ <ZOMBIE> to the name of the original channel.
+
+CEL:
+ - The Uniqueid field for a channel is now a stable identifier, and will not
+ change due to transfers, parking, etc.
Queues:
- Queue logging for PAUSEALL/UNPAUSEALL now only occurs if the interface this is
@@ -38,6 +48,8 @@
now only record a disposition of BUSY if all Queue members were actually
busy on a call or some Queue members were busy or paused. Previously, any
Queue member being paused would result in a disposition of BUSY.
+ - Removed the queues.conf check_state_unknown option. It is no longer
+ necessary.
Dial:
- Now recognizes 'W' to pause sending DTMF for one second in addition to
@@ -64,6 +76,9 @@
- Asterisk has always had code to ignore dash '-' characters that are not
part of a character set in the dialplan extensions. The code now
consistently ignores these characters when matching dialplan extensions.
+ - BRIDGE_FEATURES channel variable is now casesensitive for feature letter codes.
+ Uppercase variants apply them to the calling party while lowercase variants
+ apply them to the called party.
From 10 to 11:
Modified: team/oej/pine-multiple-externip-trunk/addons/app_mysql.c
URL: http://svnview.digium.com/svn/asterisk/team/oej/pine-multiple-externip-trunk/addons/app_mysql.c?view=diff&rev=379600&r1=379599&r2=379600
==============================================================================
--- team/oej/pine-multiple-externip-trunk/addons/app_mysql.c (original)
+++ team/oej/pine-multiple-externip-trunk/addons/app_mysql.c Sun Jan 20 01:41:37 2013
@@ -292,16 +292,17 @@
return res;
}
-static int aMYSQL_set(struct ast_channel *chan, char *data)
-{
- char *var, *tmp;
+static int aMYSQL_set(struct ast_channel *chan, const char *data)
+{
+ char *var, *tmp, *parse;
AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(set);
AST_APP_ARG(variable);
AST_APP_ARG(value);
);
- AST_NONSTANDARD_APP_ARGS(args, data, ' ');
+ parse = ast_strdupa(data);
+ AST_NONSTANDARD_APP_ARGS(args, parse, ' ');
if (args.argc == 3) {
var = ast_alloca(6 + strlen(args.variable) + 1);
@@ -317,7 +318,7 @@
}
/* MYSQL operations */
-static int aMYSQL_connect(struct ast_channel *chan, char *data)
+static int aMYSQL_connect(struct ast_channel *chan, const char *data)
{
AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(connect);
@@ -333,8 +334,9 @@
const char *ctimeout;
unsigned int port = 0;
char *port_str;
-
- AST_NONSTANDARD_APP_ARGS(args, data, ' ');
+ char *parse = ast_strdupa(data);
+
+ AST_NONSTANDARD_APP_ARGS(args, parse, ' ');
if (args.argc < 6) {
ast_log(LOG_WARNING, "MYSQL_connect is missing some arguments\n");
@@ -385,7 +387,7 @@
return 0;
}
-static int aMYSQL_query(struct ast_channel *chan, char *data)
+static int aMYSQL_query(struct ast_channel *chan, const char *data)
{
AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(query);
@@ -397,8 +399,9 @@
MYSQL_RES *mysqlres;
int connid;
int mysql_query_res;
-
- AST_NONSTANDARD_APP_ARGS(args, data, ' ');
+ char *parse = ast_strdupa(data);
+
+ AST_NONSTANDARD_APP_ARGS(args, parse, ' ');
if (args.argc != 4 || (connid = atoi(args.connid)) == 0) {
ast_log(LOG_WARNING, "missing some arguments\n");
@@ -426,7 +429,7 @@
return -1;
}
-static int aMYSQL_nextresult(struct ast_channel *chan, char *data)
+static int aMYSQL_nextresult(struct ast_channel *chan, const char *data)
{
MYSQL *mysql;
MYSQL_RES *mysqlres;
@@ -436,8 +439,9 @@
AST_APP_ARG(connid);
);
int connid = -1;
-
- AST_NONSTANDARD_APP_ARGS(args, data, ' ');
+ char *parse = ast_strdupa(data);
+
+ AST_NONSTANDARD_APP_ARGS(args, parse, ' ');
sscanf(args.connid, "%30d", &connid);
if (args.argc != 3 || connid <= 0) {
@@ -466,7 +470,7 @@
}
-static int aMYSQL_fetch(struct ast_channel *chan, char *data)
+static int aMYSQL_fetch(struct ast_channel *chan, const char *data)
{
MYSQL_RES *mysqlres;
MYSQL_ROW mysqlrow;
@@ -518,13 +522,14 @@
return -1;
}
-static int aMYSQL_clear(struct ast_channel *chan, char *data)
+static int aMYSQL_clear(struct ast_channel *chan, const char *data)
{
MYSQL_RES *mysqlres;
int id;
- strsep(&data, " "); /* eat the first token, we already know it :P */
- id = safe_scan_int(&data, " \n", -1);
+ char *parse = ast_strdupa(data);
+ strsep(&parse, " "); /* eat the first token, we already know it :P */
+ id = safe_scan_int(&parse, " \n", -1);
if ((mysqlres = find_identifier(id, AST_MYSQL_ID_RESID)) == NULL) {
ast_log(LOG_WARNING, "Invalid result identifier %d passed in aMYSQL_clear\n", id);
} else {
@@ -535,13 +540,14 @@
return 0;
}
-static int aMYSQL_disconnect(struct ast_channel *chan, char *data)
+static int aMYSQL_disconnect(struct ast_channel *chan, const char *data)
{
MYSQL *mysql;
int id;
- strsep(&data, " "); /* eat the first token, we already know it :P */
-
- id = safe_scan_int(&data, " \n", -1);
+ char *parse = ast_strdupa(data);
+ strsep(&parse, " "); /* eat the first token, we already know it :P */
+
+ id = safe_scan_int(&parse, " \n", -1);
if ((mysql = find_identifier(id, AST_MYSQL_ID_CONNID)) == NULL) {
ast_log(LOG_WARNING, "Invalid connection identifier %d passed in aMYSQL_disconnect\n", id);
} else {
@@ -584,19 +590,19 @@
ast_mutex_lock(&_mysql_mutex);
if (strncasecmp("connect", data, strlen("connect")) == 0) {
- result = aMYSQL_connect(chan, ast_strdupa(data));
+ result = aMYSQL_connect(chan, data);
} else if (strncasecmp("query", data, strlen("query")) == 0) {
- result = aMYSQL_query(chan, ast_strdupa(data));
+ result = aMYSQL_query(chan, data);
} else if (strncasecmp("nextresult", data, strlen("nextresult")) == 0) {
- result = aMYSQL_nextresult(chan, ast_strdupa(data));
+ result = aMYSQL_nextresult(chan, data);
} else if (strncasecmp("fetch", data, strlen("fetch")) == 0) {
- result = aMYSQL_fetch(chan, ast_strdupa(data));
+ result = aMYSQL_fetch(chan, data);
} else if (strncasecmp("clear", data, strlen("clear")) == 0) {
- result = aMYSQL_clear(chan, ast_strdupa(data));
+ result = aMYSQL_clear(chan, data);
} else if (strncasecmp("disconnect", data, strlen("disconnect")) == 0) {
- result = aMYSQL_disconnect(chan, ast_strdupa(data));
+ result = aMYSQL_disconnect(chan, data);
} else if (strncasecmp("set", data, 3) == 0) {
- result = aMYSQL_set(chan, ast_strdupa(data));
+ result = aMYSQL_set(chan, data);
} else {
ast_log(LOG_WARNING, "Unknown argument to MYSQL application : %s\n", data);
result = -1;
Modified: team/oej/pine-multiple-externip-trunk/addons/chan_mobile.c
URL: http://svnview.digium.com/svn/asterisk/team/oej/pine-multiple-externip-trunk/addons/chan_mobile.c?view=diff&rev=379600&r1=379599&r2=379600
==============================================================================
--- team/oej/pine-multiple-externip-trunk/addons/chan_mobile.c (original)
+++ team/oej/pine-multiple-externip-trunk/addons/chan_mobile.c Sun Jan 20 01:41:37 2013
@@ -147,6 +147,7 @@
int ring_sched_id;
struct ast_dsp *dsp;
struct ast_sched_context *sched;
+ int hangupcause;
/* flags */
unsigned int outgoing:1; /*!< outgoing call */
@@ -172,6 +173,9 @@
static int handle_response_cmti(struct mbl_pvt *pvt, char *buf);
static int handle_response_cmgr(struct mbl_pvt *pvt, char *buf);
static int handle_response_cusd(struct mbl_pvt *pvt, char *buf);
+static int handle_response_busy(struct mbl_pvt *pvt);
+static int handle_response_no_dialtone(struct mbl_pvt *pvt, char *buf);
+static int handle_response_no_carrier(struct mbl_pvt *pvt, char *buf);
static int handle_sms_prompt(struct mbl_pvt *pvt, char *buf);
/* CLI stuff */
@@ -341,6 +345,7 @@
struct hfp_cind cind_map; /*!< the cind name to index mapping for this AG */
int rsock; /*!< our rfcomm socket */
int rport; /*!< our rfcomm port */
+ int sent_alerting; /*!< have we sent alerting? */
};
@@ -435,6 +440,10 @@
AT_CMER,
AT_CIND_TEST,
AT_CUSD,
+ AT_BUSY,
+ AT_NO_DIALTONE,
+ AT_NO_CARRIER,
+ AT_ECAM,
} at_message_t;
static int at_match_prefix(char *buf, char *prefix);
@@ -981,6 +990,7 @@
ast_log(LOG_ERROR, "error sending ATD command on %s\n", pvt->id);
return -1;
}
+ pvt->hangupcause = 0;
pvt->needchup = 1;
msg_queue_push(pvt, AT_OK, AT_D);
} else {
@@ -1314,6 +1324,9 @@
if (ast_channel_trylock(pvt->owner)) {
DEADLOCK_AVOIDANCE(&pvt->lock);
} else {
+ if (pvt->hangupcause != 0) {
+ ast_channel_hangupcause_set(pvt->owner, pvt->hangupcause);
+ }
ast_queue_hangup(pvt->owner);
ast_channel_unlock(pvt->owner);
break;
@@ -1376,7 +1389,7 @@
memset(&addr, 0, sizeof(addr));
addr.rc_family = AF_BLUETOOTH;
bacpy(&addr.rc_bdaddr, &src);
- addr.rc_channel = (uint8_t) 1;
+ addr.rc_channel = (uint8_t) 0;
if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
ast_debug(1, "bind() failed (%d).\n", errno);
close(s);
@@ -2030,6 +2043,14 @@
return AT_VGS;
} else if (at_match_prefix(buf, "+CUSD:")) {
return AT_CUSD;
+ } else if (at_match_prefix(buf, "BUSY")) {
+ return AT_BUSY;
+ } else if (at_match_prefix(buf, "NO DIALTONE")) {
+ return AT_NO_DIALTONE;
+ } else if (at_match_prefix(buf, "NO CARRIER")) {
+ return AT_NO_CARRIER;
+ } else if (at_match_prefix(buf, "*ECAV:")) {
+ return AT_ECAM;
} else {
return AT_UNKNOWN;
}
@@ -2074,6 +2095,12 @@
return "SMS PROMPT";
case AT_CMS_ERROR:
return "+CMS ERROR";
+ case AT_BUSY:
+ return "BUSY";
+ case AT_NO_DIALTONE:
+ return "NO DIALTONE";
+ case AT_NO_CARRIER:
+ return "NO CARRIER";
/* at commands */
case AT_A:
return "ATA";
@@ -2101,6 +2128,8 @@
return "AT+CIND=?";
case AT_CUSD:
return "AT+CUSD";
+ case AT_ECAM:
+ return "AT*ECAM";
}
}
@@ -2108,6 +2137,40 @@
/*
* bluetooth handsfree profile helpers
*/
+
+ /*!
+ * \brief Parse a ECAV event.
+ * \param hfp an hfp_pvt struct
+ * \param buf the buffer to parse (null terminated)
+ * \return -1 on error (parse error) or a ECAM value on success
+ *
+ * Example string: *ECAV: <ccid>,<ccstatus>,<calltype>[,<processid>]
+ * [,exitcause][,<number>,<type>]
+ *
+ * Example indicating busy: *ECAV: 1,7,1
+ */
+static int hfp_parse_ecav(struct hfp_pvt *hfp, char *buf)
+{
+ int ccid = 0;
+ int ccstatus = 0;
+ int calltype = 0;
+
+ if (!sscanf(buf, "*ECAV: %2d,%2d,%2d", &ccid, &ccstatus, &calltype)) {
+ ast_debug(1, "[%s] error parsing ECAV event '%s'\n", hfp->owner->id, buf);
+ return -1;
+ }
+
+ return ccstatus;
+}
+
+/*!
+ * \brief Enable Sony Erricson extensions / indications.
+ * \param hfp an hfp_pvt struct
+ */
+static int hfp_send_ecam(struct hfp_pvt *hfp)
+{
+ return rfcomm_write(hfp->rsock, "AT*ECAM=1\r");
+}
/*!
* \brief Parse a CIEV event.
@@ -2238,6 +2301,7 @@
if (buf[i] == '"') {
state++;
}
+ break;
case 2: /* mark the start of the number */
if (from_number) {
*from_number = &buf[i];
@@ -3214,6 +3278,14 @@
break;
case AT_CLIP:
ast_debug(1, "[%s] caling line indication enabled\n", pvt->id);
+ if (hfp_send_ecam(pvt->hfp) || msg_queue_push(pvt, AT_OK, AT_ECAM)) {
+ ast_debug(1, "[%s] error enabling Sony Ericsson call monitoring extensions\n", pvt->id);
+ goto e_return;
+ }
+
+ break;
+ case AT_ECAM:
+ ast_debug(1, "[%s] Sony Ericsson call monitoring is active on device\n", pvt->id);
if (hfp_send_vgs(pvt->hfp, 15) || msg_queue_push(pvt, AT_OK, AT_VGS)) {
ast_debug(1, "[%s] error synchronizing gain settings\n", pvt->id);
goto e_return;
@@ -3345,6 +3417,21 @@
ast_debug(1, "[%s] error setting CNMI\n", pvt->id);
ast_debug(1, "[%s] no SMS support\n", pvt->id);
break;
+ case AT_ECAM:
+ ast_debug(1, "[%s] Mobile does not support Sony Ericsson extensions\n", pvt->id);
+
+ /* this is not a fatal error, let's continue with the initialization */
+
+ if (hfp_send_vgs(pvt->hfp, 15) || msg_queue_push(pvt, AT_OK, AT_VGS)) {
+ ast_debug(1, "[%s] error synchronizing gain settings\n", pvt->id);
+ goto e_return;
+ }
+
+ pvt->timeout = -1;
+ pvt->hfp->initialized = 1;
+ ast_verb(3, "Bluetooth Device %s initialized and ready.\n", pvt->id);
+
+ break;
/* end initialization stuff */
case AT_A:
@@ -3440,6 +3527,9 @@
case HFP_CIND_CALLSETUP_NONE:
if (pvt->hfp->cind_state[pvt->hfp->cind_map.call] != HFP_CIND_CALL_ACTIVE) {
if (pvt->owner) {
+ if (pvt->hfp->sent_alerting == 1) {
+ handle_response_busy(pvt);
+ }
if (mbl_queue_hangup(pvt)) {
ast_log(LOG_ERROR, "[%s] error queueing hangup, disconnectiong...\n", pvt->id);
return -1;
@@ -3458,6 +3548,7 @@
break;
case HFP_CIND_CALLSETUP_OUTGOING:
if (pvt->outgoing) {
+ pvt->hfp->sent_alerting = 0;
ast_debug(1, "[%s] outgoing call\n", pvt->id);
} else {
ast_verb(3, "[%s] user dialed from handset, disconnecting\n", pvt->id);
@@ -3468,6 +3559,7 @@
if (pvt->outgoing) {
ast_debug(1, "[%s] remote alerting\n", pvt->id);
mbl_queue_control(pvt, AST_CONTROL_RINGING);
+ pvt->hfp->sent_alerting = 1;
}
break;
}
@@ -3659,6 +3751,50 @@
ast_verb(0, "[%s] CUSD response: %s\n", pvt->id, cusd);
+ return 0;
+}
+
+/*!
+ * \brief Handle BUSY messages.
+ * \param pvt a mbl_pvt structure
+ * \retval 0 success
+ * \retval -1 error
+ */
+static int handle_response_busy(struct mbl_pvt *pvt)
+{
+ pvt->hangupcause = AST_CAUSE_USER_BUSY;
+ pvt->needchup = 1;
+ mbl_queue_control(pvt, AST_CONTROL_BUSY);
+ return 0;
+}
+
+/*!
+ * \brief Handle NO DIALTONE messages.
+ * \param pvt a mbl_pvt structure
+ * \param buf a null terminated buffer containing an AT message
+ * \retval 0 success
+ * \retval -1 error
+ */
+static int handle_response_no_dialtone(struct mbl_pvt *pvt, char *buf)
+{
+ ast_verb(1, "[%s] mobile reports NO DIALTONE\n", pvt->id);
+ pvt->needchup = 1;
+ mbl_queue_control(pvt, AST_CONTROL_CONGESTION);
+ return 0;
+}
+
+/*!
+ * \brief Handle NO CARRIER messages.
+ * \param pvt a mbl_pvt structure
+ * \param buf a null terminated buffer containing an AT message
+ * \retval 0 success
+ * \retval -1 error
+ */
+static int handle_response_no_carrier(struct mbl_pvt *pvt, char *buf)
+{
+ ast_verb(1, "[%s] mobile reports NO CARRIER\n", pvt->id);
+ pvt->needchup = 1;
+ mbl_queue_control(pvt, AST_CONTROL_CONGESTION);
return 0;
}
@@ -3820,6 +3956,40 @@
}
ast_mutex_unlock(&pvt->lock);
break;
+ case AT_BUSY:
+ ast_mutex_lock(&pvt->lock);
+ if (handle_response_busy(pvt)) {
+ ast_mutex_unlock(&pvt->lock);
+ goto e_cleanup;
+ }
+ ast_mutex_unlock(&pvt->lock);
+ break;
+ case AT_NO_DIALTONE:
+ ast_mutex_lock(&pvt->lock);
+ if (handle_response_no_dialtone(pvt, buf)) {
+ ast_mutex_unlock(&pvt->lock);
+ goto e_cleanup;
+ }
+ ast_mutex_unlock(&pvt->lock);
+ break;
+ case AT_NO_CARRIER:
+ ast_mutex_lock(&pvt->lock);
+ if (handle_response_no_carrier(pvt, buf)) {
+ ast_mutex_unlock(&pvt->lock);
+ goto e_cleanup;
+ }
+ ast_mutex_unlock(&pvt->lock);
+ break;
+ case AT_ECAM:
+ ast_mutex_lock(&pvt->lock);
+ if (hfp_parse_ecav(hfp, buf) == 7) {
+ if (handle_response_busy(pvt)) {
+ ast_mutex_unlock(&pvt->lock);
+ goto e_cleanup;
+ }
+ }
+ ast_mutex_unlock(&pvt->lock);
+ break;
case AT_UNKNOWN:
ast_debug(1, "[%s] ignoring unknown message: %s\n", pvt->id, buf);
break;
Modified: team/oej/pine-multiple-externip-trunk/apps/app_confbridge.c
URL: http://svnview.digium.com/svn/asterisk/team/oej/pine-multiple-externip-trunk/apps/app_confbridge.c?view=diff&rev=379600&r1=379599&r2=379600
==============================================================================
--- team/oej/pine-multiple-externip-trunk/apps/app_confbridge.c (original)
+++ team/oej/pine-multiple-externip-trunk/apps/app_confbridge.c Sun Jan 20 01:41:37 2013
@@ -1043,7 +1043,7 @@
void conf_handle_first_join(struct conference_bridge *conference_bridge)
{
- ast_devstate_changed(AST_DEVICE_INUSE, "confbridge:%s", conference_bridge->name);
+ ast_devstate_changed(AST_DEVICE_INUSE, AST_DEVSTATE_CACHABLE, "confbridge:%s", conference_bridge->name);
}
void conf_handle_second_active(struct conference_bridge *conference_bridge)
@@ -2092,6 +2092,16 @@
return CLI_SUCCESS;
}
+static void handle_cli_confbridge_list_item(struct ast_cli_args *a, struct conference_bridge_user *participant)
+{
+ ast_cli(a->fd, "%-29s ", ast_channel_name(participant->chan));
+ ast_cli(a->fd, "%-17s", participant->u_profile.name);
+ ast_cli(a->fd, "%-17s", participant->b_profile.name);
+ ast_cli(a->fd, "%-17s", participant->menu_name);
+ ast_cli(a->fd, "%-17s", S_COR(ast_channel_caller(participant->chan)->id.number.valid, ast_channel_caller(participant->chan)->id.number.str, "<unknown>"));
+ ast_cli(a->fd, "\n");
+}
+
static char *handle_cli_confbridge_list(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
struct ao2_iterator i;
@@ -2118,7 +2128,7 @@
ast_cli(a->fd, "================================ ====== ====== ========\n");
i = ao2_iterator_init(conference_bridges, 0);
while ((bridge = ao2_iterator_next(&i))) {
- ast_cli(a->fd, "%-32s %6i %6i %s\n", bridge->name, bridge->activeusers, bridge->markedusers, (bridge->locked ? "locked" : "unlocked"));
+ ast_cli(a->fd, "%-32s %6i %6i %s\n", bridge->name, bridge->activeusers + bridge->waitingusers, bridge->markedusers, (bridge->locked ? "locked" : "unlocked"));
ao2_ref(bridge, -1);
}
ao2_iterator_destroy(&i);
@@ -2136,12 +2146,10 @@
ast_cli(a->fd, "============================= ================ ================ ================ ================\n");
ao2_lock(bridge);
AST_LIST_TRAVERSE(&bridge->active_list, participant, list) {
- ast_cli(a->fd, "%-29s ", ast_channel_name(participant->chan));
- ast_cli(a->fd, "%-17s", participant->u_profile.name);
- ast_cli(a->fd, "%-17s", participant->b_profile.name);
- ast_cli(a->fd, "%-17s", participant->menu_name);
- ast_cli(a->fd, "%-17s", S_COR(ast_channel_caller(participant->chan)->id.number.valid, ast_channel_caller(participant->chan)->id.number.str, "<unknown>"));
- ast_cli(a->fd, "\n");
+ handle_cli_confbridge_list_item(a, participant);
+ }
+ AST_LIST_TRAVERSE(&bridge->waiting_list, participant, list) {
+ handle_cli_confbridge_list_item(a, participant);
}
ao2_unlock(bridge);
ao2_ref(bridge, -1);
@@ -2440,6 +2448,27 @@
.read = func_confbridge_info,
};
+static void action_confbridgelist_item(struct mansession *s, const char *id_text, struct conference_bridge *bridge, struct conference_bridge_user *participant)
+{
+ astman_append(s,
+ "Event: ConfbridgeList\r\n"
+ "%s"
+ "Conference: %s\r\n"
+ "CallerIDNum: %s\r\n"
+ "CallerIDName: %s\r\n"
+ "Channel: %s\r\n"
+ "Admin: %s\r\n"
+ "MarkedUser: %s\r\n"
+ "\r\n",
+ id_text,
+ bridge->name,
+ S_COR(ast_channel_caller(participant->chan)->id.number.valid, ast_channel_caller(participant->chan)->id.number.str, "<unknown>"),
+ S_COR(ast_channel_caller(participant->chan)->id.name.valid, ast_channel_caller(participant->chan)->id.name.str, "<no name>"),
+ ast_channel_name(participant->chan),
+ ast_test_flag(&participant->u_profile, USER_OPT_ADMIN) ? "Yes" : "No",
+ ast_test_flag(&participant->u_profile, USER_OPT_MARKEDUSER) ? "Yes" : "No");
+}
+
static int action_confbridgelist(struct mansession *s, const struct message *m)
{
const char *actionid = astman_get_header(m, "ActionID");
@@ -2473,23 +2502,11 @@
ao2_lock(bridge);
AST_LIST_TRAVERSE(&bridge->active_list, participant, list) {
total++;
- astman_append(s,
- "Event: ConfbridgeList\r\n"
- "%s"
- "Conference: %s\r\n"
- "CallerIDNum: %s\r\n"
- "CallerIDName: %s\r\n"
- "Channel: %s\r\n"
- "Admin: %s\r\n"
- "MarkedUser: %s\r\n"
- "\r\n",
- id_text,
- bridge->name,
- S_COR(ast_channel_caller(participant->chan)->id.number.valid, ast_channel_caller(participant->chan)->id.number.str, "<unknown>"),
- S_COR(ast_channel_caller(participant->chan)->id.name.valid, ast_channel_caller(participant->chan)->id.name.str, "<no name>"),
- ast_channel_name(participant->chan),
- ast_test_flag(&participant->u_profile, USER_OPT_ADMIN) ? "Yes" : "No",
- ast_test_flag(&participant->u_profile, USER_OPT_MARKEDUSER) ? "Yes" : "No");
+ action_confbridgelist_item(s, id_text, bridge, participant);
+ }
+ AST_LIST_TRAVERSE(&bridge->waiting_list, participant, list) {
+ total++;
+ action_confbridgelist_item(s, id_text, bridge, participant);
}
ao2_unlock(bridge);
ao2_ref(bridge, -1);
@@ -2539,7 +2556,7 @@
"\r\n",
id_text,
bridge->name,
- bridge->activeusers,
+ bridge->activeusers + bridge->waitingusers,
bridge->markedusers,
bridge->locked ? "Yes" : "No");
ao2_unlock(bridge);
Modified: team/oej/pine-multiple-externip-trunk/apps/app_directory.c
URL: http://svnview.digium.com/svn/asterisk/team/oej/pine-multiple-externip-trunk/apps/app_directory.c?view=diff&rev=379600&r1=379599&r2=379600
==============================================================================
--- team/oej/pine-multiple-externip-trunk/apps/app_directory.c (original)
+++ team/oej/pine-multiple-externip-trunk/apps/app_directory.c Sun Jan 20 01:41:37 2013
@@ -87,6 +87,12 @@
argument will be used for the number of characters the user should enter.</para>
<argument name="n" required="true" />
</option>
+ <option name="a">
+ <para>Allow the caller to additionally enter an alias for a user in the
+ directory. This option must be specified in addition to the
+ <literal>f</literal>, <literal>l</literal>, or <literal>b</literal>
+ option.</para>
+ </option>
<option name="m">
<para>Instead of reading each name sequentially and asking for
confirmation, create a menu of up to 8 names.</para>
@@ -135,6 +141,7 @@
OPT_LISTBYEITHER = OPT_LISTBYFIRSTNAME | OPT_LISTBYLASTNAME,
OPT_PAUSE = (1 << 5),
OPT_NOANSWER = (1 << 6),
+ OPT_ALIAS = (1 << 7),
};
enum {
@@ -164,6 +171,7 @@
AST_APP_OPTION('v', OPT_FROMVOICEMAIL),
AST_APP_OPTION('m', OPT_SELECTFROMMENU),
AST_APP_OPTION('n', OPT_NOANSWER),
+ AST_APP_OPTION('a', OPT_ALIAS),
});
static int compare(const char *text, const char *template)
@@ -427,6 +435,8 @@
return 0;
}
+AST_THREADSTORAGE(commonbuf);
+
static struct ast_config *realtime_directory(char *context)
{
struct ast_config *cfg;
@@ -436,8 +446,12 @@
char *mailbox;
const char *fullname;
const char *hidefromdir, *searchcontexts = NULL;
- char tmp[100];
struct ast_flags config_flags = { 0 };
+ struct ast_str *tmp = ast_str_thread_get(&commonbuf, 100);
+
+ if (!tmp) {
+ return NULL;
+ }
/* Load flat file config. */
cfg = ast_config_load(VOICEMAIL_CONFIG, config_flags);
@@ -472,6 +486,7 @@
mailbox = NULL;
while ( (mailbox = ast_category_browse(rtdata, mailbox)) ) {
+ struct ast_variable *alias;
const char *ctx = ast_variable_retrieve(rtdata, mailbox, "context");
fullname = ast_variable_retrieve(rtdata, mailbox, "fullname");
@@ -480,7 +495,14 @@
/* Skip hidden */
continue;
}
- snprintf(tmp, sizeof(tmp), "no-password,%s", S_OR(fullname, ""));
+ ast_str_set(&tmp, 0, "no-password,%s", S_OR(fullname, ""));
+ if (ast_variable_retrieve(rtdata, mailbox, "alias")) {
+ for (alias = ast_variable_browse(rtdata, mailbox); alias; alias = alias->next) {
+ if (!strcasecmp(alias->name, "alias")) {
+ ast_str_append(&tmp, 0, "|alias=%s", alias->value);
+ }
+ }
+ }
/* Does the context exist within the config file? If not, make one */
if (!(cat = ast_category_get(cfg, ctx))) {
@@ -495,7 +517,7 @@
ast_category_append(cfg, cat);
}
- if ((var = ast_variable_new(mailbox, tmp, ""))) {
+ if ((var = ast_variable_new(mailbox, ast_str_buffer(tmp), ""))) {
ast_variable_append(cat, var);
} else {
ast_log(LOG_WARNING, "Out of memory adding mailbox '%s'\n", mailbox);
@@ -556,20 +578,26 @@
static int search_directory_sub(const char *context, struct ast_config *vmcfg, struct ast_config *ucfg, const char *ext, struct ast_flags flags, itemlist *alist)
{
struct ast_variable *v;
- char buf[AST_MAX_EXTENSION + 1], *pos, *bufptr, *cat;
+ struct ast_str *buf = ast_str_thread_get(&commonbuf, 100);
+ char *pos, *bufptr, *cat, *alias;
struct directory_item *item;
int res;
+ if (!buf) {
+ return -1;
+ }
+
ast_debug(2, "Pattern: %s\n", ext);
for (v = ast_variable_browse(vmcfg, context); v; v = v->next) {
/* Ignore hidden */
- if (strcasestr(v->value, "hidefromdir=yes"))
+ if (strcasestr(v->value, "hidefromdir=yes")) {
continue;
-
- ast_copy_string(buf, v->value, sizeof(buf));
- bufptr = buf;
+ }
+
+ ast_str_set(&buf, 0, "%s", v->value);
+ bufptr = ast_str_buffer(buf);
/* password,Full Name,email,pager,options */
strsep(&bufptr, ",");
@@ -587,11 +615,23 @@
if (!res && ast_test_flag(&flags, OPT_LISTBYFIRSTNAME)) {
res = check_match(&item, context, pos, v->name, ext, 1 /* use_first_name */);
}
-
- if (!res)
+ if (!res && ast_test_flag(&flags, OPT_ALIAS) && (alias = strcasestr(bufptr, "alias="))) {
+ char *a;
+ ast_debug(1, "Found alias: %s\n", alias);
+ while ((a = strsep(&alias, "|"))) {
+ if (!strncasecmp(a, "alias=", 6)) {
+ if ((res = check_match(&item, context, a + 6, v->name, ext, 1))) {
+ break;
+ }
+ }
+ }
+ }
+
+ if (!res) {
continue;
- else if (res < 0)
+ } else if (res < 0) {
return -1;
+ }
AST_LIST_INSERT_TAIL(alist, item, entry);
}
@@ -599,15 +639,18 @@
if (ucfg) {
for (cat = ast_category_browse(ucfg, NULL); cat ; cat = ast_category_browse(ucfg, cat)) {
const char *position;
- if (!strcasecmp(cat, "general"))
+
+ if (!strcasecmp(cat, "general")) {
continue;
- if (!ast_true(ast_config_option(ucfg, cat, "hasdirectory")))
+ }
+ if (!ast_true(ast_config_option(ucfg, cat, "hasdirectory"))) {
continue;
+ }
/* Find all candidate extensions */
- position = ast_variable_retrieve(ucfg, cat, "fullname");
- if (!position)
+ if (!(position = ast_variable_retrieve(ucfg, cat, "fullname"))) {
continue;
+ }
res = 0;
if (ast_test_flag(&flags, OPT_LISTBYLASTNAME)) {
@@ -616,11 +659,20 @@
if (!res && ast_test_flag(&flags, OPT_LISTBYFIRSTNAME)) {
res = check_match(&item, context, position, cat, ext, 1 /* use_first_name */);
}
-
- if (!res)
+ if (!res && ast_test_flag(&flags, OPT_ALIAS)) {
+ struct ast_variable *alias;
+ for (alias = ast_variable_browse(ucfg, cat); alias; alias = alias->next) {
+ if (!strcasecmp(v->name, "alias") && (res = check_match(&item, context, v->value, cat, ext, 1))) {
+ break;
+ }
+ }
+ }
+
+ if (!res) {
continue;
- else if (res < 0)
+ } else if (res < 0) {
return -1;
+ }
AST_LIST_INSERT_TAIL(alist, item, entry);
}
Modified: team/oej/pine-multiple-externip-trunk/apps/app_meetme.c
URL: http://svnview.digium.com/svn/asterisk/team/oej/pine-multiple-externip-trunk/apps/app_meetme.c?view=diff&rev=379600&r1=379599&r2=379600
==============================================================================
--- team/oej/pine-multiple-externip-trunk/apps/app_meetme.c (original)
+++ team/oej/pine-multiple-externip-trunk/apps/app_meetme.c Sun Jan 20 01:41:37 2013
@@ -2706,7 +2706,7 @@
/* This device changed state now - if this is the first user */
if (conf->users == 1)
- ast_devstate_changed(AST_DEVICE_INUSE, "meetme:%s", conf->confno);
+ ast_devstate_changed(AST_DEVICE_INUSE, (conf->isdynamic ? AST_DEVSTATE_NOT_CACHABLE : AST_DEVSTATE_CACHABLE), "meetme:%s", conf->confno);
ast_mutex_unlock(&conf->playlock);
@@ -4097,7 +4097,7 @@
[... 8869 lines stripped ...]
More information about the asterisk-commits
mailing list