diff --git a/build/Makefile.centos5 b/build/Makefile.centos5
index 79a2485986..cddd8f29ee 100644
--- a/build/Makefile.centos5
+++ b/build/Makefile.centos5
@@ -11,10 +11,10 @@ FSPREFIX=/usr/local/freeswitch
PREFIX=/usr/local/freeswitch
DOWNLOAD=http://files.freeswitch.org/downloads/libs
JPEG=v8d
-OPENSSL=1.0.1j
+OPENSSL=1.0.1l
SQLITE=autoconf-3080403
PCRE=8.35
-CURL=7.35.0
+CURL=7.40.0
SPEEX=1.2rc1
LIBEDIT=20140618-3.1
LDNS=1.6.17
@@ -76,7 +76,7 @@ curl: curl-$(CURL)/.done
curl-$(CURL)/.done: curl-$(CURL)
curl-$(CURL):
(test -d $@) || (wget -4 -O $@.tar.gz $(DOWNLOAD)/$@.tar.gz && tar zxfv $@.tar.gz)
- (cd $@ && ./configure --prefix=$(PREFIX) && make && sudo make install && touch .done)
+ (cd $@ && ./configure LDFLAGS='-L$(PREFIX)/lib -Wl,-rpath=$(PREFIX)/lib' CFLAGS='-I$(PREFIX)/include' --prefix=$(PREFIX) && make && sudo make install && touch .done)
speex: speex-$(SPEEX)/.done
speex-$(SPEEX)/.done: speex-$(SPEEX)
diff --git a/build/Makefile.centos6 b/build/Makefile.centos6
index f2b9ecab1c..582c3192da 100644
--- a/build/Makefile.centos6
+++ b/build/Makefile.centos6
@@ -7,7 +7,7 @@
#
#
RPMS=git gcc-c++ autoconf automake libtool wget python ncurses-devel zlib-devel libjpeg-devel openssl-devel e2fsprogs-devel sqlite-devel libcurl-devel pcre-devel speex-devel ldns-devel libedit-devel
-DEBS=git build-essential automake autoconf libtool wget python uuid-dev zlib1g-dev libjpeg-dev libncurses5-dev libssl-dev libpcre3-dev libcurl4-openssl-dev libldns-dev libedit-dev libspeexdsp-dev libspeexdsp-dev libsqlite3-dev perl libgdbm-dev libdb-dev bison libvlc-dev libtool-bin pkg-config
+DEBS=git build-essential automake autoconf 'libtool-bin|libtool' wget python uuid-dev zlib1g-dev 'libjpeg8-dev|libjpeg62-turbo-dev' libncurses5-dev libssl-dev libpcre3-dev libcurl4-openssl-dev libldns-dev libedit-dev libspeexdsp-dev libspeexdsp-dev libsqlite3-dev perl libgdbm-dev libdb-dev bison libvlc-dev pkg-config
freeswitch: deps has-git freeswitch.git/Makefile
cd freeswitch.git && make
diff --git a/conf/vanilla/autoload_configs/modules.conf.xml b/conf/vanilla/autoload_configs/modules.conf.xml
index 092372d68c..1940561ec0 100644
--- a/conf/vanilla/autoload_configs/modules.conf.xml
+++ b/conf/vanilla/autoload_configs/modules.conf.xml
@@ -110,7 +110,7 @@
-
+
diff --git a/debian/rules b/debian/rules
index 6bfd911f4d..d85cf4e8f8 100755
--- a/debian/rules
+++ b/debian/rules
@@ -63,7 +63,7 @@ override_dh_auto_clean:
.stamp-bootstrap:
@$(call show_vars)
- ./bootstrap.sh -j
+ [ -f ./bootstrap.sh ] && ./bootstrap.sh -j || ./rebootstrap.sh -j
touch $@
.stamp-configure: .stamp-bootstrap
diff --git a/libs/broadvoice/Makefile.am b/libs/broadvoice/Makefile.am
index a681b8d450..f99395399c 100644
--- a/libs/broadvoice/Makefile.am
+++ b/libs/broadvoice/Makefile.am
@@ -20,7 +20,6 @@
AM_CFLAGS = $(COMP_VENDOR_CFLAGS)
AM_LDFLAGS = $(COMP_VENDOR_LDFLAGS)
-AUTOMAKE_OPTIONS = subdir-objects
noinst_SCRIPTS = broadvoice.spec
diff --git a/libs/broadvoice/src/Makefile.am b/libs/broadvoice/src/Makefile.am
index c96590e472..9b197ba891 100644
--- a/libs/broadvoice/src/Makefile.am
+++ b/libs/broadvoice/src/Makefile.am
@@ -21,7 +21,6 @@
AM_CFLAGS = $(COMP_VENDOR_CFLAGS)
AM_LDFLAGS = $(COMP_VENDOR_LDFLAGS)
-AUTOMAKE_OPTIONS = subdir-objects
MAINTAINERCLEANFILES = Makefile.in
EXTRA_DIST = libbroadvoice.dsp \
diff --git a/libs/libcodec2/Makefile.am b/libs/libcodec2/Makefile.am
index 8c24f42fe4..1aa4a11879 100644
--- a/libs/libcodec2/Makefile.am
+++ b/libs/libcodec2/Makefile.am
@@ -1,5 +1,5 @@
AM_CFLAGS = -Isrc -fPIC -Wall -O3 -lm
-AUTOMAKE_OPTIONS = gnu subdir-objects
+AUTOMAKE_OPTIONS = gnu
NAME = codec2
AM_CPPFLAGS = $(AM_CFLAGS)
diff --git a/libs/libcodec2/src/Makefile.am b/libs/libcodec2/src/Makefile.am
index f06c42e0f6..1153b3ccbd 100644
--- a/libs/libcodec2/src/Makefile.am
+++ b/libs/libcodec2/src/Makefile.am
@@ -1,5 +1,5 @@
AM_CFLAGS = -I../src -fPIC -Wall -O3 -g
-AUTOMAKE_OPTIONS = gnu subdir-objects
+AUTOMAKE_OPTIONS = gnu
NAME = codec2
AM_CPPFLAGS = $(AM_CFLAGS)
diff --git a/libs/libcodec2/unittest/Makefile.am b/libs/libcodec2/unittest/Makefile.am
index e9a216d48e..a8f12a0c00 100644
--- a/libs/libcodec2/unittest/Makefile.am
+++ b/libs/libcodec2/unittest/Makefile.am
@@ -1,5 +1,5 @@
AM_CFLAGS = -I../src -I$(abs_srcdir)/../src -fPIC -g -DFLOATING_POINT -DVAR_ARRAYS -O2 -Wall
-AUTOMAKE_OPTIONS = gnu subdir-objects
+AUTOMAKE_OPTIONS = gnu
NAME = libcodec2
AM_CPPFLAGS = $(AM_CFLAGS)
diff --git a/libs/libdingaling/Makefile.am b/libs/libdingaling/Makefile.am
index 5da1715ef4..37bf42cb31 100644
--- a/libs/libdingaling/Makefile.am
+++ b/libs/libdingaling/Makefile.am
@@ -1,6 +1,6 @@
EXTRA_DIST =
SUBDIRS =
-AUTOMAKE_OPTIONS = foreign subdir-objects
+AUTOMAKE_OPTIONS = foreign
NAME=dingaling
PREFIX=$(prefix)
TOUCH_TARGET=@if test -f "$@" ; then touch "$@" ; fi ;
diff --git a/libs/silk/Makefile.am b/libs/silk/Makefile.am
index a410e96998..c1d88b3a55 100644
--- a/libs/silk/Makefile.am
+++ b/libs/silk/Makefile.am
@@ -1,5 +1,5 @@
AM_CFLAGS = -Isrc -I$(abs_srcdir)/src -Iinterface -I$(abs_srcdir)/interface -fPIC -O3
-AUTOMAKE_OPTIONS = gnu subdir-objects
+AUTOMAKE_OPTIONS = gnu
NAME = libSKP_SILK_SDK
AM_CPPFLAGS = $(AM_CFLAGS)
diff --git a/libs/sofia-sip/.update b/libs/sofia-sip/.update
index 3d6072b228..f5b42d453c 100644
--- a/libs/sofia-sip/.update
+++ b/libs/sofia-sip/.update
@@ -1 +1 @@
-Wed Jan 7 11:24:56 PST 2015
+Wed Feb 11 12:35:25 EST 2015
diff --git a/libs/sofia-sip/libsofia-sip-ua/tport/ws.c b/libs/sofia-sip/libsofia-sip-ua/tport/ws.c
index e990f7f815..8a46b65502 100644
--- a/libs/sofia-sip/libsofia-sip-ua/tport/ws.c
+++ b/libs/sofia-sip/libsofia-sip-ua/tport/ws.c
@@ -311,7 +311,7 @@ int ws_handshake(wsh_t *wsh)
proto_buf);
respond[511] = 0;
- if (ws_raw_write(wsh, respond, strlen(respond)) != strlen(respond)) {
+ if (ws_raw_write(wsh, respond, strlen(respond)) != (ssize_t)strlen(respond)) {
goto err;
}
@@ -406,7 +406,7 @@ ssize_t ws_raw_write(wsh_t *wsh, void *data, size_t bytes)
ssize_t r;
int sanity = 2000;
int ssl_err = 0;
- ssize_t wrote = 0;
+ size_t wrote = 0;
if (wsh->ssl) {
do {
diff --git a/libs/srtp/test/Makefile.am b/libs/srtp/test/Makefile.am
index 4af9005ac3..2651f2714f 100644
--- a/libs/srtp/test/Makefile.am
+++ b/libs/srtp/test/Makefile.am
@@ -1,4 +1,4 @@
-AUTOMAKE_OPTIONS = gnu subdir-objects
+AUTOMAKE_OPTIONS = gnu
AM_CFLAGS = $(new_AM_CFLAGS) -I$(top_srcdir)/include -I$(top_srcdir)/crypto/include
AM_CPPFLAGS = $(AM_CFLAGS)
AM_LDFLAGS = $(new_AM_LDFLAGS) -L$(srcdir) -lsrtp
diff --git a/libs/win32/sofia/libsofia_sip_ua_static.2012.vcxproj b/libs/win32/sofia/libsofia_sip_ua_static.2012.vcxproj
index bd8a68bd2c..5a9eea4f8c 100644
--- a/libs/win32/sofia/libsofia_sip_ua_static.2012.vcxproj
+++ b/libs/win32/sofia/libsofia_sip_ua_static.2012.vcxproj
@@ -87,7 +87,7 @@ if not exist "$(ProjectDir)$(IntDir)\auth_client.obj" "autogen.cmd"
Disabled
..\..\sofia-sip\win32;..\..\sofia-sip\libsofia-sip-ua\su;..\..\sofia-sip\libsofia-sip-ua\ipt;..\..\sofia-sip\libsofia-sip-ua\sresolv;..\..\sofia-sip\libsofia-sip-ua\bnf;..\..\sofia-sip\libsofia-sip-ua\url;..\..\sofia-sip\libsofia-sip-ua\msg;..\..\sofia-sip\libsofia-sip-ua\sip;..\..\sofia-sip\libsofia-sip-ua\nta;..\..\sofia-sip\libsofia-sip-ua\nua;..\..\sofia-sip\libsofia-sip-ua\iptsec;..\..\sofia-sip\libsofia-sip-ua\http;..\..\sofia-sip\libsofia-sip-ua\nth;..\..\sofia-sip\libsofia-sip-ua\nea;..\..\sofia-sip\libsofia-sip-ua\sdp;..\..\sofia-sip\libsofia-sip-ua\soa;..\..\sofia-sip\libsofia-sip-ua\stun;..\..\sofia-sip\libsofia-sip-ua\tport;..\..\sofia-sip\libsofia-sip-ua\features;..\..\pthreads-w32-2-9-1;.;..\..\openssl-$(OpenSSLVersion)\include;%(AdditionalIncludeDirectories)
- WIN32;_DEBUG;_LIB;IN_LIBSOFIA_SIP_UA_STATIC;LIBSOFIA_SIP_UA_STATIC;LIBSRES_STATIC;PTW32_STATIC_LIB;HAVE_IPHLPAPI_H;SU_DEBUG=0;%(PreprocessorDefinitions)
+ WIN32;_DEBUG;_LIB;IN_LIBSOFIA_SIP_UA_STATIC;LIBSOFIA_SIP_UA_STATIC;LIBSRES_STATIC;PTW32_STATIC_LIB;HAVE_IPHLPAPI_H;SU_DEBUG=0;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions)
true
EnableFastChecks
MultiThreadedDebugDLL
@@ -124,7 +124,7 @@ if not exist "$(ProjectDir)$(IntDir)\auth_client.obj" "autogen.cmd"
Disabled
..\..\sofia-sip\win32;..\..\sofia-sip\libsofia-sip-ua\su;..\..\sofia-sip\libsofia-sip-ua\ipt;..\..\sofia-sip\libsofia-sip-ua\sresolv;..\..\sofia-sip\libsofia-sip-ua\bnf;..\..\sofia-sip\libsofia-sip-ua\url;..\..\sofia-sip\libsofia-sip-ua\msg;..\..\sofia-sip\libsofia-sip-ua\sip;..\..\sofia-sip\libsofia-sip-ua\nta;..\..\sofia-sip\libsofia-sip-ua\nua;..\..\sofia-sip\libsofia-sip-ua\iptsec;..\..\sofia-sip\libsofia-sip-ua\http;..\..\sofia-sip\libsofia-sip-ua\nth;..\..\sofia-sip\libsofia-sip-ua\nea;..\..\sofia-sip\libsofia-sip-ua\sdp;..\..\sofia-sip\libsofia-sip-ua\soa;..\..\sofia-sip\libsofia-sip-ua\stun;..\..\sofia-sip\libsofia-sip-ua\tport;..\..\sofia-sip\libsofia-sip-ua\features;..\..\pthreads-w32-2-9-1;.;..\..\openssl-$(OpenSSLVersion)\include;%(AdditionalIncludeDirectories)
- _WIN64;WIN32;_DEBUG;_LIB;IN_LIBSOFIA_SIP_UA_STATIC;LIBSOFIA_SIP_UA_STATIC;LIBSRES_STATIC;PTW32_STATIC_LIB;HAVE_IPHLPAPI_H;SU_DEBUG=0;%(PreprocessorDefinitions)
+ _WIN64;WIN32;_DEBUG;_LIB;IN_LIBSOFIA_SIP_UA_STATIC;LIBSOFIA_SIP_UA_STATIC;LIBSRES_STATIC;PTW32_STATIC_LIB;HAVE_IPHLPAPI_H;SU_DEBUG=0;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions)
true
EnableFastChecks
MultiThreadedDebugDLL
@@ -159,7 +159,7 @@ if not exist "$(ProjectDir)$(IntDir)\auth_client.obj" "autogen.cmd"
MaxSpeed
OnlyExplicitInline
..\..\sofia-sip\win32;..\..\sofia-sip\libsofia-sip-ua\su;..\..\sofia-sip\libsofia-sip-ua\ipt;..\..\sofia-sip\libsofia-sip-ua\sresolv;..\..\sofia-sip\libsofia-sip-ua\bnf;..\..\sofia-sip\libsofia-sip-ua\url;..\..\sofia-sip\libsofia-sip-ua\msg;..\..\sofia-sip\libsofia-sip-ua\sip;..\..\sofia-sip\libsofia-sip-ua\nta;..\..\sofia-sip\libsofia-sip-ua\nua;..\..\sofia-sip\libsofia-sip-ua\iptsec;..\..\sofia-sip\libsofia-sip-ua\http;..\..\sofia-sip\libsofia-sip-ua\nth;..\..\sofia-sip\libsofia-sip-ua\nea;..\..\sofia-sip\libsofia-sip-ua\sdp;..\..\sofia-sip\libsofia-sip-ua\soa;..\..\sofia-sip\libsofia-sip-ua\stun;..\..\sofia-sip\libsofia-sip-ua\tport;..\..\sofia-sip\libsofia-sip-ua\features;..\..\pthreads-w32-2-9-1;.;..\..\openssl-$(OpenSSLVersion)\include;%(AdditionalIncludeDirectories)
- WIN32;NDEBUG;_LIB;IN_LIBSOFIA_SIP_UA_STATIC;LIBSOFIA_SIP_UA_STATIC;LIBSRES_STATIC;PTW32_STATIC_LIB;HAVE_IPHLPAPI_H;SU_DEBUG=0;%(PreprocessorDefinitions)
+ WIN32;NDEBUG;_LIB;IN_LIBSOFIA_SIP_UA_STATIC;LIBSOFIA_SIP_UA_STATIC;LIBSRES_STATIC;PTW32_STATIC_LIB;HAVE_IPHLPAPI_H;SU_DEBUG=0;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions)
true
MultiThreadedDLL
true
@@ -197,7 +197,7 @@ if not exist "$(ProjectDir)$(IntDir)\auth_client.obj" "autogen.cmd"
MaxSpeed
OnlyExplicitInline
..\..\sofia-sip\win32;..\..\sofia-sip\libsofia-sip-ua\su;..\..\sofia-sip\libsofia-sip-ua\ipt;..\..\sofia-sip\libsofia-sip-ua\sresolv;..\..\sofia-sip\libsofia-sip-ua\bnf;..\..\sofia-sip\libsofia-sip-ua\url;..\..\sofia-sip\libsofia-sip-ua\msg;..\..\sofia-sip\libsofia-sip-ua\sip;..\..\sofia-sip\libsofia-sip-ua\nta;..\..\sofia-sip\libsofia-sip-ua\nua;..\..\sofia-sip\libsofia-sip-ua\iptsec;..\..\sofia-sip\libsofia-sip-ua\http;..\..\sofia-sip\libsofia-sip-ua\nth;..\..\sofia-sip\libsofia-sip-ua\nea;..\..\sofia-sip\libsofia-sip-ua\sdp;..\..\sofia-sip\libsofia-sip-ua\soa;..\..\sofia-sip\libsofia-sip-ua\stun;..\..\sofia-sip\libsofia-sip-ua\tport;..\..\sofia-sip\libsofia-sip-ua\features;..\..\pthreads-w32-2-9-1;.;..\..\openssl-$(OpenSSLVersion)\include;%(AdditionalIncludeDirectories)
- _WIN64;WIN32;NDEBUG;_LIB;IN_LIBSOFIA_SIP_UA_STATIC;LIBSOFIA_SIP_UA_STATIC;LIBSRES_STATIC;PTW32_STATIC_LIB;HAVE_IPHLPAPI_H;SU_DEBUG=0;%(PreprocessorDefinitions)
+ _WIN64;WIN32;NDEBUG;_LIB;IN_LIBSOFIA_SIP_UA_STATIC;LIBSOFIA_SIP_UA_STATIC;LIBSRES_STATIC;PTW32_STATIC_LIB;HAVE_IPHLPAPI_H;SU_DEBUG=0;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions)
true
MultiThreadedDLL
true
diff --git a/src/mod/applications/mod_conference/mod_conference.c b/src/mod/applications/mod_conference/mod_conference.c
index f296844a2c..1340d3bc6d 100644
--- a/src/mod/applications/mod_conference/mod_conference.c
+++ b/src/mod/applications/mod_conference/mod_conference.c
@@ -9578,16 +9578,7 @@ SWITCH_STANDARD_APP(conference_function)
member.channel = switch_core_session_get_channel(session);
member.pool = switch_core_session_get_pool(session);
- if (!(mid = switch_channel_get_private(channel, "__confmid"))) {
- mid = switch_core_session_alloc(session, sizeof(*mid));
- *mid = next_member_id();
- switch_channel_set_private(channel, "__confmid", mid);
- }
-
- switch_channel_set_variable_printf(channel, "conference_member_id", "%u", *mid);
-
/* Prepare MUTEXS */
- member.id = *mid;
switch_mutex_init(&member.flag_mutex, SWITCH_MUTEX_NESTED, member.pool);
switch_mutex_init(&member.write_mutex, SWITCH_MUTEX_NESTED, member.pool);
switch_mutex_init(&member.read_mutex, SWITCH_MUTEX_NESTED, member.pool);
@@ -9596,14 +9587,26 @@ SWITCH_STANDARD_APP(conference_function)
switch_mutex_init(&member.audio_out_mutex, SWITCH_MUTEX_NESTED, member.pool);
switch_thread_rwlock_create(&member.rwlock, member.pool);
- /* Install our Signed Linear codec so we get the audio in that format */
- switch_core_session_set_read_codec(member.session, &member.read_codec);
-
if (setup_media(&member, conference)) {
//flags = 0;
goto done;
}
+
+ if (!(mid = switch_channel_get_private(channel, "__confmid"))) {
+ mid = switch_core_session_alloc(session, sizeof(*mid));
+ *mid = next_member_id();
+ switch_channel_set_private(channel, "__confmid", mid);
+ }
+
+ switch_channel_set_variable_printf(channel, "conference_member_id", "%u", *mid);
+ member.id = *mid;
+
+
+ /* Install our Signed Linear codec so we get the audio in that format */
+ switch_core_session_set_read_codec(member.session, &member.read_codec);
+
+
mflags = conference->mflags;
set_mflags(flags_str, &mflags);
mflags |= MFLAG_RUNNING;
diff --git a/src/mod/applications/mod_mongo/mod_mongo.c b/src/mod/applications/mod_mongo/mod_mongo.c
index aeb375a9d5..0de63fd0b6 100644
--- a/src/mod/applications/mod_mongo/mod_mongo.c
+++ b/src/mod/applications/mod_mongo/mod_mongo.c
@@ -1,6 +1,6 @@
/*
* FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
- * Copyright (C) 2005-2014, Anthony Minessale II
+ * Copyright (C) 2005-2015, Anthony Minessale II
*
* Version: MPL 1.1
*
@@ -44,6 +44,7 @@
#define DELIMITER ';'
#define FIND_ONE_SYNTAX "mongo_find_one ns; query; fields; options"
+#define FIND_N_SYNTAX "mongo_find_n ns; query; fields; options; n"
#define MAPREDUCE_SYNTAX "mongo_mapreduce ns; query"
SWITCH_MODULE_LOAD_FUNCTION(mod_mongo_load);
@@ -184,6 +185,102 @@ SWITCH_STANDARD_API(mongo_mapreduce_function)
return status;
}
+SWITCH_STANDARD_API(mongo_find_n_function)
+{
+ switch_status_t status = SWITCH_STATUS_SUCCESS;
+ char *db = NULL, *collection = NULL, *json_query = NULL, *json_fields = NULL, *query_options_str = NULL;
+ int query_options = 0;
+ int n = 1;
+
+ db = strdup(cmd);
+ switch_assert(db != NULL);
+
+ if ((collection = strchr(db, '.'))) {
+ *collection++ = '\0';
+ if ((json_query = strchr(collection, DELIMITER))) {
+ *json_query++ = '\0';
+ if ((json_fields = strchr(json_query, DELIMITER))) {
+ *json_fields++ = '\0';
+ if ((query_options_str = strchr(json_fields, DELIMITER))) {
+ char *n_str;
+ *query_options_str++ = '\0';
+ if (!zstr(query_options_str)) {
+ query_options = parse_query_options(query_options_str);
+ }
+ if ((n_str = strchr(query_options_str, DELIMITER))) {
+ *n_str++ = '\0';
+ if (switch_is_number(n_str)) {
+ n = atoi(n_str);
+ if (n < 1) {
+ n = 1;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (!zstr(db) && !zstr(collection) && !zstr(json_query) && !zstr(json_fields)) {
+ bson_error_t error;
+ mongoc_client_t *conn = get_connection();
+ if (conn) {
+ mongoc_collection_t *col = mongoc_client_get_collection(conn, db, collection);
+ if (col) {
+ bson_t *query = bson_new_from_json((uint8_t *)json_query, strlen(json_query), &error);
+ bson_t *fields = bson_new_from_json((uint8_t *)json_fields, strlen(json_fields), &error);
+ if (query && fields) {
+ /* send query */
+ mongoc_cursor_t *cursor = mongoc_collection_find(col, query_options, 0, n, 0, query, fields, NULL);
+ if (cursor && !mongoc_cursor_error(cursor, &error)) {
+ /* get results from cursor */
+ const bson_t *result;
+ stream->write_function(stream, "-OK\n[");
+ if (mongoc_cursor_more(cursor) && mongoc_cursor_next(cursor, &result)) {
+ char *json_result;
+ json_result = bson_as_json(result, NULL);
+ stream->write_function(stream, "%s", json_result);
+ bson_free(json_result);
+ }
+ while (mongoc_cursor_more(cursor) && mongoc_cursor_next(cursor, &result)) {
+ char *json_result;
+ json_result = bson_as_json(result, NULL);
+ stream->write_function(stream, ",%s", json_result);
+ bson_free(json_result);
+ }
+ stream->write_function(stream, "]\n");
+ } else {
+ stream->write_function(stream, "-ERR\nquery failed!\n");
+ }
+ if (cursor) {
+ mongoc_cursor_destroy(cursor);
+ }
+ } else {
+ stream->write_function(stream, "-ERR\nmissing query or fields!\n%s\n", FIND_ONE_SYNTAX);
+ }
+ if (query) {
+ bson_destroy(query);
+ }
+ if (fields) {
+ bson_destroy(fields);
+ }
+ mongoc_collection_destroy(col);
+ } else {
+ stream->write_function(stream, "-ERR\nunknown collection: %s\n", collection);
+ }
+ connection_done(conn);
+ } else {
+ stream->write_function(stream, "-ERR\nfailed to get connection!\n");
+ }
+ } else {
+ stream->write_function(stream, "-ERR\n%s\n", FIND_N_SYNTAX);
+ }
+
+ switch_safe_free(db);
+
+ return status;
+}
+
SWITCH_STANDARD_API(mongo_find_one_function)
{
switch_status_t status = SWITCH_STATUS_SUCCESS;
@@ -218,21 +315,21 @@ SWITCH_STANDARD_API(mongo_find_one_function)
bson_t *query = bson_new_from_json((uint8_t *)json_query, strlen(json_query), &error);
bson_t *fields = bson_new_from_json((uint8_t *)json_fields, strlen(json_fields), &error);
if (query && fields) {
- int ok = 0;
/* send query */
mongoc_cursor_t *cursor = mongoc_collection_find(col, query_options, 0, 1, 0, query, fields, NULL);
- if (cursor && mongoc_cursor_more(cursor) && !mongoc_cursor_error(cursor, &error)) {
+ if (cursor && !mongoc_cursor_error(cursor, &error)) {
/* get result from cursor */
const bson_t *result;
- if (mongoc_cursor_next(cursor, &result)) {
+ if (mongoc_cursor_more(cursor) && mongoc_cursor_next(cursor, &result)) {
char *json_result;
json_result = bson_as_json(result, NULL);
stream->write_function(stream, "-OK\n%s\n", json_result);
bson_free(json_result);
- ok = 1;
+ } else {
+ /* empty set */
+ stream->write_function(stream, "-OK\n{}\n");
}
- }
- if (!ok) {
+ } else {
stream->write_function(stream, "-ERR\nquery failed!\n");
}
if (cursor) {
@@ -256,7 +353,7 @@ SWITCH_STANDARD_API(mongo_find_one_function)
stream->write_function(stream, "-ERR\nfailed to get connection!\n");
}
} else {
- stream->write_function(stream, "-ERR\n%s\n", FIND_ONE_SYNTAX);
+ stream->write_function(stream, "-ERR\n%s\n", FIND_ONE_SYNTAX);
}
switch_safe_free(db);
@@ -349,6 +446,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_mongo_load)
}
SWITCH_ADD_API(api_interface, "mongo_find_one", "findOne", mongo_find_one_function, FIND_ONE_SYNTAX);
+ SWITCH_ADD_API(api_interface, "mongo_find_n", "find", mongo_find_n_function, FIND_N_SYNTAX);
SWITCH_ADD_API(api_interface, "mongo_mapreduce", "Map/Reduce", mongo_mapreduce_function, MAPREDUCE_SYNTAX);
return SWITCH_STATUS_SUCCESS;
diff --git a/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c b/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c
index 7f65bd406a..133618632f 100644
--- a/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c
+++ b/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c
@@ -1,6 +1,6 @@
/*
* FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
- * Copyright (C) 2009-2014, Anthony Minessale II
+ * Copyright (C) 2009-2015, Anthony Minessale II
*
* Version: MPL 1.1
*
@@ -212,6 +212,7 @@ static int get_next_speech_channel_number(void);
#define BUILTIN_ID "builtin:"
#define SESSION_ID "session:"
#define HTTP_ID "http://"
+#define HTTPS_ID "https://"
#define FILE_ID "file://"
#define INLINE_ID "inline:"
static int text_starts_with(const char *text, const char *match);
@@ -3207,7 +3208,7 @@ static switch_status_t recog_asr_load_grammar(switch_asr_handle_t *ah, const cha
}
/* figure out what type of grammar this is */
- if (text_starts_with(grammar, HTTP_ID) || text_starts_with(grammar, FILE_ID) || text_starts_with(grammar, SESSION_ID)
+ if (text_starts_with(grammar, HTTP_ID) || text_starts_with(grammar, HTTPS_ID) || text_starts_with(grammar, FILE_ID) || text_starts_with(grammar, SESSION_ID)
|| text_starts_with(grammar, BUILTIN_ID)) {
switch_log_printf(SWITCH_CHANNEL_UUID_LOG(schannel->session_uuid), SWITCH_LOG_DEBUG, "(%s) Grammar is URI\n", schannel->name);
type = GRAMMAR_TYPE_URI;
diff --git a/src/mod/endpoints/mod_verto/ws.c b/src/mod/endpoints/mod_verto/ws.c
index e990f7f815..8a46b65502 100644
--- a/src/mod/endpoints/mod_verto/ws.c
+++ b/src/mod/endpoints/mod_verto/ws.c
@@ -311,7 +311,7 @@ int ws_handshake(wsh_t *wsh)
proto_buf);
respond[511] = 0;
- if (ws_raw_write(wsh, respond, strlen(respond)) != strlen(respond)) {
+ if (ws_raw_write(wsh, respond, strlen(respond)) != (ssize_t)strlen(respond)) {
goto err;
}
@@ -406,7 +406,7 @@ ssize_t ws_raw_write(wsh_t *wsh, void *data, size_t bytes)
ssize_t r;
int sanity = 2000;
int ssl_err = 0;
- ssize_t wrote = 0;
+ size_t wrote = 0;
if (wsh->ssl) {
do {
diff --git a/src/mod/event_handlers/mod_rayo/rayo_input_component.c b/src/mod/event_handlers/mod_rayo/rayo_input_component.c
index 0eaabae613..a32cdf8602 100644
--- a/src/mod/event_handlers/mod_rayo/rayo_input_component.c
+++ b/src/mod/event_handlers/mod_rayo/rayo_input_component.c
@@ -1,6 +1,6 @@
/*
* mod_rayo for FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
- * Copyright (C) 2013-2014, Grasshopper
+ * Copyright (C) 2013-2015, Grasshopper
*
* Version: MPL 1.1
*
@@ -383,6 +383,8 @@ static int validate_call_input(iks *input, const char **error)
{
iks *grammar;
const char *content_type;
+ int has_grammar = 0;
+ int use_mrcp = 0;
/* validate input attributes */
if (!VALIDATE_RAYO_INPUT(input)) {
@@ -390,26 +392,48 @@ static int validate_call_input(iks *input, const char **error)
return 0;
}
- /* missing grammar */
- grammar = iks_find(input, "grammar");
- if (!grammar) {
+ use_mrcp = !strncmp("unimrcp", iks_find_attrib(input, "recognizer") ? iks_find_attrib(input, "recognizer") : globals.default_recognizer, 7);
+
+ /* validate grammar elements */
+ for (grammar = iks_find(input, "grammar"); grammar; grammar = iks_next_tag(grammar)) {
+ /* is this a grammar? */
+ if (strcmp("grammar", iks_name(grammar))) {
+ continue;
+ }
+ content_type = iks_find_attrib(grammar, "content-type");
+ if (zstr(content_type)) {
+ /* grammar URL */
+ if (zstr(iks_find_attrib(grammar, "url"))) {
+ *error = "url or content-type must be set";
+ return 0;
+ } else if (!use_mrcp) {
+ *error = "url only supported with unimrcp recognizer";
+ return 0;
+ }
+ } else {
+ /* inline grammar / only support srgs */
+ if (!zstr(iks_find_attrib(grammar, "url"))) {
+ *error = "url not allowed with content-type";
+ return 0;
+ } else if (strcmp("application/srgs+xml", content_type)) {
+ *error = "Unsupported content type";
+ return 0;
+ }
+
+ /* missing inline grammar body */
+ if (zstr(iks_find_cdata(input, "grammar"))) {
+ *error = "Grammar content is missing";
+ return 0;
+ }
+ }
+ has_grammar = 1;
+ }
+
+ if (!has_grammar) {
*error = "Missing ";
return 0;
}
- /* only support srgs */
- content_type = iks_find_attrib(grammar, "content-type");
- if (!zstr(content_type) && strcmp("application/srgs+xml", content_type)) {
- *error = "Unsupported content type";
- return 0;
- }
-
- /* missing grammar body */
- if (zstr(iks_find_cdata(input, "grammar"))) {
- *error = "Grammar content is missing";
- return 0;
- }
-
return 1;
}
@@ -512,30 +536,35 @@ static char *setup_grammars_unimrcp(struct input_component *component, switch_co
continue;
}
- /* get the srgs contained in this grammar */
- if (!(grammar_cdata = iks_child(grammar_tag)) || iks_type(grammar_cdata) != IKS_CDATA) {
- *stanza_error = STANZA_ERROR_BAD_REQUEST;
- *error_detail = "Missing grammar";
- switch_safe_free(grammar_uri_list.data);
- return NULL;
- }
+ if (!zstr(iks_find_attrib_soft(grammar_tag, "content-type"))) {
+ /* get the srgs contained in this grammar */
+ if (!(grammar_cdata = iks_child(grammar_tag)) || iks_type(grammar_cdata) != IKS_CDATA) {
+ *stanza_error = STANZA_ERROR_BAD_REQUEST;
+ *error_detail = "Missing grammar";
+ switch_safe_free(grammar_uri_list.data);
+ return NULL;
+ }
- /* load the grammar */
- grammar = switch_core_sprintf(RAYO_POOL(component), "inline:%s", iks_cdata(grammar_cdata));
- grammar_name = switch_core_sprintf(RAYO_POOL(component), "grammar-%d", rayo_actor_seq_next(RAYO_ACTOR(component)));
- /* unlock handler mutex, otherwise deadlock will happen if switch_ivr_detect_speech_load_grammar removes the media bug */
- switch_mutex_unlock(component->handler->mutex);
- if (switch_ivr_detect_speech_load_grammar(session, grammar, grammar_name) != SWITCH_STATUS_SUCCESS) {
+ /* load the grammar */
+ grammar = switch_core_sprintf(RAYO_POOL(component), "inline:%s", iks_cdata(grammar_cdata));
+ grammar_name = switch_core_sprintf(RAYO_POOL(component), "grammar-%d", rayo_actor_seq_next(RAYO_ACTOR(component)));
+ /* unlock handler mutex, otherwise deadlock will happen if switch_ivr_detect_speech_load_grammar removes the media bug */
+ switch_mutex_unlock(component->handler->mutex);
+ if (switch_ivr_detect_speech_load_grammar(session, grammar, grammar_name) != SWITCH_STATUS_SUCCESS) {
+ switch_mutex_lock(component->handler->mutex);
+ *stanza_error = STANZA_ERROR_INTERNAL_SERVER_ERROR;
+ *error_detail = "Failed to load grammar";
+ switch_safe_free(grammar_uri_list.data);
+ return NULL;
+ }
switch_mutex_lock(component->handler->mutex);
- *stanza_error = STANZA_ERROR_INTERNAL_SERVER_ERROR;
- *error_detail = "Failed to load grammar";
- switch_safe_free(grammar_uri_list.data);
- return NULL;
- }
- switch_mutex_lock(component->handler->mutex);
- /* add grammar to uri-list */
- grammar_uri_list.write_function(&grammar_uri_list, "session:%s\r\n", grammar_name);
+ /* add grammar to uri-list */
+ grammar_uri_list.write_function(&grammar_uri_list, "session:%s\r\n", grammar_name);
+ } else {
+ /* add URI to uri-list */
+ grammar_uri_list.write_function(&grammar_uri_list, "%s\r\n", iks_find_attrib_soft(grammar_tag, "url"));
+ }
}
switch_core_asr_text_param(ah, "start-recognize", "true");
diff --git a/src/mod/languages/mod_java/modjava.c b/src/mod/languages/mod_java/modjava.c
index 17b72d5826..811237d5fd 100644
--- a/src/mod/languages/mod_java/modjava.c
+++ b/src/mod/languages/mod_java/modjava.c
@@ -128,6 +128,7 @@ static switch_status_t exec_user_method(user_method_t * userMethod) {
if (class == NULL) {
(*env)->ExceptionDescribe(env);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "%s Class not found\n",userMethod->class);
status = SWITCH_STATUS_FALSE;
goto done;
}
@@ -136,6 +137,7 @@ static switch_status_t exec_user_method(user_method_t * userMethod) {
if (method == NULL) {
(*env)->ExceptionDescribe(env);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "%s Method not found\n",userMethod->method);
status = SWITCH_STATUS_FALSE;
goto done;
}
@@ -145,6 +147,7 @@ static switch_status_t exec_user_method(user_method_t * userMethod) {
if (arg == NULL) {
(*env)->ExceptionDescribe(env);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Args not found\n");
status = SWITCH_STATUS_FALSE;
goto done;
}
diff --git a/src/switch_ivr_async.c b/src/switch_ivr_async.c
index 60de27c73e..0b58c11433 100644
--- a/src/switch_ivr_async.c
+++ b/src/switch_ivr_async.c
@@ -1183,7 +1183,7 @@ static switch_bool_t record_callback(switch_media_bug_t *bug, void *user_data, s
{
const char *var = switch_channel_get_variable(channel, "RECORD_USE_THREAD");
- if (zstr(var) || switch_true(var)) {
+ if (!rh->native && rh->fh && (zstr(var) || switch_true(var))) {
switch_threadattr_t *thd_attr = NULL;
switch_memory_pool_t *pool = switch_core_session_get_pool(session);
int sanity = 200;
diff --git a/src/switch_time.c b/src/switch_time.c
index c226b90592..009853b70b 100644
--- a/src/switch_time.c
+++ b/src/switch_time.c
@@ -413,10 +413,10 @@ static switch_status_t timerfd_start_interval(interval_timer_t *it, int interval
return SWITCH_STATUS_GENERR;
}
- val.it_interval.tv_sec = 0;
- val.it_interval.tv_nsec = interval * 1000000;
+ val.it_interval.tv_sec = interval / 1000;
+ val.it_interval.tv_nsec = (interval % 1000) * 1000000;
val.it_value.tv_sec = 0;
- val.it_value.tv_nsec = val.it_interval.tv_nsec;
+ val.it_value.tv_nsec = 100000;
if (timerfd_settime(fd, TFD_TIMER_ABSTIME, &val, NULL) < 0) {
close(fd);
diff --git a/support-d/.bashrc b/support-d/.bashrc
index 6ccce922bd..d5694c480e 100644
--- a/support-d/.bashrc
+++ b/support-d/.bashrc
@@ -73,7 +73,7 @@ alias emcas='emacs'
alias meacs='emacs'
alias mecas='emacs'
alias bgit='git commit --author "Brian West "'
-alias mgit='git commit --author "Mike Jerris "'
+alias mgit='git commit --author "Mike Jerris "'
alias tgit='git commit --author "Anthony Minessale "'
alias dp='emacs /usr/local/freeswitch/conf/dialplan/default.xml'
alias go='/usr/local/freeswitch/bin/freeswitch -nonat'