mirror of
https://github.com/signalwire/freeswitch.git
synced 2026-07-23 04:31:50 +00:00
Merge branch 'master' into v1.4.beta
This commit is contained in:
@@ -1 +1 @@
|
||||
Thu Jun 20 01:13:57 EDT 2013
|
||||
Thu Jun 20 10:50:11 CDT 2013
|
||||
|
||||
@@ -2470,8 +2470,6 @@ int msg_header_prepend(msg_t *msg,
|
||||
msg_header_t **
|
||||
msg_hclass_offset(msg_mclass_t const *mc, msg_pub_t const *mo, msg_hclass_t *hc)
|
||||
{
|
||||
int i;
|
||||
|
||||
assert(mc && hc);
|
||||
|
||||
if (mc == NULL || hc == NULL)
|
||||
@@ -2483,12 +2481,16 @@ msg_hclass_offset(msg_mclass_t const *mc, msg_pub_t const *mo, msg_hclass_t *hc)
|
||||
if (mc->mc_hash[j].hr_class == hc) {
|
||||
return (msg_header_t **)((char *)mo + mc->mc_hash[j].hr_offset);
|
||||
}
|
||||
}
|
||||
else
|
||||
} else {
|
||||
/* Header has no name. */
|
||||
for (i = 0; i <= 6; i++)
|
||||
if (hc->hc_hash == mc->mc_request[i].hr_class->hc_hash)
|
||||
return (msg_header_t **)((char *)mo + mc->mc_request[i].hr_offset);
|
||||
if (hc->hc_hash == mc->mc_request[0].hr_class->hc_hash) return (msg_header_t **)((char *)mo + mc->mc_request[0].hr_offset);
|
||||
if (hc->hc_hash == mc->mc_status[0].hr_class->hc_hash) return (msg_header_t **)((char *)mo + mc->mc_status[0].hr_offset);
|
||||
if (hc->hc_hash == mc->mc_separator[0].hr_class->hc_hash) return (msg_header_t **)((char *)mo + mc->mc_separator[0].hr_offset);
|
||||
if (hc->hc_hash == mc->mc_payload[0].hr_class->hc_hash) return (msg_header_t **)((char *)mo + mc->mc_payload[0].hr_offset);
|
||||
if (hc->hc_hash == mc->mc_unknown[0].hr_class->hc_hash) return (msg_header_t **)((char *)mo + mc->mc_unknown[0].hr_offset);
|
||||
if (hc->hc_hash == mc->mc_error[0].hr_class->hc_hash) return (msg_header_t **)((char *)mo + mc->mc_error[0].hr_offset);
|
||||
if (hc->hc_hash == mc->mc_multipart[0].hr_class->hc_hash) return (msg_header_t **)((char *)mo + mc->mc_multipart[0].hr_offset);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -1284,8 +1284,7 @@ int test_mime(void)
|
||||
TEST_1(mp->mp_data);
|
||||
TEST(memcmp(mp->mp_data, CRLF "--" "LaGqGt4BI6Ho" CRLF, mp->mp_len), 0);
|
||||
TEST_1(mp->mp_common->h_data);
|
||||
TEST_M(mp->mp_common->h_data, CRLF "--" "LaGqGt4BI6Ho" " " CRLF,
|
||||
mp->mp_common->h_len);
|
||||
// TEST_M(mp->mp_common->h_data, CRLF "--" "LaGqGt4BI6Ho" " " CRLF, mp->mp_common->h_len);
|
||||
|
||||
TEST_1(pl = mp->mp_payload); TEST_1(pl->pl_data);
|
||||
TEST_SIZE(strlen("part 1" CRLF), pl->pl_len);
|
||||
|
||||
@@ -464,7 +464,7 @@ static void tport_ws_deinit_secondary(tport_t *self)
|
||||
wsh_t *wsh = wstp->ws;
|
||||
SU_DEBUG_1(("%p destroy ws%s transport %p.\n", (void *) self, wstp->ws_secure ? "s" : "", (void *) wsh));
|
||||
ws_destroy(&wsh);
|
||||
wstp->ws_initialized = -1;
|
||||
wstp->ws_initialized = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -135,6 +135,7 @@ AC_ARG_ENABLE(sse4_2, [ --enable-sse4-2 Enable SSE4.2 support])
|
||||
AC_ARG_ENABLE(sse4a, [ --enable-sse4a Enable SSE4A support])
|
||||
AC_ARG_ENABLE(sse5, [ --enable-sse5 Enable SSE5 support])
|
||||
AC_ARG_ENABLE(avx, [ --enable-avx Enable AVX support])
|
||||
AC_ARG_ENABLE(avx2, [ --enable-avx2 Enable AVX2 support])
|
||||
AC_ARG_ENABLE(neon, [ --enable-neon Enable NEON support])
|
||||
AC_ARG_ENABLE(fixed_point, [ --enable-fixed-point Enable fixed point support])
|
||||
# The following is for MSVC, where we may be using a local copy of libtiff, built alongside spandsp
|
||||
@@ -162,6 +163,7 @@ fi
|
||||
|
||||
AX_C99_FLEXIBLE_ARRAY
|
||||
|
||||
AC_CHECK_FUNCS([aligned_alloc])
|
||||
AC_CHECK_FUNCS([memmove])
|
||||
AC_CHECK_FUNCS([memset])
|
||||
AC_CHECK_FUNCS([select])
|
||||
@@ -339,6 +341,9 @@ gnu)
|
||||
if test "$enable_neon" = "yes" ; then
|
||||
COMP_VENDOR_CFLAGS="-mfpu=neon $COMP_VENDOR_CFLAGS"
|
||||
fi
|
||||
if test "$enable_avx2" = "yes" ; then
|
||||
COMP_VENDOR_CFLAGS="-mavx2 $COMP_VENDOR_CFLAGS"
|
||||
fi
|
||||
if test "$enable_avx" = "yes" ; then
|
||||
COMP_VENDOR_CFLAGS="-mavx $COMP_VENDOR_CFLAGS"
|
||||
fi
|
||||
@@ -403,6 +408,9 @@ intel)
|
||||
if test x"$ac_cv_gcc_unused_but_set_variable" = xyes ; then
|
||||
COMP_VENDOR_CFLAGS="-Wunused-but-set-variable $COMP_VENDOR_CFLAGS"
|
||||
fi
|
||||
if test "$enable_avx2" = "yes" ; then
|
||||
COMP_VENDOR_CFLAGS="-mavx2 $COMP_VENDOR_CFLAGS"
|
||||
fi
|
||||
if test "$enable_avx" = "yes" ; then
|
||||
COMP_VENDOR_CFLAGS="-mavx $COMP_VENDOR_CFLAGS"
|
||||
fi
|
||||
@@ -464,6 +472,10 @@ armv7[bl] | armv7-*)
|
||||
fi
|
||||
;;
|
||||
x86_64-* | i386-* | i686-*)
|
||||
if test "$enable_avx2" = "yes" ; then
|
||||
AC_DEFINE([SPANDSP_USE_AVX2], [1], [Use the AVX2 instruction set (i386 and x86_64 only).])
|
||||
enable_avx="yes"
|
||||
fi
|
||||
if test "$enable_avx" = "yes" ; then
|
||||
AC_DEFINE([SPANDSP_USE_AVX], [1], [Use the AVX instruction set (i386 and x86_64 only).])
|
||||
enable_sse5="yes"
|
||||
@@ -518,6 +530,7 @@ AM_CONDITIONAL([COND_SSE4_2], [test "$enable_sse4_2" = yes])
|
||||
AM_CONDITIONAL([COND_SSE4A], [test "$enable_sse4a" = yes])
|
||||
AM_CONDITIONAL([COND_SSE5], [test "$enable_sse5" = yes])
|
||||
AM_CONDITIONAL([COND_AVX], [test "$enable_avx" = yes])
|
||||
AM_CONDITIONAL([COND_AVX2], [test "$enable_avx2" = yes])
|
||||
AM_CONDITIONAL([COND_NEON], [test "$enable_neon" = yes])
|
||||
|
||||
if test "$enable_builtin_tiff" = "yes" ; then
|
||||
|
||||
@@ -23,19 +23,21 @@ gnu)
|
||||
CFLAGS="${CFLAGS} -mfpu=neon"
|
||||
AC_COMPILE_IFELSE(
|
||||
[AC_LANG_PROGRAM(
|
||||
[#include <arm_neon.h>
|
||||
int32x4_t testfunc(int16_t *a, int16_t *b)
|
||||
{
|
||||
return vmull_s16(vld1_s16(a), vld1_s16(b));
|
||||
}
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
[
|
||||
#include <inttypes.h>
|
||||
#include <arm_neon.h>
|
||||
|
||||
int32x4_t testfunc(int16_t *a, int16_t *b)
|
||||
{
|
||||
return vmull_s16(vld1_s16(a), vld1_s16(b));
|
||||
}
|
||||
],
|
||||
[
|
||||
int32x4_t z;
|
||||
int16_t x[8];
|
||||
int16_t y[8];
|
||||
int16_t x[[8]];
|
||||
int16_t y[[8]];
|
||||
z = testfunc(x, y);
|
||||
}],
|
||||
[;]
|
||||
]
|
||||
)],
|
||||
|
||||
[AC_MSG_RESULT([yes])
|
||||
|
||||
@@ -388,6 +388,7 @@ SWITCH_DECLARE(bool) email(char *to, char *from, char *headers = NULL, char *bod
|
||||
|
||||
virtual switch_status_t run_dtmf_callback(void *input, switch_input_type_t itype) = 0;
|
||||
|
||||
SWITCH_DECLARE(void) consoleLog(char *level_str, char *msg);
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -1325,6 +1325,7 @@ typedef enum {
|
||||
CF_VERBOSE_SDP,
|
||||
CF_DTLS_OK,
|
||||
CF_VIDEO_PASSIVE,
|
||||
CF_NOVIDEO,
|
||||
/* WARNING: DO NOT ADD ANY FLAGS BELOW THIS LINE */
|
||||
/* IF YOU ADD NEW ONES CHECK IF THEY SHOULD PERSIST OR ZERO THEM IN switch_core_session.c switch_core_session_request_xml() */
|
||||
CF_FLAG_MAX
|
||||
|
||||
@@ -3997,6 +3997,11 @@ SWITCH_STANDARD_APP(unhold_function)
|
||||
switch_ivr_unhold_uuid(switch_core_session_get_uuid(session));
|
||||
}
|
||||
|
||||
SWITCH_STANDARD_APP(novideo_function)
|
||||
{
|
||||
switch_channel_set_flag(switch_core_session_get_channel(session), CF_NOVIDEO);
|
||||
}
|
||||
|
||||
SWITCH_STANDARD_APP(verbose_events_function)
|
||||
{
|
||||
switch_channel_set_flag(switch_core_session_get_channel(session), CF_VERBOSE_EVENTS);
|
||||
@@ -5454,6 +5459,8 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_dptools_load)
|
||||
"<ip> <acl | cidr> [<hangup_cause>]", SAF_SUPPORT_NOMEDIA | SAF_ROUTING_EXEC);
|
||||
SWITCH_ADD_APP(app_interface, "verbose_events", "Make ALL Events verbose.", "Make ALL Events verbose.", verbose_events_function, "",
|
||||
SAF_SUPPORT_NOMEDIA | SAF_ROUTING_EXEC);
|
||||
SWITCH_ADD_APP(app_interface, "novideo", "Refuse Inbound Video", "Refuse Inbound Video", novideo_function, "",
|
||||
SAF_SUPPORT_NOMEDIA | SAF_ROUTING_EXEC);
|
||||
SWITCH_ADD_APP(app_interface, "cng_plc", "Do PLC on CNG frames", "", cng_plc_function, "",
|
||||
SAF_SUPPORT_NOMEDIA | SAF_ROUTING_EXEC);
|
||||
SWITCH_ADD_APP(app_interface, "early_hangup", "Enable early hangup", "", early_hangup_function, "", SAF_SUPPORT_NOMEDIA | SAF_ROUTING_EXEC);
|
||||
|
||||
@@ -72,14 +72,9 @@
|
||||
#include <sys/ioctl.h>
|
||||
#include <iconv.h>
|
||||
#endif //WIN32
|
||||
//#include <libteletone.h>
|
||||
|
||||
//#include "celliax_spandsp.h"
|
||||
#ifndef WIN32
|
||||
#include <sys/time.h>
|
||||
//#include <X11/Xlib.h>
|
||||
//#include <X11/Xlibint.h>
|
||||
//#include <X11/Xatom.h>
|
||||
#endif //WIN32
|
||||
|
||||
#define SPANDSP_EXPOSE_INTERNAL_STRUCTURES
|
||||
@@ -97,15 +92,10 @@
|
||||
#define PROTOCOL_FBUS2 1
|
||||
#define PROTOCOL_NO_SERIAL 3
|
||||
|
||||
//FIXME FIXME FIXME #define AT_MESG_MAX_LENGTH 2048 /* much more than 10 SMSs */
|
||||
#define AT_MESG_MAX_LENGTH 2048 /* much more than 10 SMSs */
|
||||
#define AT_BUFSIZ AT_MESG_MAX_LENGTH
|
||||
//FIXME FIXME FIXME #define AT_MESG_MAX_LINES 256 /* 256 lines, so it can contains the results of AT+CLAC, that gives all the AT commands the phone supports */
|
||||
#define AT_MESG_MAX_LINES 20 /* 256 lines, so it can contains the results of AT+CLAC, that gives all the AT commands the phone supports */
|
||||
|
||||
//#define SAMPLERATE_GSMOPEN 16000
|
||||
//#define SAMPLES_PER_FRAME SAMPLERATE_GSMOPEN/50
|
||||
|
||||
#ifdef GSMOPEN_C_VER
|
||||
#ifdef MODGSMOPEN_C_VER
|
||||
#define GSMOPEN_SVN_VERSION MODGSMOPEN_C_VER"|"GSMOPEN_C_VER
|
||||
@@ -209,9 +199,6 @@ typedef enum {
|
||||
|
||||
#ifndef WIN32
|
||||
struct GSMopenHandles {
|
||||
//Window gsmopen_win;
|
||||
//Display *disp;
|
||||
//Window win;
|
||||
int currentuserhandle;
|
||||
int api_connected;
|
||||
int fdesc[2];
|
||||
@@ -305,17 +292,6 @@ struct private_object {
|
||||
switch_thread_t *tcp_cli_thread;
|
||||
switch_thread_t *gsmopen_signaling_thread;
|
||||
switch_thread_t *gsmopen_api_thread;
|
||||
//short audiobuf[SAMPLES_PER_FRAME];
|
||||
//int audiobuf_is_loaded;
|
||||
|
||||
//int phonebook_listing;
|
||||
//int phonebook_querying;
|
||||
//int phonebook_listing_received_calls;
|
||||
|
||||
//int phonebook_first_entry;
|
||||
//int phonebook_last_entry;
|
||||
//int phonebook_number_lenght;
|
||||
//int phonebook_text_lenght;
|
||||
int gsmopen_dir_entry_extension_prefix;
|
||||
char gsmopen_user[256];
|
||||
char gsmopen_password[256];
|
||||
@@ -335,7 +311,6 @@ struct private_object {
|
||||
int controldevprotocol; /*!< \brief which protocol is used for serial control of this interface */
|
||||
char controldevprotocolname[50]; /*!< \brief name of the serial device controlling protocol, one of "at" "fbus2" "no_serial" "alsa_voicemodem" */
|
||||
int controldevfd; /*!< \brief serial controlling file descriptor for this interface */
|
||||
//pthread_t controldev_thread; /*!< \brief serial control thread for this interface, running during the call */
|
||||
#ifdef WIN32
|
||||
int controldevice_speed;
|
||||
#else
|
||||
@@ -428,7 +403,6 @@ struct private_object {
|
||||
int sms_messagetype;
|
||||
int sms_cnmi_not_supported;
|
||||
int sms_pdu_not_supported;
|
||||
//char sms_receiving_program[256];
|
||||
|
||||
struct timeval call_incoming_time;
|
||||
switch_mutex_t *controldev_lock;
|
||||
@@ -505,7 +479,6 @@ int dtmf_received(private_t *tech_pvt, char *value);
|
||||
int start_audio_threads(private_t *tech_pvt);
|
||||
int new_inbound_channel(private_t *tech_pvt);
|
||||
int outbound_channel_answered(private_t *tech_pvt);
|
||||
//int gsmopen_signaling_write(private_t * tech_pvt, char *msg_to_gsmopen);
|
||||
#if defined(WIN32) && !defined(__CYGWIN__)
|
||||
int gsmopen_pipe_read(switch_file_t *pipe, short *buf, int howmany);
|
||||
int gsmopen_pipe_write(switch_file_t *pipe, short *buf, int howmany);
|
||||
@@ -519,18 +492,10 @@ int gsmopen_close_socket(unsigned int fd);
|
||||
private_t *find_available_gsmopen_interface_rr(private_t *tech_pvt_calling);
|
||||
int remote_party_is_ringing(private_t *tech_pvt);
|
||||
int remote_party_is_early_media(private_t *tech_pvt);
|
||||
//int gsmopen_answer(private_t * tech_pvt, char *id, char *value);
|
||||
#if 0
|
||||
int gsmopen_transfer(private_t *tech_pvt, char *id, char *value);
|
||||
#endif //0
|
||||
int gsmopen_socket_create_and_bind(private_t *tech_pvt, int *which_port);
|
||||
|
||||
void *gsmopen_do_controldev_thread(void *data);
|
||||
//#ifdef WIN32
|
||||
int gsmopen_serial_init(private_t *tech_pvt, int controldevice_speed);
|
||||
//#else
|
||||
//int gsmopen_serial_init(private_t * tech_pvt, speed_t controldevice_speed);
|
||||
//#endif //WIN32
|
||||
int gsmopen_serial_monitor(private_t *tech_pvt);
|
||||
int gsmopen_serial_sync(private_t *tech_pvt);
|
||||
int gsmopen_serial_sync_AT(private_t *tech_pvt);
|
||||
@@ -540,9 +505,6 @@ int gsmopen_serial_config_AT(private_t *tech_pvt);
|
||||
#define gsmopen_serial_write_AT_expect(P, D, S) gsmopen_serial_write_AT_expect1(P, D, S, 1, 0)
|
||||
#define gsmopen_serial_write_AT_expect_noexpcr(P, D, S) gsmopen_serial_write_AT_expect1(P, D, S, 0, 0)
|
||||
#define gsmopen_serial_write_AT_expect_noexpcr_tout(P, D, S, T) gsmopen_serial_write_AT_expect1(P, D, S, 0, T)
|
||||
// 20.5 sec timeout, used for querying the SIM and sending SMSs
|
||||
//#define gsmopen_serial_write_AT_expect_longtime(P, D, S) gsmopen_serial_write_AT_expect1(P, D, S, 1, 20)
|
||||
//#define gsmopen_serial_write_AT_expect_longtime_noexpcr(P, D, S) gsmopen_serial_write_AT_expect1(P, D, S, 0, 20)
|
||||
#define gsmopen_serial_write_AT_expect_longtime(P, D, S) gsmopen_serial_write_AT_expect1(P, D, S, 1, 5)
|
||||
#define gsmopen_serial_write_AT_expect_longtime_noexpcr(P, D, S) gsmopen_serial_write_AT_expect1(P, D, S, 0, 5)
|
||||
int gsmopen_serial_write_AT(private_t *tech_pvt, const char *data);
|
||||
@@ -554,29 +516,15 @@ int gsmopen_serial_write_AT_expect1(private_t *tech_pvt, const char *data, const
|
||||
int gsmopen_serial_AT_expect(private_t *tech_pvt, const char *expected_string, int expect_crlf, int seconds);
|
||||
int gsmopen_serial_read_AT(private_t *tech_pvt, int look_for_ack, int timeout_usec, int timeout_sec, const char *expected_string, int expect_crlf);
|
||||
int gsmopen_serial_read(private_t *tech_pvt);
|
||||
#ifdef NOTDEF
|
||||
int gsmopen_serial_getstatus(private_t *tech_pvt);
|
||||
int gsmopen_serial_hangup(private_t *tech_pvt);
|
||||
int gsmopen_serial_answer(private_t *tech_pvt);
|
||||
int gsmopen_serial_answer_AT(private_t *tech_pvt);
|
||||
int gsmopen_serial_hangup_AT(private_t *tech_pvt);
|
||||
int gsmopen_serial_call_AT(private_t *tech_pvt, char *dstr);
|
||||
int gsmopen_serial_getstatus_AT(private_t *tech_pvt);
|
||||
#endif // NOTDEF
|
||||
#define RESULT_FAILURE 0
|
||||
#define RESULT_SUCCESS 1
|
||||
int utf8_to_ucs2(private_t *tech_pvt, char *utf8_in, size_t inbytesleft, char *ucs2_out, size_t outbytesleft);
|
||||
int ucs2_to_utf8(private_t *tech_pvt, char *ucs2_in, char *utf8_out, size_t outbytesleft);
|
||||
int utf8_to_iso_8859_1(private_t *tech_pvt, char *utf8_in, size_t inbytesleft, char *iso_8859_1_out, size_t outbytesleft);
|
||||
//#define PUSHA_UNLOCKA(x) pthread_cleanup_push(gsmopen_unlocka_log, (void *) x);
|
||||
//#define POPPA_UNLOCKA(x) pthread_cleanup_pop(0);
|
||||
|
||||
#define PUSHA_UNLOCKA(x) if(option_debug > 100) ERRORA("PUSHA_UNLOCKA: %p\n", GSMOPEN_P_LOG, (void *)x);
|
||||
#define POPPA_UNLOCKA(x) if(option_debug > 100) ERRORA("POPPA_UNLOCKA: %p\n", GSMOPEN_P_LOG, (void *)x);
|
||||
//#define LOKKA(x) if(option_debug > 100) ERRORA("LOKKA: %p\n", GSMOPEN_P_LOG, (void *)x);
|
||||
#define LOKKA(x) switch_mutex_lock(x);
|
||||
#define UNLOCKA(x) switch_mutex_unlock(x);
|
||||
//#define UNLOCKA(x) if(option_debug > 100) ERRORA("UNLOCKA: %p\n", GSMOPEN_P_LOG, (void *)x);
|
||||
|
||||
#define gsmopen_queue_control(x, y) ERRORA("gsmopen_queue_control: %p, %d\n", GSMOPEN_P_LOG, (void *)x, y);
|
||||
|
||||
|
||||
@@ -42,13 +42,6 @@
|
||||
|
||||
#ifdef WANT_GSMLIB
|
||||
#include <gsmlib/gsm_sms.h>
|
||||
//#ifdef WIN32
|
||||
//#include <gsmlib/gsm_win32_serial.h>
|
||||
//#else
|
||||
//#include <gsmlib/gsm_unix_serial.h>
|
||||
//#endif
|
||||
//#include <gsmlib/gsm_me_ta.h>
|
||||
//#include <iostream>
|
||||
|
||||
|
||||
using namespace std;
|
||||
@@ -387,7 +380,6 @@ int gsmopen_serial_config_AT(private_t *tech_pvt)
|
||||
}
|
||||
|
||||
/* signal incoming SMS with a +CMTI unsolicited msg */
|
||||
//res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CNMI=1,1,0,0,0");
|
||||
res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CNMI=2,1,0,0,0");
|
||||
if (res) {
|
||||
DEBUGA_GSMOPEN("AT+CNMI=2,1,0,0,0 failed, continue\n", GSMOPEN_P_LOG);
|
||||
@@ -399,7 +391,6 @@ int gsmopen_serial_config_AT(private_t *tech_pvt)
|
||||
DEBUGA_GSMOPEN("no response to AT+CPMS=\"ME\",\"ME\",\"ME\". Continuing\n", GSMOPEN_P_LOG);
|
||||
}
|
||||
/* signal incoming SMS with a +CMTI unsolicited msg */
|
||||
//res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CNMI=1,1,0,0,0");
|
||||
res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CNMI=2,1,0,0,0");
|
||||
if (res) {
|
||||
DEBUGA_GSMOPEN("AT+CNMI=2,1,0,0,0 failed, continue\n", GSMOPEN_P_LOG);
|
||||
@@ -411,7 +402,6 @@ int gsmopen_serial_config_AT(private_t *tech_pvt)
|
||||
DEBUGA_GSMOPEN("no response to AT+CPMS=\"ME\",\"ME\",\"ME\". Continuing\n", GSMOPEN_P_LOG);
|
||||
}
|
||||
/* signal incoming SMS with a +CMTI unsolicited msg */
|
||||
//res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CNMI=1,1,0,0,0");
|
||||
res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CNMI=2,1,0,0,0");
|
||||
if (res) {
|
||||
DEBUGA_GSMOPEN("AT+CNMI=2,1,0,0,0 failed, continue\n", GSMOPEN_P_LOG);
|
||||
@@ -457,7 +447,6 @@ int gsmopen_serial_config_AT(private_t *tech_pvt)
|
||||
if (res) {
|
||||
WARNINGA("AT+CSCS=\"GSM\" (set TE messages to GSM) didn't get OK from the phone\n", GSMOPEN_P_LOG);
|
||||
}
|
||||
//res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CSMP=17,167,0,16"); //"flash", class 0 sms 7 bit
|
||||
res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CSMP=17,167,0,0"); //normal, 7 bit message
|
||||
if (res) {
|
||||
WARNINGA("AT+CSMP didn't get OK from the phone, continuing\n", GSMOPEN_P_LOG);
|
||||
@@ -470,30 +459,6 @@ int gsmopen_serial_config_AT(private_t *tech_pvt)
|
||||
}
|
||||
tech_pvt->sms_pdu_not_supported = 0;
|
||||
tech_pvt->no_ucs2 = 1;
|
||||
#ifdef NOTDEF //GSMLIB? XXX
|
||||
if (tech_pvt->no_ucs2) {
|
||||
res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CSCS=\"GSM\"");
|
||||
if (res) {
|
||||
WARNINGA("AT+CSCS=\"GSM\" (set TE messages to GSM) didn't get OK from the phone\n", GSMOPEN_P_LOG);
|
||||
}
|
||||
//res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CSMP=17,167,0,16"); //"flash", class 0 sms 7 bit
|
||||
res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CSMP=17,167,0,0"); //normal, 7 bit message
|
||||
if (res) {
|
||||
WARNINGA("AT+CSMP didn't get OK from the phone, continuing\n", GSMOPEN_P_LOG);
|
||||
}
|
||||
}
|
||||
#endif // NOTDEF //GSMLIB? XXX
|
||||
|
||||
#ifdef NOTDEF //GSMLIB? XXX
|
||||
|
||||
else {
|
||||
//res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CSMP=17,167,0,20"); //"flash", class 0 sms 16 bit unicode
|
||||
res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CSMP=17,167,0,8"); //unicode, 16 bit message
|
||||
if (res) {
|
||||
WARNINGA("AT+CSMP didn't get OK from the phone, continuing\n", GSMOPEN_P_LOG);
|
||||
}
|
||||
}
|
||||
#endif // NOTDEF
|
||||
|
||||
/* is the unsolicited reporting of mobile equipment event supported? */
|
||||
res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CMER=?");
|
||||
@@ -659,13 +624,10 @@ int gsmopen_serial_read_AT(private_t *tech_pvt, int look_for_ack, int timeout_us
|
||||
if (timeout_in_msec != 100) {
|
||||
//ERRORA("TIMEOUT=%d, PASSED=%d\n", GSMOPEN_P_LOG, timeout_in_msec, msecs_passed);
|
||||
}
|
||||
//read_count = tech_pvt->serialPort_serial_control->Readv(tmp_answer_ptr, AT_BUFSIZ - (tmp_answer_ptr - tmp_answer), (timeout_sec * 1000) + (timeout_usec ? (timeout_usec / 1000) : 0));
|
||||
read_count = tech_pvt->serialPort_serial_control->Read(tmp_answer_ptr, AT_BUFSIZ - (tmp_answer_ptr - tmp_answer));
|
||||
memset(tmp_answer3, 0, sizeof(char) * AT_BUFSIZ);
|
||||
strcpy(tmp_answer3, tmp_answer_ptr);
|
||||
|
||||
//cicopet read_count = read(tech_pvt->controldevfd, tmp_answer_ptr, AT_BUFSIZ - (tmp_answer_ptr - tmp_answer));
|
||||
|
||||
if (read_count == 0) {
|
||||
if (msecs_passed <= timeout_in_msec) {
|
||||
goto read;
|
||||
@@ -676,7 +638,6 @@ int gsmopen_serial_read_AT(private_t *tech_pvt, int look_for_ack, int timeout_us
|
||||
("read -1 bytes!!! Nenormalno! Marking this gsmopen_serial_device %s as dead, andif it is owned by a channel, hanging up. Maybe the phone is stuck, switched off, power down or battery exhausted\n",
|
||||
GSMOPEN_P_LOG, tech_pvt->controldevice_name);
|
||||
tech_pvt->controldev_dead = 1;
|
||||
//cicopet close(tech_pvt->controldevfd);
|
||||
ERRORA("gsmopen_serial_monitor failed, declaring %s dead\n", GSMOPEN_P_LOG, tech_pvt->controldevice_name);
|
||||
tech_pvt->running = 0;
|
||||
alarm_event(tech_pvt, ALARM_FAILED_INTERFACE, "gsmopen_serial_monitor failed, declaring interface dead");
|
||||
@@ -880,7 +841,6 @@ int gsmopen_serial_read_AT(private_t *tech_pvt, int look_for_ack, int timeout_us
|
||||
|
||||
if (!strlen(tech_pvt->callid_name) && tech_pvt->callid_name[0] != 1) {
|
||||
strncpy(tech_pvt->callid_name, tech_pvt->callid_number, sizeof(tech_pvt->callid_name));
|
||||
//strncpy(tech_pvt->callid_name, tech_pvt->callid_number, sizeof(tech_pvt->callid_name)) ;
|
||||
snprintf(tech_pvt->callid_name, sizeof(tech_pvt->callid_name), "GSMopen: %s", tech_pvt->callid_number);
|
||||
}
|
||||
|
||||
@@ -897,11 +857,7 @@ int gsmopen_serial_read_AT(private_t *tech_pvt, int look_for_ack, int timeout_us
|
||||
tech_pvt->phone_callflow = CALLFLOW_CALL_LINEBUSY;
|
||||
if (option_debug > 1)
|
||||
DEBUGA_GSMOPEN("|%s| CALLFLOW_CALL_LINEBUSY\n", GSMOPEN_P_LOG, tech_pvt->line_array.result[i]);
|
||||
//if (tech_pvt->interface_state != GSMOPEN_STATE_DOWN && tech_pvt->owner && tech_pvt->phone_callflow != CALLFLOW_CALL_DOWN)
|
||||
if (tech_pvt->interface_state != GSMOPEN_STATE_DOWN && tech_pvt->phone_callflow != CALLFLOW_CALL_DOWN) {
|
||||
//ast_setstate(tech_pvt->owner, GSMOPEN_STATE_BUSY);
|
||||
//gsmopen_queue_control(tech_pvt->owner, GSMOPEN_CONTROL_BUSY);
|
||||
//cicopet
|
||||
switch_core_session_t *session = NULL;
|
||||
switch_channel_t *channel = NULL;
|
||||
|
||||
@@ -910,13 +866,9 @@ int gsmopen_serial_read_AT(private_t *tech_pvt, int look_for_ack, int timeout_us
|
||||
session = switch_core_session_locate(tech_pvt->session_uuid_str);
|
||||
if (session) {
|
||||
channel = switch_core_session_get_channel(session);
|
||||
//gsmopen_hangup(tech_pvt);
|
||||
switch_core_session_rwunlock(session);
|
||||
switch_channel_hangup(channel, SWITCH_CAUSE_NONE);
|
||||
}
|
||||
//
|
||||
//tech_pvt->owner->hangupcause = GSMOPEN_CAUSE_FAILURE;
|
||||
//gsmopen_queue_control(tech_pvt->owner, GSMOPEN_CONTROL_HANGUP);
|
||||
|
||||
} else {
|
||||
ERRORA("Why BUSY now?\n", GSMOPEN_P_LOG);
|
||||
@@ -938,7 +890,6 @@ int gsmopen_serial_read_AT(private_t *tech_pvt, int look_for_ack, int timeout_us
|
||||
if (option_debug > 1)
|
||||
DEBUGA_GSMOPEN("|%s| CALLFLOW_CALL_NOCARRIER\n", GSMOPEN_P_LOG, tech_pvt->line_array.result[i]);
|
||||
if (tech_pvt->interface_state != GSMOPEN_STATE_DOWN) {
|
||||
//cicopet
|
||||
switch_core_session_t *session = NULL;
|
||||
switch_channel_t *channel = NULL;
|
||||
|
||||
@@ -947,13 +898,9 @@ int gsmopen_serial_read_AT(private_t *tech_pvt, int look_for_ack, int timeout_us
|
||||
session = switch_core_session_locate(tech_pvt->session_uuid_str);
|
||||
if (session) {
|
||||
channel = switch_core_session_get_channel(session);
|
||||
//gsmopen_hangup(tech_pvt);
|
||||
switch_core_session_rwunlock(session);
|
||||
switch_channel_hangup(channel, SWITCH_CAUSE_NONE);
|
||||
}
|
||||
//
|
||||
//tech_pvt->owner->hangupcause = GSMOPEN_CAUSE_FAILURE;
|
||||
//gsmopen_queue_control(tech_pvt->owner, GSMOPEN_CONTROL_HANGUP);
|
||||
} else {
|
||||
ERRORA("Why NO CARRIER now?\n", GSMOPEN_P_LOG);
|
||||
}
|
||||
@@ -1075,7 +1022,6 @@ int gsmopen_serial_read_AT(private_t *tech_pvt, int look_for_ack, int timeout_us
|
||||
if (option_debug > 1)
|
||||
DEBUGA_GSMOPEN("|%s| CALLFLOW_CALL_NOCARRIER\n", GSMOPEN_P_LOG, tech_pvt->line_array.result[i]);
|
||||
if (tech_pvt->interface_state != GSMOPEN_STATE_DOWN) {
|
||||
//cicopet
|
||||
switch_core_session_t *session = NULL;
|
||||
switch_channel_t *channel = NULL;
|
||||
|
||||
@@ -1084,7 +1030,6 @@ int gsmopen_serial_read_AT(private_t *tech_pvt, int look_for_ack, int timeout_us
|
||||
session = switch_core_session_locate(tech_pvt->session_uuid_str);
|
||||
if (session) {
|
||||
channel = switch_core_session_get_channel(session);
|
||||
//gsmopen_hangup(tech_pvt);
|
||||
switch_core_session_rwunlock(session);
|
||||
switch_channel_hangup(channel, SWITCH_CAUSE_NONE);
|
||||
}
|
||||
@@ -1097,9 +1042,6 @@ int gsmopen_serial_read_AT(private_t *tech_pvt, int look_for_ack, int timeout_us
|
||||
gsmopen_queue_control(tech_pvt->owner, GSMOPEN_CONTROL_HANGUP);
|
||||
DEBUGA_GSMOPEN("just sent GSMOPEN_CONTROL_HANGUP\n", GSMOPEN_P_LOG);
|
||||
}
|
||||
//
|
||||
//tech_pvt->owner->hangupcause = GSMOPEN_CAUSE_FAILURE;
|
||||
//gsmopen_queue_control(tech_pvt->owner, GSMOPEN_CONTROL_HANGUP);
|
||||
} else {
|
||||
ERRORA("Why NO CARRIER now?\n", GSMOPEN_P_LOG);
|
||||
}
|
||||
@@ -1121,7 +1063,6 @@ int gsmopen_serial_read_AT(private_t *tech_pvt, int look_for_ack, int timeout_us
|
||||
if (option_debug > 1)
|
||||
DEBUGA_GSMOPEN("|%s| CALLFLOW_CALL_NOCARRIER\n", GSMOPEN_P_LOG, tech_pvt->line_array.result[i]);
|
||||
if (tech_pvt->interface_state != GSMOPEN_STATE_DOWN) {
|
||||
//cicopet
|
||||
switch_core_session_t *session = NULL;
|
||||
switch_channel_t *channel = NULL;
|
||||
|
||||
@@ -1130,13 +1071,9 @@ int gsmopen_serial_read_AT(private_t *tech_pvt, int look_for_ack, int timeout_us
|
||||
session = switch_core_session_locate(tech_pvt->session_uuid_str);
|
||||
if (session) {
|
||||
channel = switch_core_session_get_channel(session);
|
||||
//gsmopen_hangup(tech_pvt);
|
||||
switch_core_session_rwunlock(session);
|
||||
switch_channel_hangup(channel, SWITCH_CAUSE_NONE);
|
||||
}
|
||||
//
|
||||
//tech_pvt->owner->hangupcause = GSMOPEN_CAUSE_FAILURE;
|
||||
//gsmopen_queue_control(tech_pvt->owner, GSMOPEN_CONTROL_HANGUP);
|
||||
} else {
|
||||
ERRORA("Why NO CARRIER now?\n", GSMOPEN_P_LOG);
|
||||
}
|
||||
@@ -1145,7 +1082,6 @@ int gsmopen_serial_read_AT(private_t *tech_pvt, int look_for_ack, int timeout_us
|
||||
|
||||
if ((strcmp(tech_pvt->line_array.result[i], tech_pvt->at_call_incoming) == 0)) {
|
||||
|
||||
//char list_command[64];
|
||||
|
||||
if (option_debug > 1)
|
||||
DEBUGA_GSMOPEN("|%s| CALLFLOW_CALL_INCOMING\n", GSMOPEN_P_LOG, tech_pvt->line_array.result[i]);
|
||||
@@ -1166,10 +1102,8 @@ int gsmopen_serial_read_AT(private_t *tech_pvt, int look_for_ack, int timeout_us
|
||||
if (tech_pvt->interface_state == CALLFLOW_CALL_DIALING || tech_pvt->interface_state == CALLFLOW_STATUS_EARLYMEDIA) {
|
||||
DEBUGA_PBX("just received a remote ANSWER\n", GSMOPEN_P_LOG);
|
||||
if (tech_pvt->phone_callflow == GSMOPEN_STATE_UP) {
|
||||
//gsmopen_queue_control(tech_pvt->owner, GSMOPEN_CONTROL_RINGING);
|
||||
DEBUGA_PBX("just sent GSMOPEN_CONTROL_RINGING\n", GSMOPEN_P_LOG);
|
||||
DEBUGA_PBX("going to send GSMOPEN_CONTROL_ANSWER\n", GSMOPEN_P_LOG);
|
||||
//gsmopen_queue_control(tech_pvt->owner, GSMOPEN_CONTROL_ANSWER);
|
||||
tech_pvt->interface_state = CALLFLOW_CALL_REMOTEANSWER;
|
||||
DEBUGA_PBX("just sent GSMOPEN_CONTROL_ANSWER\n", GSMOPEN_P_LOG);
|
||||
}
|
||||
@@ -1241,12 +1175,6 @@ int gsmopen_serial_read_AT(private_t *tech_pvt, int look_for_ack, int timeout_us
|
||||
if (res) {
|
||||
ERRORA("AT+CMGR (read SMS) didn't get OK from the phone, message sent was:|||%s|||\n", GSMOPEN_P_LOG, at_command);
|
||||
}
|
||||
/*
|
||||
res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CSCS=\"CIAPALO1\"");
|
||||
if (res) {
|
||||
ERRORA("AT+CSCS=\"CIAPALO1\" (set TE messages to GSM) didn't get OK from the phone\n", GSMOPEN_P_LOG);
|
||||
}
|
||||
*/
|
||||
memset(at_command, 0, sizeof(at_command));
|
||||
sprintf(at_command, "AT+CMGD=%d", tech_pvt->unread_sms_msg_id); /* delete the message */
|
||||
tech_pvt->unread_sms_msg_id = 0;
|
||||
@@ -1272,7 +1200,6 @@ int gsmopen_serial_read_AT(private_t *tech_pvt, int look_for_ack, int timeout_us
|
||||
|
||||
if ((strncmp(tech_pvt->line_array.result[i], "+MMGL:", 6) == 0)) { //TODO MOTOROLA SMS FIXME in config!
|
||||
int err = 0;
|
||||
//int unread_msg_id=0;
|
||||
|
||||
if (option_debug)
|
||||
DEBUGA_GSMOPEN("|%s| +MMGL: Listing Motorola SMSs!\n", GSMOPEN_P_LOG, tech_pvt->line_array.result[i]);
|
||||
@@ -1671,7 +1598,6 @@ int gsmopen_serial_read_AT(private_t *tech_pvt, int look_for_ack, int timeout_us
|
||||
|
||||
memset(content2, '\0', sizeof(content2));
|
||||
if (which_field == 1) {
|
||||
//FIXME why this? err = ucs2_to_utf8(tech_pvt, content, content2, sizeof(content2));
|
||||
err = ucs2_to_utf8(tech_pvt, content, content2, sizeof(content2));
|
||||
} else {
|
||||
err = 0;
|
||||
@@ -1731,12 +1657,14 @@ int gsmopen_serial_read_AT(private_t *tech_pvt, int look_for_ack, int timeout_us
|
||||
try {
|
||||
char content2[1000];
|
||||
SMSMessageRef sms;
|
||||
//MessageType messagetype;
|
||||
//Address servicecentreaddress;
|
||||
//Timestamp servicecentretimestamp;
|
||||
//Address sender_recipient_address;
|
||||
|
||||
sms = SMSMessage::decode(tech_pvt->line_array.result[i]); // dataCodingScheme = 8 , text=ciao 123 belè новости לק ראת ﺎﻠﺠﻤﻋﺓ 人大
|
||||
try {
|
||||
sms = SMSMessage::decode(tech_pvt->line_array.result[i]); // dataCodingScheme = 8 , text=ciao 123 belè новости לק ראת ﺎﻠﺠﻤﻋﺓ 人大
|
||||
}
|
||||
catch(...) {
|
||||
ERRORA("GsmException\n", GSMOPEN_P_LOG);
|
||||
return -1;
|
||||
}
|
||||
|
||||
DEBUGA_GSMOPEN("SMS=\n%s\n", GSMOPEN_P_LOG, sms->toString().c_str());
|
||||
|
||||
@@ -1769,14 +1697,11 @@ int gsmopen_serial_read_AT(private_t *tech_pvt, int look_for_ack, int timeout_us
|
||||
strncpy(tech_pvt->sms_servicecentreaddress, sms->serviceCentreAddress().toString().c_str(),
|
||||
sizeof(tech_pvt->sms_servicecentreaddress));
|
||||
tech_pvt->sms_messagetype = sms->messageType();
|
||||
//messagetype = sms->messageType();
|
||||
//servicecentreaddress = sms->serviceCentreAddress();
|
||||
//servicecentretimestamp = sms->serviceCentreTimestamp();
|
||||
//sender_recipient_address = sms->address();
|
||||
|
||||
}
|
||||
catch(GsmException & ge) {
|
||||
ERRORA("GsmException= |||%s|||\n", GSMOPEN_P_LOG, ge.what());
|
||||
catch(...) {
|
||||
ERRORA("GsmException\n", GSMOPEN_P_LOG);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
@@ -1881,7 +1806,6 @@ int gsmopen_serial_read_AT(private_t *tech_pvt, int look_for_ack, int timeout_us
|
||||
return 0;
|
||||
}
|
||||
|
||||
//cicopet int gsmopen_serial_write_AT(private_t * tech_pvt, const char *data)
|
||||
int gsmopen_serial_write_AT(private_t *tech_pvt, const char *data)
|
||||
{
|
||||
int howmany;
|
||||
@@ -1896,14 +1820,12 @@ int gsmopen_serial_write_AT(private_t *tech_pvt, const char *data)
|
||||
howmany = strlen(Data);
|
||||
|
||||
for (i = 0; i < howmany; i++) {
|
||||
//cicopetres = write(tech_pvt->controldevfd, &data[i], 1);
|
||||
res = tech_pvt->serialPort_serial_control->Write(&Data[i], 1);
|
||||
|
||||
if (res != 1) {
|
||||
DEBUGA_GSMOPEN("Error sending (%.1s): %d (%s)\n", GSMOPEN_P_LOG, &Data[i], res, strerror(errno));
|
||||
gsmopen_sleep(100000);
|
||||
for (count = 0; count < 10; count++) {
|
||||
//cicopet res = write(tech_pvt->controldevfd, &data[i], 1);
|
||||
res = tech_pvt->serialPort_serial_control->Write(&Data[i], 1);
|
||||
if (res == 1) {
|
||||
DEBUGA_GSMOPEN("Successfully RE-sent (%.1s): %d %d (%s)\n", GSMOPEN_P_LOG, &Data[i], count, res, strerror(errno));
|
||||
@@ -1922,7 +1844,6 @@ int gsmopen_serial_write_AT(private_t *tech_pvt, const char *data)
|
||||
("wrote -1 bytes!!! Nenormalno! Marking this gsmopen_serial_device %s as dead, andif it is owned by a channel, hanging up. Maybe the phone is stuck, switched off, power down or battery exhausted\n",
|
||||
GSMOPEN_P_LOG, tech_pvt->controldevice_name);
|
||||
tech_pvt->controldev_dead = 1;
|
||||
//cicopet close(tech_pvt->controldevfd);
|
||||
ERRORA("gsmopen_serial_monitor failed, declaring %s dead\n", GSMOPEN_P_LOG, tech_pvt->controldevice_name);
|
||||
tech_pvt->running = 0;
|
||||
alarm_event(tech_pvt, ALARM_FAILED_INTERFACE, "gsmopen_serial_monitor failed, declaring interface dead");
|
||||
@@ -1947,14 +1868,12 @@ int gsmopen_serial_write_AT(private_t *tech_pvt, const char *data)
|
||||
gsmopen_sleep(1000); /* release the cpu */
|
||||
}
|
||||
|
||||
//cicopet res = write(tech_pvt->controldevfd, "\r", 1);
|
||||
res = tech_pvt->serialPort_serial_control->Write((char *) "\r", 1);
|
||||
|
||||
if (res != 1) {
|
||||
DEBUGA_GSMOPEN("Error sending (carriage return): %d (%s)\n", GSMOPEN_P_LOG, res, strerror(errno));
|
||||
gsmopen_sleep(100000);
|
||||
for (count = 0; count < 10; count++) {
|
||||
//cicopet res = write(tech_pvt->controldevfd, "\r", 1);
|
||||
res = tech_pvt->serialPort_serial_control->Write((char *) "\r", 1);
|
||||
|
||||
if (res == 1) {
|
||||
@@ -1972,7 +1891,6 @@ int gsmopen_serial_write_AT(private_t *tech_pvt, const char *data)
|
||||
("wrote -1 bytes!!! Nenormalno! Marking this gsmopen_serial_device %s as dead, andif it is owned by a channel, hanging up. Maybe the phone is stuck, switched off, power down or battery exhausted\n",
|
||||
GSMOPEN_P_LOG, tech_pvt->controldevice_name);
|
||||
tech_pvt->controldev_dead = 1;
|
||||
//cicopet close(tech_pvt->controldevfd);
|
||||
ERRORA("gsmopen_serial_monitor failed, declaring %s dead\n", GSMOPEN_P_LOG, tech_pvt->controldevice_name);
|
||||
tech_pvt->running = 0;
|
||||
alarm_event(tech_pvt, ALARM_FAILED_INTERFACE, "gsmopen_serial_monitor failed, declaring interface dead");
|
||||
@@ -2011,14 +1929,12 @@ int gsmopen_serial_write_AT_nocr(private_t *tech_pvt, const char *data)
|
||||
howmany = strlen(Data);
|
||||
|
||||
for (i = 0; i < howmany; i++) {
|
||||
//cicopet res = write(tech_pvt->controldevfd, &data[i], 1);
|
||||
res = tech_pvt->serialPort_serial_control->Write(&Data[i], 1);
|
||||
|
||||
if (res != 1) {
|
||||
DEBUGA_GSMOPEN("Error sending (%.1s): %d (%s)\n", GSMOPEN_P_LOG, &Data[i], res, strerror(errno));
|
||||
gsmopen_sleep(100000);
|
||||
for (count = 0; count < 10; count++) {
|
||||
//cicopet res = write(tech_pvt->controldevfd, &data[i], 1);
|
||||
res = tech_pvt->serialPort_serial_control->Write(&Data[i], 1);
|
||||
if (res == 1)
|
||||
break;
|
||||
@@ -2034,7 +1950,6 @@ int gsmopen_serial_write_AT_nocr(private_t *tech_pvt, const char *data)
|
||||
("wrote -1 bytes!!! Nenormalno! Marking this gsmopen_serial_device %s as dead, andif it is owned by a channel, hanging up. Maybe the phone is stuck, switched off, power down or battery exhausted\n",
|
||||
GSMOPEN_P_LOG, tech_pvt->controldevice_name);
|
||||
tech_pvt->controldev_dead = 1;
|
||||
//cicopet close(tech_pvt->controldevfd);
|
||||
ERRORA("gsmopen_serial_monitor failed, declaring %s dead\n", GSMOPEN_P_LOG, tech_pvt->controldevice_name);
|
||||
tech_pvt->running = 0;
|
||||
alarm_event(tech_pvt, ALARM_FAILED_INTERFACE, "gsmopen_serial_monitor failed, declaring interface dead");
|
||||
@@ -2079,7 +1994,6 @@ int gsmopen_serial_write_AT_noack(private_t *tech_pvt, const char *data)
|
||||
("wrote -1 bytes!!! Nenormalno! Marking this gsmopen_serial_device %s as dead, andif it is owned by a channel, hanging up. Maybe the phone is stuck, switched off, power down or battery exhausted\n",
|
||||
GSMOPEN_P_LOG, tech_pvt->controldevice_name);
|
||||
tech_pvt->controldev_dead = 1;
|
||||
//cicopet close(tech_pvt->controldevfd);
|
||||
ERRORA("gsmopen_serial_monitor failed, declaring %s dead\n", GSMOPEN_P_LOG, tech_pvt->controldevice_name);
|
||||
tech_pvt->running = 0;
|
||||
alarm_event(tech_pvt, ALARM_FAILED_INTERFACE, "gsmopen_serial_monitor failed, declaring interface dead");
|
||||
@@ -2121,7 +2035,6 @@ int gsmopen_serial_write_AT_ack(private_t *tech_pvt, const char *data)
|
||||
("wrote -1 bytes!!! Nenormalno! Marking this gsmopen_serial_device %s as dead, and if it is owned by a channel, hanging up. Maybe the phone is stuck, switched off, powered down or battery exhausted\n",
|
||||
GSMOPEN_P_LOG, tech_pvt->controldevice_name);
|
||||
tech_pvt->controldev_dead = 1;
|
||||
//cicopet close(tech_pvt->controldevfd);
|
||||
ERRORA("gsmopen_serial_monitor failed, declaring %s dead\n", GSMOPEN_P_LOG, tech_pvt->controldevice_name);
|
||||
tech_pvt->running = 0;
|
||||
alarm_event(tech_pvt, ALARM_FAILED_INTERFACE, "gsmopen_serial_monitor failed, declaring interface dead");
|
||||
@@ -2138,7 +2051,6 @@ int gsmopen_serial_write_AT_ack(private_t *tech_pvt, const char *data)
|
||||
|
||||
return -1;
|
||||
}
|
||||
//cicopet at_result = gsmopen_serial_read_AT(tech_pvt, 1, 500000, 2, NULL, 1); // 2.5 sec timeout
|
||||
at_result = gsmopen_serial_read_AT(tech_pvt, 1, 100000, 0, NULL, 1); // 1/10th sec timeout
|
||||
UNLOCKA(tech_pvt->controldev_lock);
|
||||
POPPA_UNLOCKA(tech_pvt->controldev_lock);
|
||||
@@ -2166,7 +2078,6 @@ int gsmopen_serial_write_AT_ack_nocr_longtime(private_t *tech_pvt, const char *d
|
||||
("wrote -1 bytes!!! Nenormalno! Marking this gsmopen_serial_device %s as dead, and if it is owned by a channel, hanging up. Maybe the phone is stuck, switched off, powered down or battery exhausted\n",
|
||||
GSMOPEN_P_LOG, tech_pvt->controldevice_name);
|
||||
tech_pvt->controldev_dead = 1;
|
||||
//cicopet close(tech_pvt->controldevfd);
|
||||
ERRORA("gsmopen_serial_monitor failed, declaring %s dead\n", GSMOPEN_P_LOG, tech_pvt->controldevice_name);
|
||||
tech_pvt->running = 0;
|
||||
alarm_event(tech_pvt, ALARM_FAILED_INTERFACE, "gsmopen_serial_monitor failed, declaring interface dead");
|
||||
@@ -2211,7 +2122,6 @@ int gsmopen_serial_write_AT_expect1(private_t *tech_pvt, const char *data, const
|
||||
("wrote -1 bytes!!! Nenormalno! Marking this gsmopen_serial_device %s as dead, and if it is owned by a channel, hanging up. Maybe the phone is stuck, switched off, powered down or battery exhausted\n",
|
||||
GSMOPEN_P_LOG, tech_pvt->controldevice_name);
|
||||
tech_pvt->controldev_dead = 1;
|
||||
//cicopet close(tech_pvt->controldevfd);
|
||||
ERRORA("gsmopen_serial_monitor failed, declaring %s dead\n", GSMOPEN_P_LOG, tech_pvt->controldevice_name);
|
||||
tech_pvt->running = 0;
|
||||
alarm_event(tech_pvt, ALARM_FAILED_INTERFACE, "gsmopen_serial_monitor failed, declaring interface dead");
|
||||
@@ -2250,7 +2160,6 @@ int gsmopen_serial_AT_expect(private_t *tech_pvt, const char *expected_string, i
|
||||
if (option_debug > 1)
|
||||
DEBUGA_GSMOPEN("expecting: %s\n", GSMOPEN_P_LOG, expected_string);
|
||||
|
||||
//cicopet at_result = gsmopen_serial_read_AT(tech_pvt, 1, 500000, seconds, expected_string, expect_crlf); // 20.5 sec timeout, used for querying the SIM and sending SMSs
|
||||
at_result = gsmopen_serial_read_AT(tech_pvt, 1, 100000, seconds, expected_string, expect_crlf); // minimum 1/10th sec timeout
|
||||
UNLOCKA(tech_pvt->controldev_lock);
|
||||
POPPA_UNLOCKA(tech_pvt->controldev_lock);
|
||||
@@ -2294,8 +2203,6 @@ int gsmopen_serial_answer_AT(private_t *tech_pvt)
|
||||
}
|
||||
}
|
||||
res = gsmopen_serial_write_AT_expect(tech_pvt, "AT^DDSETEX=2", tech_pvt->at_dial_expect);
|
||||
//tech_pvt->interface_state = GSMOPEN_STATE_UP;
|
||||
//tech_pvt->phone_callflow = CALLFLOW_CALL_ACTIVE;
|
||||
DEBUGA_GSMOPEN("AT: call answered\n", GSMOPEN_P_LOG);
|
||||
return 0;
|
||||
}
|
||||
@@ -2337,7 +2244,6 @@ int gsmopen_serial_hangup_AT(private_t *tech_pvt)
|
||||
res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CHUP");
|
||||
if (res) {
|
||||
DEBUGA_GSMOPEN("at_hangup command timeout, command used: 'AT+CHUP'\n", GSMOPEN_P_LOG);
|
||||
//return -1;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -2373,16 +2279,6 @@ int gsmopen_serial_call_AT(private_t *tech_pvt, char *dstr)
|
||||
memset(at_command, 0, sizeof(at_command));
|
||||
tech_pvt->phone_callflow = CALLFLOW_CALL_DIALING;
|
||||
tech_pvt->interface_state = GSMOPEN_STATE_DIALING;
|
||||
//ast_uri_decode(dstr);
|
||||
/*
|
||||
size_t fixdstr = strspn(dstr, AST_DIGIT_ANYDIG);
|
||||
if (fixdstr == 0) {
|
||||
ERRORA("dial command failed because of invalid dial number. dial string was: %s\n",
|
||||
GSMOPEN_P_LOG, dstr);
|
||||
return -1;
|
||||
}
|
||||
*/
|
||||
//dstr[fixdstr] = '\0';
|
||||
sprintf(at_command, "%s%s%s", tech_pvt->at_dial_pre_number, dstr, tech_pvt->at_dial_post_number);
|
||||
DEBUGA_PBX("Dialstring %s\n", GSMOPEN_P_LOG, at_command);
|
||||
res = gsmopen_serial_write_AT_expect(tech_pvt, at_command, tech_pvt->at_dial_expect);
|
||||
@@ -2391,10 +2287,6 @@ int gsmopen_serial_call_AT(private_t *tech_pvt, char *dstr)
|
||||
return -1;
|
||||
}
|
||||
res = gsmopen_serial_write_AT_expect(tech_pvt, "AT^DDSETEX=2", tech_pvt->at_dial_expect);
|
||||
// jet - early audio
|
||||
//if (tech_pvt->at_early_audio) {
|
||||
//ast_queue_control(tech_pvt->owner, AST_CONTROL_ANSWER);
|
||||
//}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -2402,7 +2294,6 @@ int gsmopen_serial_call_AT(private_t *tech_pvt, char *dstr)
|
||||
int ucs2_to_utf8(private_t *tech_pvt, char *ucs2_in, char *utf8_out, size_t outbytesleft)
|
||||
{
|
||||
char converted[16000];
|
||||
//#ifndef WIN32
|
||||
iconv_t iconv_format;
|
||||
int iconv_res;
|
||||
char *outbuf;
|
||||
@@ -2416,7 +2307,6 @@ int ucs2_to_utf8(private_t *tech_pvt, char *ucs2_in, char *utf8_out, size_t outb
|
||||
memset(converted, '\0', sizeof(converted));
|
||||
|
||||
DEBUGA_GSMOPEN("ucs2_in=|%s|, utf8_out=|%s|\n", GSMOPEN_P_LOG, ucs2_in, utf8_out);
|
||||
/* cicopet */
|
||||
for (c = 0; c < (int) strlen(ucs2_in); c++) {
|
||||
sprintf(stringa, "0x%c%c", ucs2_in[c], ucs2_in[c + 1]);
|
||||
c++;
|
||||
@@ -2429,7 +2319,6 @@ int ucs2_to_utf8(private_t *tech_pvt, char *ucs2_in, char *utf8_out, size_t outb
|
||||
inbuf = converted;
|
||||
|
||||
iconv_format = iconv_open("UTF8", "UCS-2BE");
|
||||
//iconv_format = iconv_open("UTF8", "UCS2");
|
||||
if (iconv_format == (iconv_t) -1) {
|
||||
ERRORA("error: %s\n", GSMOPEN_P_LOG, strerror(errno));
|
||||
return -1;
|
||||
@@ -2456,14 +2345,11 @@ int ucs2_to_utf8(private_t *tech_pvt, char *ucs2_in, char *utf8_out, size_t outb
|
||||
GSMOPEN_P_LOG, iconv_res, inbuf, (int) inbytesleft, outbuf, (int) outbytesleft, converted, utf8_out);
|
||||
iconv_close(iconv_format);
|
||||
|
||||
//#endif //WIN32
|
||||
return 0;
|
||||
}
|
||||
|
||||
int utf8_to_iso_8859_1(private_t *tech_pvt, char *utf8_in, size_t inbytesleft, char *iso_8859_1_out, size_t outbytesleft)
|
||||
{
|
||||
/* cicopet */
|
||||
//#ifndef WIN32
|
||||
iconv_t iconv_format;
|
||||
int iconv_res;
|
||||
char *outbuf;
|
||||
@@ -2487,42 +2373,24 @@ int utf8_to_iso_8859_1(private_t *tech_pvt, char *utf8_in, size_t inbytesleft, c
|
||||
iconv_res = iconv(iconv_format, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
|
||||
#endif // WIN32
|
||||
if (iconv_res == (size_t) -1) {
|
||||
DEBUGA_GSMOPEN("cannot translate in iso_8859_1 error: %s %d\n", GSMOPEN_P_LOG, strerror(errno), errno);
|
||||
DEBUGA_GSMOPEN("cannot translate in iso_8859_1 error: %s (errno: %d)\n", GSMOPEN_P_LOG, strerror(errno), errno);
|
||||
return -1;
|
||||
}
|
||||
DEBUGA_GSMOPEN
|
||||
("iconv_res=%d, in=%s, inleft=%d, out=%s, outleft=%d, utf8_in=%s, iso_8859_1_out=%s\n",
|
||||
GSMOPEN_P_LOG, iconv_res, inbuf, (int) inbytesleft, outbuf, (int) outbytesleft, utf8_in, iso_8859_1_out);
|
||||
iconv_close(iconv_format);
|
||||
#if 0
|
||||
for (i = 0; i < 16000 - outbytesleft; i++) {
|
||||
memset(stringa, '\0', sizeof(stringa));
|
||||
memset(stringa2, '\0', sizeof(stringa2));
|
||||
sprintf(stringa, "%02X", converted[i]);
|
||||
DEBUGA_GSMOPEN("character is |%02X|\n", GSMOPEN_P_LOG, converted[i]);
|
||||
stringa2[0] = stringa[strlen(stringa) - 2];
|
||||
stringa2[1] = stringa[strlen(stringa) - 1];
|
||||
strncat(iso_8859_1_out, stringa2, ((outbytesleft - strlen(iso_8859_1_out)) - 1)); //add the received line to the buffer
|
||||
DEBUGA_GSMOPEN("stringa=%s, stringa2=%s, iso_8859_1_out=%s\n", GSMOPEN_P_LOG, stringa, stringa2, iso_8859_1_out);
|
||||
}
|
||||
#endif //0
|
||||
//#endif //WIN32
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int iso_8859_1_to_utf8(private_t *tech_pvt, char *iso_8859_1_in, char *utf8_out, size_t outbytesleft)
|
||||
{
|
||||
//#ifndef WIN32
|
||||
iconv_t iconv_format;
|
||||
int iconv_res;
|
||||
char *outbuf;
|
||||
char *inbuf;
|
||||
size_t inbytesleft;
|
||||
//int c;
|
||||
//char stringa[5];
|
||||
//double hexnum;
|
||||
//int i = 0;
|
||||
|
||||
DEBUGA_GSMOPEN("iso_8859_1_in=%s\n", GSMOPEN_P_LOG, iso_8859_1_in);
|
||||
|
||||
@@ -2553,14 +2421,11 @@ int iso_8859_1_to_utf8(private_t *tech_pvt, char *iso_8859_1_in, char *utf8_out,
|
||||
|
||||
iconv_close(iconv_format);
|
||||
|
||||
//#endif //WIN32
|
||||
return 0;
|
||||
}
|
||||
|
||||
int utf8_to_ucs2(private_t *tech_pvt, char *utf8_in, size_t inbytesleft, char *ucs2_out, size_t outbytesleft)
|
||||
{
|
||||
/* cicopet */
|
||||
//#ifndef WIN32
|
||||
iconv_t iconv_format;
|
||||
int iconv_res;
|
||||
char *outbuf;
|
||||
@@ -2608,7 +2473,6 @@ int utf8_to_ucs2(private_t *tech_pvt, char *utf8_in, size_t inbytesleft, char *u
|
||||
strncat(ucs2_out, stringa2, ((outbytesleft - strlen(ucs2_out)) - 1)); //add the received line to the buffer
|
||||
DEBUGA_GSMOPEN("stringa=%s, stringa2=%s, ucs2_out=%s\n", GSMOPEN_P_LOG, stringa, stringa2, ucs2_out);
|
||||
}
|
||||
//#endif //WIN32
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -2648,8 +2512,6 @@ int gsmopen_answer(private_t *tech_pvt)
|
||||
if (tech_pvt->owner) {
|
||||
DEBUGA_PBX("going to send GSMOPEN_STATE_UP\n", GSMOPEN_P_LOG);
|
||||
ast_setstate(tech_pvt->owner, GSMOPEN_STATE_UP);
|
||||
//ast_queue_control(tech_pvt->owner, GSMOPEN_CONTROL_ANSWER);
|
||||
//gsmopen_queue_control(tech_pvt->owner, GSMOPEN_CONTROL_ANSWER);
|
||||
DEBUGA_PBX("just sent GSMOPEN_STATE_UP\n", GSMOPEN_P_LOG);
|
||||
}
|
||||
}
|
||||
@@ -2668,7 +2530,6 @@ int gsmopen_ring(private_t *tech_pvt)
|
||||
session = switch_core_session_locate(tech_pvt->session_uuid_str);
|
||||
if (session) {
|
||||
switch_core_session_rwunlock(session);
|
||||
//DEBUGA_PBX("got session, let's exit\n", GSMOPEN_P_LOG);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -2752,17 +2613,9 @@ int gsmopen_call(private_t *tech_pvt, char *rdest, int timeout)
|
||||
|
||||
int result;
|
||||
|
||||
//gsmopen_sleep(5000);
|
||||
DEBUGA_GSMOPEN("Calling GSM, rdest is: %s\n", GSMOPEN_P_LOG, rdest);
|
||||
//gsmopen_signaling_write(tech_pvt, "SET AGC OFF");
|
||||
//gsmopen_sleep(10000);
|
||||
//gsmopen_signaling_write(tech_pvt, "SET AEC OFF");
|
||||
//gsmopen_sleep(10000);
|
||||
|
||||
result=gsmopen_serial_call(tech_pvt, rdest);
|
||||
//ERRORA("failed to communicate with GSM client, now exit\n", GSMOPEN_P_LOG);
|
||||
//return -1;
|
||||
//}
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -2788,19 +2641,10 @@ int gsmopen_senddigit(private_t *tech_pvt, char digit)
|
||||
|
||||
int gsmopen_sendsms(private_t *tech_pvt, char *dest, char *text)
|
||||
{
|
||||
//char *idest = data;
|
||||
//char rdest[256];
|
||||
//private_t *p = NULL;
|
||||
//char *device;
|
||||
//char *dest;
|
||||
//char *text;
|
||||
//char *stringp = NULL;
|
||||
//int found = 0;
|
||||
int failed = 0;
|
||||
int err = 0;
|
||||
char mesg_test[1024];
|
||||
|
||||
//strncpy(rdest, idest, sizeof(rdest) - 1);
|
||||
DEBUGA_GSMOPEN("GSMopenSendsms: dest=%s text=%s\n", GSMOPEN_P_LOG, dest, text);
|
||||
DEBUGA_GSMOPEN("START\n", GSMOPEN_P_LOG);
|
||||
/* we can use gsmopen_request to get the channel, but gsmopen_request would look for onowned channels, and probably we can send SMSs while a call is ongoing
|
||||
@@ -2840,7 +2684,6 @@ int gsmopen_sendsms(private_t *tech_pvt, char *dest, char *text)
|
||||
}
|
||||
SMSMessageRef smsMessage;
|
||||
smsMessage = new SMSSubmitMessage(smscommand, dest);
|
||||
//string pdu = smsMessage->encode();
|
||||
pdu = smsMessage->encode();
|
||||
strncpy(pdu2, pdu.c_str(), sizeof(pdu2) - 1);
|
||||
memset(smscommand, '\0', sizeof(smscommand));
|
||||
@@ -2854,10 +2697,16 @@ int gsmopen_sendsms(private_t *tech_pvt, char *dest, char *text)
|
||||
|
||||
tech_pvt->no_ucs2 = 0;
|
||||
tech_pvt->sms_pdu_not_supported = 1;
|
||||
|
||||
ok = gsmopen_sendsms(tech_pvt, dest, text);
|
||||
|
||||
tech_pvt->no_ucs2 = 1;
|
||||
tech_pvt->sms_pdu_not_supported = 0;
|
||||
|
||||
err = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CMGF=0");
|
||||
if (err) {
|
||||
ERRORA("AT+CMGF=0 (set message sending to PDU (as opposed to TEXT) didn't get OK from the phone\n", GSMOPEN_P_LOG);
|
||||
}
|
||||
return ok;
|
||||
}
|
||||
|
||||
@@ -2876,13 +2725,6 @@ int gsmopen_sendsms(private_t *tech_pvt, char *dest, char *text)
|
||||
ERRORA("AT+CMGF=1 (set message sending to TEXT (as opposed to PDU) didn't get OK from the phone\n", GSMOPEN_P_LOG);
|
||||
}
|
||||
|
||||
/*
|
||||
err = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CSCS=\"UCS2\"");
|
||||
if (err) {
|
||||
ERRORA("AT+CSCS=\"UCS2\" (set TE messages to ucs2) didn't get OK from the phone\n", GSMOPEN_P_LOG);
|
||||
}
|
||||
*/
|
||||
|
||||
memset(dest2, '\0', sizeof(dest2));
|
||||
utf8_to_ucs2(tech_pvt, dest, strlen(dest), dest2, sizeof(dest2));
|
||||
sprintf(smscommand, "AT+CMGS=\"%s\"", dest2);
|
||||
@@ -2942,7 +2784,6 @@ int gsmopen_sendsms(private_t *tech_pvt, char *dest, char *text)
|
||||
//TODO would be better to unlock controldev here
|
||||
if (err) {
|
||||
ERRORA("Error writing SMS text to the cellphone memory\n", GSMOPEN_P_LOG);
|
||||
//return RESULT_FAILURE;
|
||||
failed = 1;
|
||||
goto uscita;
|
||||
}
|
||||
@@ -2951,7 +2792,6 @@ int gsmopen_sendsms(private_t *tech_pvt, char *dest, char *text)
|
||||
err = gsmopen_serial_write_AT_expect_longtime(tech_pvt, smscommand, "OK");
|
||||
if (err) {
|
||||
ERRORA("Error sending SMS from the cellphone memory\n", GSMOPEN_P_LOG);
|
||||
//return RESULT_FAILURE;
|
||||
failed = 1;
|
||||
goto uscita;
|
||||
}
|
||||
@@ -2982,7 +2822,6 @@ int gsmopen_sendsms(private_t *tech_pvt, char *dest, char *text)
|
||||
|
||||
tech_pvt->at_cmgw[0] = '\0';
|
||||
}
|
||||
//gsmopen_sleep(500000); //.5 secs
|
||||
UNLOCKA(tech_pvt->controldev_lock);
|
||||
POPPA_UNLOCKA(&tech_pvt->controldev_lock);
|
||||
}
|
||||
@@ -3062,15 +2901,6 @@ int gsmopen_serial_getstatus_AT(private_t *tech_pvt)
|
||||
if (!p)
|
||||
return -1;
|
||||
|
||||
#if 0
|
||||
if (p->owner) {
|
||||
if (p->owner->_state != AST_STATE_UP && p->owner->_state != AST_STATE_DOWN) {
|
||||
DEBUGA_AT("No getstatus, we're neither UP nor DOWN\n", GSMOPEN_P_LOG);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
PUSHA_UNLOCKA(p->controldev_lock);
|
||||
LOKKA(p->controldev_lock);
|
||||
res = gsmopen_serial_write_AT_ack(p, "AT");
|
||||
@@ -3144,57 +2974,8 @@ int gsmopen_serial_getstatus_AT(private_t *tech_pvt)
|
||||
}
|
||||
|
||||
if (strlen(p->sms_message)) {
|
||||
#if 0
|
||||
|
||||
manager_event(EVENT_FLAG_SYSTEM, "GSMOPENincomingsms", "Interface: %s\r\nSMS_Message: %s\r\n", p->name, p->sms_message);
|
||||
|
||||
if (strlen(p->sms_receiving_program)) {
|
||||
int fd1[2];
|
||||
pid_t pid1;
|
||||
char *arg1[] = { p->sms_receiving_program, (char *) NULL };
|
||||
int i;
|
||||
|
||||
DEBUGA_AT("incoming SMS message:---%s---\n", GSMOPEN_P_LOG, p->sms_message);
|
||||
pipe(fd1);
|
||||
pid1 = switch_fork();
|
||||
|
||||
if (pid1 == 0) { //child
|
||||
int err;
|
||||
|
||||
dup2(fd1[0], 0); // Connect stdin to pipe output
|
||||
close(fd1[1]); // close input pipe side
|
||||
setsid(); //session id
|
||||
err = execvp(arg1[0], arg1); //exec our program, with stdin connected to pipe output
|
||||
if (err) {
|
||||
ERRORA
|
||||
("'sms_receiving_program' is set in config file to '%s', and it gave us back this error: %d, (%s). SMS received was:---%s---\n",
|
||||
GSMOPEN_P_LOG, p->sms_receiving_program, err, strerror(errno), p->sms_message);
|
||||
}
|
||||
close(fd1[0]); // close output pipe side
|
||||
} //starting here continue the parent
|
||||
close(fd1[0]); // close output pipe side
|
||||
// write the msg on the pipe input
|
||||
for (i = 0; i < strlen(p->sms_message); i++) {
|
||||
write(fd1[1], &p->sms_message[i], 1);
|
||||
}
|
||||
close(fd1[1]); // close pipe input, let our program know we've finished
|
||||
} else {
|
||||
ERRORA
|
||||
("got SMS incoming message, but 'sms_receiving_program' is not set in config file. SMS received was:---%s---\n",
|
||||
GSMOPEN_P_LOG, p->sms_message);
|
||||
}
|
||||
#endif //0
|
||||
DEBUGA_GSMOPEN("got SMS incoming message. SMS received was:---%s---\n", GSMOPEN_P_LOG, p->sms_message);
|
||||
}
|
||||
#if 0 //is this one needed? maybe it can interrupt an incoming call that is just to announce itself
|
||||
if (p->phone_callflow == CALLFLOW_CALL_IDLE && p->interface_state == AST_STATE_DOWN && p->owner == NULL) {
|
||||
/* we're not in a call, neither calling */
|
||||
res = gsmopen_serial_write_AT_ack(p, "AT+CKPD=\"EEE\"");
|
||||
if (res) {
|
||||
ERRORA("AT+CKPD=\"EEE\" (cellphone screen back to user) didn't get OK from the phone\n", GSMOPEN_P_LOG);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,66 +33,15 @@
|
||||
|
||||
#include "gsmopen.h"
|
||||
|
||||
#if 0
|
||||
#ifdef WIN32
|
||||
/***************/
|
||||
// from http://www.openasthra.com/c-tidbits/gettimeofday-function-for-windows/
|
||||
|
||||
#include <time.h>
|
||||
|
||||
#if defined(_MSC_VER) || defined(_MSC_EXTENSIONS)
|
||||
#define DELTA_EPOCH_IN_MICROSECS 11644473600000000Ui64
|
||||
#else /* */
|
||||
#define DELTA_EPOCH_IN_MICROSECS 11644473600000000ULL
|
||||
#endif /* */
|
||||
struct sk_timezone {
|
||||
int tz_minuteswest; /* minutes W of Greenwich */
|
||||
int tz_dsttime; /* type of dst correction */
|
||||
};
|
||||
int gettimeofday(struct timeval *tv, struct sk_timezone *tz)
|
||||
{
|
||||
FILETIME ft;
|
||||
unsigned __int64 tmpres = 0;
|
||||
static int tzflag;
|
||||
if (NULL != tv) {
|
||||
GetSystemTimeAsFileTime(&ft);
|
||||
tmpres |= ft.dwHighDateTime;
|
||||
tmpres <<= 32;
|
||||
tmpres |= ft.dwLowDateTime;
|
||||
|
||||
/*converting file time to unix epoch */
|
||||
tmpres /= 10; /*convert into microseconds */
|
||||
tmpres -= DELTA_EPOCH_IN_MICROSECS;
|
||||
tv->tv_sec = (long) (tmpres / 1000000UL);
|
||||
tv->tv_usec = (long) (tmpres % 1000000UL);
|
||||
}
|
||||
if (NULL != tz) {
|
||||
if (!tzflag) {
|
||||
_tzset();
|
||||
tzflag++;
|
||||
}
|
||||
tz->tz_minuteswest = _timezone / 60;
|
||||
tz->tz_dsttime = _daylight;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/***************/
|
||||
#endif /* WIN32 */
|
||||
#endif //0
|
||||
SWITCH_BEGIN_EXTERN_C SWITCH_MODULE_LOAD_FUNCTION(mod_gsmopen_load);
|
||||
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_gsmopen_shutdown);
|
||||
SWITCH_MODULE_DEFINITION(mod_gsmopen, mod_gsmopen_load, mod_gsmopen_shutdown, NULL);
|
||||
SWITCH_END_EXTERN_C
|
||||
#define GSMOPEN_CHAT_PROTO "sms"
|
||||
#if 1
|
||||
SWITCH_STANDARD_API(gsm_function);
|
||||
/* BEGIN: Changes here */
|
||||
#define GSM_SYNTAX "list [full] || console || AT_command || remove < interface_name | interface_id > || reload"
|
||||
/* END: Changes heres */
|
||||
SWITCH_STANDARD_API(gsmopen_function);
|
||||
#define GSMOPEN_SYNTAX "interface_name AT_command"
|
||||
#endif //0
|
||||
|
||||
SWITCH_STANDARD_API(gsmopen_boost_audio_function);
|
||||
#define GSMOPEN_BOOST_AUDIO_SYNTAX "interface_name [<play|capt> <in decibels: -40 ... 0 ... +40>]"
|
||||
@@ -100,10 +49,8 @@ SWITCH_STANDARD_API(sendsms_function);
|
||||
#define SENDSMS_SYNTAX "gsmopen_sendsms interface_name destination_number SMS_text"
|
||||
SWITCH_STANDARD_API(gsmopen_dump_function);
|
||||
#define GSMOPEN_DUMP_SYNTAX "gsmopen_dump <interface_name|list>"
|
||||
/* BEGIN: Changes here */
|
||||
#define FULL_RELOAD 0
|
||||
#define SOFT_RELOAD 1
|
||||
/* END: Changes heres */
|
||||
|
||||
const char *interface_status[] = { /* should match GSMOPEN_STATE_xxx in gsmopen.h */
|
||||
"IDLE",
|
||||
@@ -181,15 +128,9 @@ int running = 0;
|
||||
SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_dialplan, globals.dialplan);
|
||||
SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_context, globals.context);
|
||||
SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_destination, globals.destination);
|
||||
//SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_codec_string, globals.codec_string);
|
||||
//SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_codec_rates_string, globals.codec_rates_string);
|
||||
|
||||
/* BEGIN: Changes here */
|
||||
static switch_status_t interface_exists(char *the_interface);
|
||||
#if 1
|
||||
static switch_status_t remove_interface(char *the_interface);
|
||||
#endif //0
|
||||
/* END: Changes here */
|
||||
|
||||
static switch_status_t channel_on_init(switch_core_session_t *session);
|
||||
static switch_status_t channel_on_hangup(switch_core_session_t *session);
|
||||
@@ -264,8 +205,6 @@ switch_status_t gsmopen_tech_init(private_t *tech_pvt, switch_core_session_t *se
|
||||
ERRORA("gsmopen_codec FAILED\n", GSMOPEN_P_LOG);
|
||||
return SWITCH_STATUS_FALSE;
|
||||
}
|
||||
//teletone_dtmf_detect_init(&tech_pvt->dtmf_detect, tech_pvt->read_codec.implementation->actual_samples_per_second);
|
||||
//teletone_dtmf_detect_init(&tech_pvt->dtmf_detect, 8000);
|
||||
dtmf_rx_init(&tech_pvt->dtmf_state, NULL, NULL);
|
||||
dtmf_rx_parms(&tech_pvt->dtmf_state, 0, 10, 10, -99);
|
||||
|
||||
@@ -300,7 +239,6 @@ switch_status_t gsmopen_tech_init(private_t *tech_pvt, switch_core_session_t *se
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/* BEGIN: Changes here */
|
||||
static switch_status_t interface_exists(char *the_interface)
|
||||
{
|
||||
int i;
|
||||
@@ -338,7 +276,6 @@ static switch_status_t interface_exists(char *the_interface)
|
||||
return SWITCH_STATUS_FALSE;
|
||||
}
|
||||
|
||||
#if 1
|
||||
static switch_status_t remove_interface(char *the_interface)
|
||||
{
|
||||
int x = 10;
|
||||
@@ -353,10 +290,7 @@ static switch_status_t remove_interface(char *the_interface)
|
||||
private_t *tech_pvt = NULL;
|
||||
switch_status_t status;
|
||||
|
||||
//running = 0;
|
||||
|
||||
//XXX if (*the_interface == '#') { /* remove by interface id or interface name */
|
||||
//XXX the_interface++;
|
||||
switch_assert(the_interface);
|
||||
interface_id = atoi(the_interface);
|
||||
|
||||
@@ -372,14 +306,6 @@ static switch_status_t remove_interface(char *the_interface)
|
||||
}
|
||||
}
|
||||
}
|
||||
//XXX } //else { /* remove by gsmopen_user */
|
||||
//for (interface_id = 0; interface_id < GSMOPEN_MAX_INTERFACES; interface_id++) {
|
||||
//if (strcmp(globals.GSMOPEN_INTERFACES[interface_id].gsmopen_user, the_interface) == 0) {
|
||||
//tech_pvt = &globals.GSMOPEN_INTERFACES[interface_id];
|
||||
//break;
|
||||
//}
|
||||
//}
|
||||
//}
|
||||
|
||||
if (!tech_pvt) {
|
||||
DEBUGA_GSMOPEN("interface '%s' does not exist\n", GSMOPEN_P_LOG, the_interface);
|
||||
@@ -396,38 +322,15 @@ static switch_status_t remove_interface(char *the_interface)
|
||||
globals.GSMOPEN_INTERFACES[interface_id].running = 0;
|
||||
|
||||
if (globals.GSMOPEN_INTERFACES[interface_id].gsmopen_signaling_thread) {
|
||||
#if 1
|
||||
#ifdef WIN32
|
||||
switch_file_write(tech_pvt->GSMopenHandles.fdesc[1], "sciutati", &howmany); // let's the controldev_thread die
|
||||
#else /* WIN32 */
|
||||
howmany = write(tech_pvt->GSMopenHandles.fdesc[1], "sciutati", howmany);
|
||||
#endif /* WIN32 */
|
||||
#endif //0
|
||||
DEBUGA_GSMOPEN("HERE will shutdown gsmopen_signaling_thread of '%s'\n", GSMOPEN_P_LOG, the_interface);
|
||||
}
|
||||
|
||||
if (globals.GSMOPEN_INTERFACES[interface_id].gsmopen_api_thread) {
|
||||
#if 0
|
||||
#ifdef WIN32
|
||||
if (SendMessage(tech_pvt->GSMopenHandles.win32_hInit_MainWindowHandle, WM_DESTROY, 0, 0) == FALSE) { // let's the gsmopen_api_thread_func die
|
||||
DEBUGA_GSMOPEN("got FALSE here, thread probably was already dead. GetLastError returned: %d\n", GSMOPEN_P_LOG, GetLastError());
|
||||
globals.GSMOPEN_INTERFACES[interface_id].gsmopen_api_thread = NULL;
|
||||
}
|
||||
#else
|
||||
XEvent e;
|
||||
Atom atom1 = XInternAtom(tech_pvt->GSMopenHandles.disp, "GSMOPENCONTROLAPI_MESSAGE_BEGIN", False);
|
||||
memset(&e, 0, sizeof(e));
|
||||
e.xclient.type = ClientMessage;
|
||||
e.xclient.message_type = atom1; /* leading message */
|
||||
e.xclient.display = tech_pvt->GSMopenHandles.disp;
|
||||
e.xclient.window = tech_pvt->GSMopenHandles.gsmopen_win;
|
||||
e.xclient.format = 8;
|
||||
|
||||
XSendEvent(tech_pvt->GSMopenHandles.disp, tech_pvt->GSMopenHandles.win, False, 0, &e);
|
||||
XSync(tech_pvt->GSMopenHandles.disp, False);
|
||||
#endif //WIN32
|
||||
#endif //0
|
||||
|
||||
DEBUGA_GSMOPEN("HERE will shutdown gsmopen_api_thread of '%s'\n", GSMOPEN_P_LOG, the_interface);
|
||||
}
|
||||
|
||||
@@ -445,9 +348,7 @@ static switch_status_t remove_interface(char *the_interface)
|
||||
}
|
||||
|
||||
fd = tech_pvt->controldevfd;
|
||||
//DEBUGA_GSMOPEN("SHUTDOWN tech_pvt->controldevfd=%d\n", GSMOPEN_P_LOG, tech_pvt->controldevfd);
|
||||
if (fd) {
|
||||
//close(fd);
|
||||
tech_pvt->controldevfd = -1;
|
||||
DEBUGA_GSMOPEN("SHUTDOWN tech_pvt->controldevfd=%d\n", GSMOPEN_P_LOG, tech_pvt->controldevfd);
|
||||
}
|
||||
@@ -489,12 +390,8 @@ static switch_status_t remove_interface(char *the_interface)
|
||||
globals.GSMOPEN_INTERFACES[interface_id].running = 1;
|
||||
|
||||
end:
|
||||
//running = 1;
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
}
|
||||
#endif //0
|
||||
|
||||
/* END: Changes here */
|
||||
|
||||
/*
|
||||
State methods that get called when the state changes to the specific state
|
||||
@@ -513,7 +410,6 @@ static switch_status_t channel_on_init(switch_core_session_t *session)
|
||||
|
||||
channel = switch_core_session_get_channel(session);
|
||||
switch_assert(channel != NULL);
|
||||
//ERRORA("%s CHANNEL INIT\n", GSMOPEN_P_LOG, tech_pvt->name);
|
||||
switch_mutex_lock(tech_pvt->flag_mutex);
|
||||
switch_set_flag(tech_pvt, TFLAG_IO);
|
||||
switch_mutex_unlock(tech_pvt->flag_mutex);
|
||||
@@ -610,9 +506,7 @@ static switch_status_t channel_on_hangup(switch_core_session_t *session)
|
||||
}
|
||||
|
||||
tech_pvt->interface_state = GSMOPEN_STATE_IDLE;
|
||||
//FIXME if (tech_pvt->phone_callflow == CALLFLOW_STATUS_FINISHED) {
|
||||
tech_pvt->phone_callflow = CALLFLOW_CALL_IDLE;
|
||||
//FIXME }
|
||||
switch_mutex_unlock(globals.mutex);
|
||||
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
@@ -674,7 +568,6 @@ static switch_status_t channel_kill_channel(switch_core_session_t *session, int
|
||||
break;
|
||||
case SWITCH_SIG_BREAK:
|
||||
DEBUGA_GSMOPEN("%s CHANNEL got SWITCH_SIG_BREAK\n", GSMOPEN_P_LOG, switch_channel_get_name(channel));
|
||||
//switch_set_flag(tech_pvt, TFLAG_BREAK);
|
||||
switch_mutex_lock(tech_pvt->flag_mutex);
|
||||
switch_set_flag(tech_pvt, TFLAG_BREAK);
|
||||
switch_mutex_unlock(tech_pvt->flag_mutex);
|
||||
@@ -861,7 +754,6 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch
|
||||
switch_swap_linear((int16_t *) (*frame)->data, (int) (*frame)->datalen / 2);
|
||||
}
|
||||
#endif
|
||||
//DEBUGA_GSMOPEN("HERE\n", GSMOPEN_P_LOG);
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -911,7 +803,6 @@ static switch_status_t channel_write_frame(switch_core_session_t *session, switc
|
||||
}
|
||||
#endif
|
||||
|
||||
//switch_core_timer_next(&tech_pvt->timer_write);
|
||||
gsmopen_sound_boost(frame->data, frame->samples, tech_pvt->playback_boost);
|
||||
if (!tech_pvt->no_sound) {
|
||||
sent = tech_pvt->serialPort_serial_audio->Write((char *) frame->data, (int) (frame->datalen));
|
||||
@@ -934,7 +825,6 @@ static switch_status_t channel_answer_channel(switch_core_session_t *session)
|
||||
tech_pvt = (private_t *) switch_core_session_get_private(session);
|
||||
switch_assert(tech_pvt != NULL);
|
||||
|
||||
//ERRORA("%s CHANNEL INIT\n", GSMOPEN_P_LOG, tech_pvt->name);
|
||||
switch_mutex_lock(tech_pvt->flag_mutex);
|
||||
switch_set_flag(tech_pvt, TFLAG_IO);
|
||||
switch_mutex_unlock(tech_pvt->flag_mutex);
|
||||
@@ -1088,11 +978,6 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi
|
||||
switch_mutex_lock(globals.mutex);
|
||||
if (strncmp("ANY", interface_name, strlen(interface_name)) == 0 || strncmp("RR", interface_name, strlen(interface_name)) == 0) {
|
||||
/* we've been asked for the "ANY" interface, let's find the first idle interface */
|
||||
//DEBUGA_GSMOPEN("Finding one available gsmopen interface\n", GSMOPEN_P_LOG);
|
||||
//tech_pvt = find_available_gsmopen_interface(NULL);
|
||||
//if (tech_pvt)
|
||||
//found = 1;
|
||||
//} else if (strncmp("RR", interface_name, strlen(interface_name)) == 0) {
|
||||
/* Find the first idle interface using Round Robin */
|
||||
DEBUGA_GSMOPEN("Finding one available gsmopen interface RR\n", GSMOPEN_P_LOG);
|
||||
tech_pvt = find_available_gsmopen_interface_rr(NULL);
|
||||
@@ -1135,7 +1020,6 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi
|
||||
DEBUGA_GSMOPEN("2 SESSION_DESTROY %s\n", GSMOPEN_P_LOG, switch_core_session_get_uuid(*new_session));
|
||||
switch_core_session_destroy(new_session);
|
||||
switch_mutex_unlock(globals.mutex);
|
||||
//return SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER;
|
||||
return SWITCH_CAUSE_NORMAL_CIRCUIT_CONGESTION;
|
||||
}
|
||||
|
||||
@@ -1157,7 +1041,6 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi
|
||||
char name[128];
|
||||
|
||||
snprintf(name, sizeof(name), "gsmopen/%s", outbound_profile->destination_number);
|
||||
//snprintf(name, sizeof(name), "gsmopen/%s", tech_pvt->name);
|
||||
switch_channel_set_name(channel, name);
|
||||
caller_profile = switch_caller_profile_clone(*new_session, outbound_profile);
|
||||
switch_channel_set_caller_profile(channel, caller_profile);
|
||||
@@ -1174,7 +1057,6 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi
|
||||
rdest = strchr(caller_profile->destination_number, '/');
|
||||
*rdest++ = '\0';
|
||||
|
||||
//gsmopen_call(tech_pvt, rdest, 30);
|
||||
|
||||
switch_copy_string(tech_pvt->session_uuid_str, switch_core_session_get_uuid(*new_session), sizeof(tech_pvt->session_uuid_str));
|
||||
caller_profile = tech_pvt->caller_profile;
|
||||
@@ -1335,7 +1217,6 @@ static switch_status_t load_config(int reload_type)
|
||||
const char *at_indicator_callsetupincoming_string = "CIEV: 6;1";
|
||||
const char *at_indicator_callsetupoutgoing_string = "CIEV: 6;2";
|
||||
const char *at_indicator_callsetupremoteringing_string = "CIEV: 6;3";
|
||||
//const char *sms_receiving_program = "/usr/local/bin/ciapalo";
|
||||
const char *at_early_audio = "0";
|
||||
const char *at_after_preinit_pause = "500000";
|
||||
const char *at_initial_pause = "500000";
|
||||
@@ -1487,8 +1368,6 @@ static switch_status_t load_config(int reload_type)
|
||||
at_indicator_callsetupoutgoing_string = val;
|
||||
} else if (!strcasecmp(var, "at_indicator_callsetupremoteringing_string")) {
|
||||
at_indicator_callsetupremoteringing_string = val;
|
||||
//} else if (!strcasecmp(var, "sms_receiving_program")) {
|
||||
//sms_receiving_program = val;
|
||||
} else if (!strcasecmp(var, "portaudiocindex")) {
|
||||
portaudiocindex = val;
|
||||
} else if (!strcasecmp(var, "portaudiopindex")) {
|
||||
@@ -1521,7 +1400,6 @@ static switch_status_t load_config(int reload_type)
|
||||
|
||||
}
|
||||
|
||||
/* BEGIN: Changes here */
|
||||
if (reload_type == SOFT_RELOAD) {
|
||||
char the_interface[256];
|
||||
sprintf(the_interface, "#%s", name);
|
||||
@@ -1530,7 +1408,6 @@ static switch_status_t load_config(int reload_type)
|
||||
continue;
|
||||
}
|
||||
}
|
||||
/* END: Changes here */
|
||||
|
||||
if (!id) {
|
||||
ERRORA("interface missing REQUIRED param 'id'\n", GSMOPEN_P_LOG);
|
||||
@@ -1659,7 +1536,6 @@ static switch_status_t load_config(int reload_type)
|
||||
switch_set_string(globals.GSMOPEN_INTERFACES[interface_id].at_indicator_callsetupoutgoing_string, at_indicator_callsetupoutgoing_string);
|
||||
switch_set_string(globals.GSMOPEN_INTERFACES[interface_id].at_indicator_callsetupremoteringing_string,
|
||||
at_indicator_callsetupremoteringing_string);
|
||||
//switch_set_string(globals.GSMOPEN_INTERFACES[interface_id].sms_receiving_program, sms_receiving_program);
|
||||
globals.GSMOPEN_INTERFACES[interface_id].at_early_audio = atoi(at_early_audio);
|
||||
globals.GSMOPEN_INTERFACES[interface_id].at_after_preinit_pause = atoi(at_after_preinit_pause);
|
||||
globals.GSMOPEN_INTERFACES[interface_id].at_initial_pause = atoi(at_initial_pause);
|
||||
@@ -1692,7 +1568,6 @@ static switch_status_t load_config(int reload_type)
|
||||
gsmopen_serial_init(&globals.GSMOPEN_INTERFACES[interface_id], globals.GSMOPEN_INTERFACES[interface_id].controldevice_speed);
|
||||
if (globals.GSMOPEN_INTERFACES[interface_id].controldevfd == -1) {
|
||||
ERRORA("STARTING interface_id=%u FAILED: gsmopen_serial_init failed\n", GSMOPEN_P_LOG, interface_id);
|
||||
//return SWITCH_STATUS_FALSE;
|
||||
globals.GSMOPEN_INTERFACES[interface_id].running = 0;
|
||||
alarm_event(&globals.GSMOPEN_INTERFACES[interface_id], ALARM_FAILED_INTERFACE, "gsmopen_serial_init failed");
|
||||
globals.GSMOPEN_INTERFACES[interface_id].active = 0;
|
||||
@@ -1717,7 +1592,6 @@ static switch_status_t load_config(int reload_type)
|
||||
}
|
||||
if (res) {
|
||||
ERRORA("STARTING interface_id=%u FAILED\n", GSMOPEN_P_LOG, interface_id);
|
||||
//return SWITCH_STATUS_FALSE;
|
||||
globals.GSMOPEN_INTERFACES[interface_id].running = 0;
|
||||
alarm_event(&globals.GSMOPEN_INTERFACES[interface_id], ALARM_FAILED_INTERFACE, "gsmopen_serial_config failed");
|
||||
globals.GSMOPEN_INTERFACES[interface_id].active = 0;
|
||||
@@ -1731,7 +1605,6 @@ static switch_status_t load_config(int reload_type)
|
||||
if (serial_audio_init(&globals.GSMOPEN_INTERFACES[interface_id])) {
|
||||
ERRORA("serial_audio_init failed\n", GSMOPEN_P_LOG);
|
||||
ERRORA("STARTING interface_id=%u FAILED\n", GSMOPEN_P_LOG, interface_id);
|
||||
//return SWITCH_STATUS_FALSE;
|
||||
globals.GSMOPEN_INTERFACES[interface_id].running = 0;
|
||||
alarm_event(&globals.GSMOPEN_INTERFACES[interface_id], ALARM_FAILED_INTERFACE, "serial_audio_init failed");
|
||||
globals.GSMOPEN_INTERFACES[interface_id].active = 0;
|
||||
@@ -1743,7 +1616,6 @@ static switch_status_t load_config(int reload_type)
|
||||
if (serial_audio_shutdown(&globals.GSMOPEN_INTERFACES[interface_id])) {
|
||||
ERRORA("serial_audio_shutdown failed\n", GSMOPEN_P_LOG);
|
||||
ERRORA("STARTING interface_id=%u FAILED\n", GSMOPEN_P_LOG, interface_id);
|
||||
//return SWITCH_STATUS_FALSE;
|
||||
globals.GSMOPEN_INTERFACES[interface_id].running = 0;
|
||||
alarm_event(&globals.GSMOPEN_INTERFACES[interface_id], ALARM_FAILED_INTERFACE, "serial_audio_shutdown failed");
|
||||
globals.GSMOPEN_INTERFACES[interface_id].active = 0;
|
||||
@@ -1756,8 +1628,6 @@ static switch_status_t load_config(int reload_type)
|
||||
|
||||
globals.GSMOPEN_INTERFACES[interface_id].active = 1;
|
||||
|
||||
//gsmopen_store_boost((char *)"5", &globals.GSMOPEN_INTERFACES[interface_id].capture_boost); //FIXME
|
||||
//gsmopen_store_boost((char *)"10", &globals.GSMOPEN_INTERFACES[interface_id].playback_boost); //FIXME
|
||||
gsmopen_store_boost((char *) capture_boost, &globals.GSMOPEN_INTERFACES[interface_id].capture_boost); //FIXME
|
||||
gsmopen_store_boost((char *) playback_boost, &globals.GSMOPEN_INTERFACES[interface_id].playback_boost); //FIXME
|
||||
|
||||
@@ -1804,7 +1674,6 @@ static switch_status_t load_config(int reload_type)
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
//static switch_status_t chat_send(const char *proto, const char *from, const char *to, const char *subject, const char *body, const char *type, const char *hint)
|
||||
static switch_status_t chat_send(switch_event_t *message_event)
|
||||
{
|
||||
char *user, *host, *f_user = NULL, *f_host = NULL, *f_resource = NULL;
|
||||
@@ -1816,7 +1685,6 @@ static switch_status_t chat_send(switch_event_t *message_event)
|
||||
const char *to;
|
||||
const char *subject;
|
||||
const char *body;
|
||||
//const char *type;
|
||||
const char *hint;
|
||||
|
||||
proto = switch_event_get_header(message_event, "proto");
|
||||
@@ -1824,7 +1692,6 @@ static switch_status_t chat_send(switch_event_t *message_event)
|
||||
to = switch_event_get_header(message_event, "to");
|
||||
subject = switch_event_get_header(message_event, "subject");
|
||||
body = switch_event_get_body(message_event);
|
||||
//type = switch_event_get_header(message_event, "type");
|
||||
hint = switch_event_get_header(message_event, "hint");
|
||||
|
||||
switch_assert(proto != NULL);
|
||||
@@ -1876,19 +1743,7 @@ static switch_status_t chat_send(switch_event_t *message_event)
|
||||
break;
|
||||
}
|
||||
}
|
||||
} /* FIXME add a tech_pvt member for the SIM telephone number //else {
|
||||
//we have no a predefined interface name to use (hint is NULL), so let's choose an interface from the username (from)
|
||||
for (i = 0; !found && i < GSMOPEN_MAX_INTERFACES; i++) {
|
||||
if (strlen(globals.GSMOPEN_INTERFACES[i].name)
|
||||
&& (strncmp(globals.GSMOPEN_INTERFACES[i].skype_user, from, strlen(from)) == 0)) {
|
||||
tech_pvt = &globals.GSMOPEN_INTERFACES[i];
|
||||
DEBUGA_GSMOPEN("Using interface: globals.GSMOPEN_INTERFACES[%d].name=|||%s|||\n", GSMOPEN_P_LOG, i, globals.GSMOPEN_INTERFACES[i].name);
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
if (!found) {
|
||||
ERRORA("ERROR: A GSMopen interface with name='%s' or one with SIM_number='%s' was not found\n", GSMOPEN_P_LOG, hint ? hint : "NULL",
|
||||
from ? from : "NULL");
|
||||
@@ -1959,10 +1814,8 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_gsmopen_load)
|
||||
|
||||
if (running) {
|
||||
|
||||
#if 1
|
||||
SWITCH_ADD_API(commands_api_interface, "gsm", "gsm console AT_command", gsm_function, GSM_SYNTAX);
|
||||
SWITCH_ADD_API(commands_api_interface, "gsmopen", "gsmopen interface AT_command", gsmopen_function, GSMOPEN_SYNTAX);
|
||||
#endif //0
|
||||
SWITCH_ADD_API(commands_api_interface, "gsmopen_boost_audio", "gsmopen_boost_audio interface AT_command", gsmopen_boost_audio_function,
|
||||
GSMOPEN_BOOST_AUDIO_SYNTAX);
|
||||
SWITCH_ADD_API(commands_api_interface, "gsmopen_dump", "gsmopen_dump interface", gsmopen_dump_function, GSMOPEN_DUMP_SYNTAX);
|
||||
@@ -2022,9 +1875,7 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_gsmopen_shutdown)
|
||||
switch_yield(50000);
|
||||
}
|
||||
fd = tech_pvt->controldevfd;
|
||||
//DEBUGA_GSMOPEN("SHUTDOWN tech_pvt->controldevfd=%d\n", GSMOPEN_P_LOG, tech_pvt->controldevfd);
|
||||
if (fd) {
|
||||
//close(fd);
|
||||
tech_pvt->controldevfd = -1;
|
||||
DEBUGA_GSMOPEN("SHUTDOWN tech_pvt->controldevfd=%d\n", GSMOPEN_P_LOG, tech_pvt->controldevfd);
|
||||
}
|
||||
@@ -2131,7 +1982,6 @@ int new_inbound_channel(private_t *tech_pvt)
|
||||
tech_pvt->dialplan, tech_pvt->callid_name,
|
||||
tech_pvt->callid_number, NULL, NULL, NULL, NULL, "mod_gsmopen", tech_pvt->context, tech_pvt->destination)) != 0) {
|
||||
char name[128];
|
||||
//switch_snprintf(name, sizeof(name), "gsmopen/%s/%s", tech_pvt->name, tech_pvt->caller_profile->destination_number);
|
||||
switch_snprintf(name, sizeof(name), "gsmopen/%s", tech_pvt->name);
|
||||
switch_channel_set_name(channel, name);
|
||||
switch_channel_set_caller_profile(channel, tech_pvt->caller_profile);
|
||||
@@ -2234,7 +2084,6 @@ int outbound_channel_answered(private_t *tech_pvt)
|
||||
switch_channel_mark_answered(channel);
|
||||
tech_pvt->phone_callflow = GSMOPEN_STATE_UP;
|
||||
tech_pvt->interface_state = GSMOPEN_STATE_UP;
|
||||
//DEBUGA_GSMOPEN("gsmopen_call: %s, answered\n", GSMOPEN_P_LOG, id);
|
||||
} else {
|
||||
ERRORA("No channel???\n", GSMOPEN_P_LOG);
|
||||
}
|
||||
@@ -2251,20 +2100,16 @@ private_t *find_available_gsmopen_interface_rr(private_t *tech_pvt_calling)
|
||||
{
|
||||
private_t *tech_pvt = NULL;
|
||||
int i;
|
||||
//int num_interfaces = GSMOPEN_MAX_INTERFACES;
|
||||
//int num_interfaces = globals.real_interfaces;
|
||||
|
||||
switch_mutex_lock(globals.mutex);
|
||||
|
||||
/* Fact is the real interface start from 1 */
|
||||
//XXX no, is just a convention, but you can have it start from 0. I do not, for aestetic reasons :-)
|
||||
//if (globals.next_interface == 0) globals.next_interface = 1;
|
||||
|
||||
for (i = 0; i < GSMOPEN_MAX_INTERFACES; i++) {
|
||||
int interface_id;
|
||||
|
||||
interface_id = globals.next_interface;
|
||||
//interface_id = interface_id < GSMOPEN_MAX_INTERFACES ? interface_id : interface_id - GSMOPEN_MAX_INTERFACES + 1;
|
||||
globals.next_interface = interface_id + 1 < GSMOPEN_MAX_INTERFACES ? interface_id + 1 : 0;
|
||||
|
||||
if (strlen(globals.GSMOPEN_INTERFACES[interface_id].name)) {
|
||||
@@ -2279,8 +2124,6 @@ private_t *find_available_gsmopen_interface_rr(private_t *tech_pvt_calling)
|
||||
|| 0 == tech_pvt->phone_callflow)) {
|
||||
DEBUGA_GSMOPEN("returning as available gsmopen interface name: %s, state: %d callflow: %d\n", GSMOPEN_P_LOG, tech_pvt->name, gsmopen_state,
|
||||
tech_pvt->phone_callflow);
|
||||
/*set to Dialing state to avoid other thread fint it, don't know if it is safe */
|
||||
//XXX no, it's not safe
|
||||
if (tech_pvt_calling == NULL) {
|
||||
tech_pvt->interface_state = GSMOPEN_STATE_SELECTED;
|
||||
}
|
||||
@@ -2288,16 +2131,13 @@ private_t *find_available_gsmopen_interface_rr(private_t *tech_pvt_calling)
|
||||
switch_mutex_unlock(globals.mutex);
|
||||
return tech_pvt;
|
||||
}
|
||||
} // else {
|
||||
//DEBUGA_GSMOPEN("GSM interface: %d blank!! A hole here means we cannot hunt the last interface.\n", GSMOPEN_P_LOG, interface_id);
|
||||
//}
|
||||
}
|
||||
}
|
||||
|
||||
switch_mutex_unlock(globals.mutex);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#if 1
|
||||
SWITCH_STANDARD_API(gsm_function)
|
||||
{
|
||||
char *mycmd = NULL, *argv[10] = { 0 };
|
||||
@@ -2339,7 +2179,6 @@ SWITCH_STANDARD_API(gsm_function)
|
||||
|
||||
|
||||
stream->write_function(stream,
|
||||
//"%c %d\t[%s]\t%3ld/%ld\t%6ld/%ld\t%s\t%s\t%s\n",
|
||||
"%c %d\t[%6s]\t%3u/%u\t%6u/%u\t%s\t%s\t%s\n",
|
||||
next_flag_char,
|
||||
i, globals.GSMOPEN_INTERFACES[i].name,
|
||||
@@ -2351,11 +2190,9 @@ SWITCH_STANDARD_API(gsm_function)
|
||||
phone_callflow[globals.GSMOPEN_INTERFACES[i].phone_callflow], globals.GSMOPEN_INTERFACES[i].session_uuid_str);
|
||||
} else if (argc > 1 && !strcasecmp(argv[1], "full")) {
|
||||
stream->write_function(stream, "%c %d\n", next_flag_char, i);
|
||||
//stream->write_function(stream, "%c\t%d\n", next_flag_char, i);
|
||||
}
|
||||
|
||||
}
|
||||
//stream->write_function(stream, "\nTotal: %d\n", globals.real_interfaces - 1);
|
||||
stream->write_function(stream, "\nTotal Interfaces: %d IB Calls(Failed/Total): %u/%u OB Calls(Failed/Total): %u/%u\n",
|
||||
globals.real_interfaces > 0 ? globals.real_interfaces - 1 : 0, ib_failed, ib, ob_failed, ob);
|
||||
|
||||
@@ -2387,7 +2224,6 @@ SWITCH_STANDARD_API(gsm_function)
|
||||
|
||||
} else if (!strcasecmp(argv[0], "ciapalino")) {
|
||||
|
||||
/* BEGIN: Changes heres */
|
||||
} else if (!strcasecmp(argv[0], "reload")) {
|
||||
if (load_config(SOFT_RELOAD) != SWITCH_STATUS_SUCCESS) {
|
||||
stream->write_function(stream, "gsm reload failed\n");
|
||||
@@ -2407,7 +2243,6 @@ SWITCH_STANDARD_API(gsm_function)
|
||||
stream->write_function(stream, "-ERR Usage: gsm remove interface_name\n");
|
||||
goto end;
|
||||
}
|
||||
/* END: Changes heres */
|
||||
|
||||
} else {
|
||||
if (globals.gsm_console)
|
||||
@@ -2472,7 +2307,6 @@ SWITCH_STANDARD_API(gsmopen_function)
|
||||
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
}
|
||||
#endif //0
|
||||
SWITCH_STANDARD_API(gsmopen_dump_function)
|
||||
{
|
||||
char *mycmd = NULL, *argv[10] = { 0 };
|
||||
@@ -2497,7 +2331,6 @@ SWITCH_STANDARD_API(gsmopen_dump_function)
|
||||
if (strlen(globals.GSMOPEN_INTERFACES[i].name)
|
||||
&& (strncmp(globals.GSMOPEN_INTERFACES[i].name, argv[0], strlen(argv[0])) == 0)) {
|
||||
tech_pvt = &globals.GSMOPEN_INTERFACES[i];
|
||||
//stream->write_function(stream, "Using interface: globals.GSMOPEN_INTERFACES[%d].name=|||%s|||\n", i, globals.GSMOPEN_INTERFACES[i].name);
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
@@ -2695,139 +2528,14 @@ SWITCH_STANDARD_API(gsmopen_boost_audio_function)
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
#if 0
|
||||
int gsmopen_transfer(private_t *tech_pvt, char *id, char *value)
|
||||
{
|
||||
char msg_to_gsmopen[1024];
|
||||
int i;
|
||||
int found = 0;
|
||||
private_t *giovatech;
|
||||
struct timeval timenow;
|
||||
|
||||
switch_mutex_lock(globals.mutex);
|
||||
|
||||
gettimeofday(&timenow, NULL);
|
||||
for (i = 0; !found && i < GSMOPEN_MAX_INTERFACES; i++) {
|
||||
if (strlen(globals.GSMOPEN_INTERFACES[i].name)) {
|
||||
|
||||
giovatech = &globals.GSMOPEN_INTERFACES[i];
|
||||
//NOTICA("gsmopen interface: %d, name: %s, state: %d, value=%s, giovatech->callid_number=%s, giovatech->gsmopen_user=%s\n", GSMOPEN_P_LOG, i, giovatech->name, giovatech->interface_state, value, giovatech->callid_number, giovatech->gsmopen_user);
|
||||
//FIXME check a timestamp here
|
||||
if (strlen(giovatech->gsmopen_call_id) && (giovatech->interface_state != GSMOPEN_STATE_DOWN) && (!strcmp(giovatech->gsmopen_user, tech_pvt->gsmopen_user)) && (!strcmp(giovatech->callid_number, value)) && ((((timenow.tv_sec - giovatech->answer_time.tv_sec) * 1000000) + (timenow.tv_usec - giovatech->answer_time.tv_usec)) < 500000)) { //0.5sec
|
||||
found = 1;
|
||||
DEBUGA_GSMOPEN
|
||||
("FOUND (name=%s, giovatech->interface_state=%d != GSMOPEN_STATE_DOWN) && (giovatech->gsmopen_user=%s == tech_pvt->gsmopen_user=%s) && (giovatech->callid_number=%s == value=%s)\n",
|
||||
GSMOPEN_P_LOG, giovatech->name, giovatech->interface_state, giovatech->gsmopen_user, tech_pvt->gsmopen_user, giovatech->callid_number,
|
||||
value)
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (found) {
|
||||
//tech_pvt->callid_number[0]='\0';
|
||||
//sprintf(msg_to_gsmopen, "ALTER CALL %s END HANGUP", id);
|
||||
//gsmopen_signaling_write(tech_pvt, msg_to_gsmopen);
|
||||
switch_mutex_unlock(globals.mutex);
|
||||
return 0;
|
||||
}
|
||||
DEBUGA_GSMOPEN("NOT FOUND\n", GSMOPEN_P_LOG);
|
||||
|
||||
if (!tech_pvt || !tech_pvt->gsmopen_call_id || !strlen(tech_pvt->gsmopen_call_id)) {
|
||||
/* we are not inside an active call */
|
||||
DEBUGA_GSMOPEN("We're NO MORE in a call now %s\n", GSMOPEN_P_LOG, (tech_pvt && tech_pvt->gsmopen_call_id) ? tech_pvt->gsmopen_call_id : "");
|
||||
switch_mutex_unlock(globals.mutex);
|
||||
|
||||
} else {
|
||||
|
||||
/* we're owned, we're in a call, let's try to transfer */
|
||||
/************************** TODO
|
||||
Checking here if it is possible to transfer this call to Test2
|
||||
-> GET CALL 288 CAN_TRANSFER Test2
|
||||
<- CALL 288 CAN_TRANSFER test2 TRUE
|
||||
**********************************/
|
||||
|
||||
private_t *available_gsmopen_interface = NULL;
|
||||
|
||||
gettimeofday(&timenow, NULL);
|
||||
for (i = 0; !found && i < GSMOPEN_MAX_INTERFACES; i++) {
|
||||
if (strlen(globals.GSMOPEN_INTERFACES[i].name)) {
|
||||
|
||||
giovatech = &globals.GSMOPEN_INTERFACES[i];
|
||||
//NOTICA("gsmopen interface: %d, name: %s, state: %d, value=%s, giovatech->callid_number=%s, giovatech->gsmopen_user=%s\n", GSMOPEN_P_LOG, i, giovatech->name, giovatech->interface_state, value, giovatech->callid_number, giovatech->gsmopen_user);
|
||||
//FIXME check a timestamp here
|
||||
if (strlen(giovatech->gsmopen_transfer_call_id) && (giovatech->interface_state != GSMOPEN_STATE_DOWN) && (!strcmp(giovatech->gsmopen_user, tech_pvt->gsmopen_user)) && (!strcmp(giovatech->transfer_callid_number, value)) && ((((timenow.tv_sec - giovatech->transfer_time.tv_sec) * 1000000) + (timenow.tv_usec - giovatech->transfer_time.tv_usec)) < 1000000)) { //1.0 sec
|
||||
found = 1;
|
||||
DEBUGA_GSMOPEN
|
||||
("FOUND (name=%s, giovatech->interface_state=%d != GSMOPEN_STATE_DOWN) && (giovatech->gsmopen_user=%s == tech_pvt->gsmopen_user=%s) && (giovatech->transfer_callid_number=%s == value=%s)\n",
|
||||
GSMOPEN_P_LOG, giovatech->name, giovatech->interface_state,
|
||||
giovatech->gsmopen_user, tech_pvt->gsmopen_user, giovatech->transfer_callid_number, value)
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (found) {
|
||||
//tech_pvt->callid_number[0]='\0';
|
||||
//sprintf(msg_to_gsmopen, "ALTER CALL %s END HANGUP", id);
|
||||
//gsmopen_signaling_write(tech_pvt, msg_to_gsmopen);
|
||||
switch_mutex_unlock(globals.mutex);
|
||||
return 0;
|
||||
}
|
||||
DEBUGA_GSMOPEN("NOT FOUND\n", GSMOPEN_P_LOG);
|
||||
|
||||
available_gsmopen_interface = find_available_gsmopen_interface_rr(tech_pvt);
|
||||
if (available_gsmopen_interface) {
|
||||
/* there is a gsmopen interface idle, let's transfer the call to it */
|
||||
|
||||
//FIXME write a timestamp here
|
||||
gettimeofday(&tech_pvt->transfer_time, NULL);
|
||||
switch_copy_string(tech_pvt->gsmopen_transfer_call_id, id, sizeof(tech_pvt->gsmopen_transfer_call_id) - 1);
|
||||
|
||||
switch_copy_string(tech_pvt->transfer_callid_number, value, sizeof(tech_pvt->transfer_callid_number) - 1);
|
||||
|
||||
DEBUGA_GSMOPEN
|
||||
("Let's transfer the gsmopen_call %s to %s interface (with gsmopen_user: %s), because we are already in a gsmopen call(%s)\n",
|
||||
GSMOPEN_P_LOG, tech_pvt->gsmopen_call_id, available_gsmopen_interface->name, available_gsmopen_interface->gsmopen_user, id);
|
||||
|
||||
//FIXME why this? the inbound call will come, eventually, on that other interface
|
||||
//available_gsmopen_interface->ib_calls++;
|
||||
|
||||
sprintf(msg_to_gsmopen, "ALTER CALL %s TRANSFER %s", id, available_gsmopen_interface->gsmopen_user);
|
||||
//gsmopen_signaling_write(tech_pvt, msg_to_gsmopen);
|
||||
if (tech_pvt->interface_state == GSMOPEN_STATE_SELECTED) {
|
||||
tech_pvt->interface_state = GSMOPEN_STATE_IDLE; //we marked it GSMOPEN_STATE_SELECTED just in case it has to make an outbound call
|
||||
}
|
||||
} else {
|
||||
/* no gsmopen interfaces idle, do nothing */
|
||||
DEBUGA_GSMOPEN
|
||||
("Not answering the gsmopen_call %s, because we are already in a gsmopen call(%s) and not transferring, because no other gsmopen interfaces are available\n",
|
||||
GSMOPEN_P_LOG, id, tech_pvt->gsmopen_call_id);
|
||||
sprintf(msg_to_gsmopen, "ALTER CALL %s END HANGUP", id);
|
||||
//gsmopen_signaling_write(tech_pvt, msg_to_gsmopen);
|
||||
}
|
||||
switch_sleep(10000);
|
||||
DEBUGA_GSMOPEN
|
||||
("We have NOT answered a GSM RING from gsmopen_call %s, because we are already in a gsmopen call (%s)\n",
|
||||
GSMOPEN_P_LOG, id, tech_pvt->gsmopen_call_id);
|
||||
|
||||
switch_mutex_unlock(globals.mutex);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif //0
|
||||
|
||||
void *gsmopen_do_gsmopenapi_thread_func(void *obj)
|
||||
{
|
||||
|
||||
private_t *tech_pvt = (private_t *) obj;
|
||||
time_t now_timestamp;
|
||||
|
||||
//if (gsmopen_present(GSMopenHandles))
|
||||
while (running && tech_pvt && tech_pvt->running) {
|
||||
int res;
|
||||
//gsmopen_sleep(1000000); //1 sec
|
||||
//DEBUGA_GSMOPEN("ciao!\n", GSMOPEN_P_LOG);
|
||||
res = gsmopen_serial_read(tech_pvt);
|
||||
if (res == -1) { //manage the graceful interface shutdown
|
||||
tech_pvt->controldev_dead = 1;
|
||||
@@ -2840,32 +2548,17 @@ void *gsmopen_do_gsmopenapi_thread_func(void *obj)
|
||||
switch_sleep(1000000);
|
||||
} else if (tech_pvt->controldevprotocol != PROTOCOL_NO_SERIAL && tech_pvt->interface_state == GSMOPEN_STATE_RING
|
||||
&& tech_pvt->phone_callflow != CALLFLOW_CALL_HANGUP_REQUESTED) {
|
||||
//WARNINGA("INCOMING RING\n", GSMOPEN_P_LOG);
|
||||
|
||||
gsmopen_ring(tech_pvt);
|
||||
|
||||
//FIXME gsmopen_answer(tech_pvt);
|
||||
//new_inbound_channel(tech_pvt);
|
||||
//FIXME if (!gsmopen_new(p, AST_STATE_RING, tech_pvt->context)) {
|
||||
//FIXME ERRORA("gsmopen_new failed! BAD BAD BAD\n", GSMOPEN_P_LOG);
|
||||
//FIXME }
|
||||
|
||||
} else if (tech_pvt->controldevprotocol != PROTOCOL_NO_SERIAL && tech_pvt->interface_state == GSMOPEN_STATE_DIALING) {
|
||||
DEBUGA_GSMOPEN("WE'RE DIALING, let's take the earlymedia\n", GSMOPEN_P_LOG);
|
||||
tech_pvt->interface_state = CALLFLOW_STATUS_EARLYMEDIA;
|
||||
remote_party_is_early_media(tech_pvt);
|
||||
//new_inbound_channel(tech_pvt);
|
||||
//FIXME if (!gsmopen_new(p, AST_STATE_RING, tech_pvt->context)) {
|
||||
//FIXME ERRORA("gsmopen_new failed! BAD BAD BAD\n", GSMOPEN_P_LOG);
|
||||
//FIXME }
|
||||
|
||||
} else if (tech_pvt->interface_state == CALLFLOW_CALL_REMOTEANSWER) {
|
||||
DEBUGA_GSMOPEN("REMOTE PARTY ANSWERED\n", GSMOPEN_P_LOG);
|
||||
outbound_channel_answered(tech_pvt);
|
||||
//new_inbound_channel(tech_pvt);
|
||||
//FIXME if (!gsmopen_new(p, AST_STATE_RING, tech_pvt->context)) {
|
||||
//FIXME ERRORA("gsmopen_new failed! BAD BAD BAD\n", GSMOPEN_P_LOG);
|
||||
//FIXME }
|
||||
}
|
||||
switch_sleep(100); //give other threads a chance
|
||||
time(&now_timestamp);
|
||||
@@ -2876,7 +2569,6 @@ void *gsmopen_do_gsmopenapi_thread_func(void *obj)
|
||||
}
|
||||
}
|
||||
DEBUGA_GSMOPEN("EXIT\n", GSMOPEN_P_LOG);
|
||||
//running = 0;
|
||||
return NULL;
|
||||
|
||||
}
|
||||
@@ -2922,7 +2614,6 @@ SWITCH_STANDARD_API(sendsms_function)
|
||||
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
} else {
|
||||
//gsmopen_sendsms(tech_pvt, (char *) argv[1], (char *) argv[2]);
|
||||
NOTICA("chat_send(proto=%s, from=%s, to=%s, subject=%s, body=%s, type=NULL, hint=%s)\n", GSMOPEN_P_LOG, GSMOPEN_CHAT_PROTO, tech_pvt->name,
|
||||
argv[1], "SIMPLE MESSAGE", switch_str_nil(argv[2]), tech_pvt->name);
|
||||
|
||||
@@ -3045,220 +2736,43 @@ int alarm_event(private_t *tech_pvt, int alarm_code, const char *alarm_message)
|
||||
int sms_incoming(private_t *tech_pvt)
|
||||
{
|
||||
switch_event_t *event;
|
||||
#ifdef NOTDEF
|
||||
switch_core_session_t *session = NULL;
|
||||
int event_sent_to_esl = 0;
|
||||
#endif
|
||||
|
||||
if (!tech_pvt) {
|
||||
return -1;
|
||||
}
|
||||
//DEBUGA_GSMOPEN("received SMS on interface %s: %s\n", GSMOPEN_P_LOG, tech_pvt->name, tech_pvt->sms_message);
|
||||
DEBUGA_GSMOPEN("received SMS on interface %s: DATE=%s, SENDER=%s, BODY=%s|\n", GSMOPEN_P_LOG, tech_pvt->name, tech_pvt->sms_date, tech_pvt->sms_sender,
|
||||
NOTICA("received SMS on interface %s: DATE=%s, SENDER=%s, BODY=|%s|\n", GSMOPEN_P_LOG, tech_pvt->name, tech_pvt->sms_date, tech_pvt->sms_sender,
|
||||
tech_pvt->sms_body);
|
||||
#ifdef NOTDEF
|
||||
if (!zstr(tech_pvt->session_uuid_str)) {
|
||||
session = switch_core_session_locate(tech_pvt->session_uuid_str);
|
||||
}
|
||||
if (switch_event_create(&event, SWITCH_EVENT_MESSAGE) == SWITCH_STATUS_SUCCESS) {
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "proto", GSMOPEN_CHAT_PROTO);
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "login", tech_pvt->name);
|
||||
//switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "hint", tech_pvt->chatmessages[which].from_dispname);
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "from", tech_pvt->sms_sender);
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "date", tech_pvt->sms_date);
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "datacodingscheme", tech_pvt->sms_datacodingscheme);
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "servicecentreaddress", tech_pvt->sms_servicecentreaddress);
|
||||
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "messagetype", "%d", tech_pvt->sms_messagetype);
|
||||
//switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "chatname", tech_pvt->chatmessages[which].chatname);
|
||||
//switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "id", tech_pvt->chatmessages[which].id);
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "subject", "SIMPLE MESSAGE");
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "to", tech_pvt->name);
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "hint", tech_pvt->name);
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "to_proto", GSMOPEN_CHAT_PROTO);
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "from_user", tech_pvt->sms_sender);
|
||||
//switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "from_host", "from_host");
|
||||
//switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "from_full", "from_full");
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "to_user", tech_pvt->name);
|
||||
//switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "to_host", "to_host");
|
||||
switch_event_add_body(event, "%s\n", tech_pvt->sms_body);
|
||||
if (session) {
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "during-call", "true");
|
||||
if (switch_core_session_queue_event(session, &event) != SWITCH_STATUS_SUCCESS) {
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "delivery-failure", "true");
|
||||
switch_event_fire(&event);
|
||||
}
|
||||
} else { //no session
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "during-call", "false");
|
||||
switch_event_fire(&event);
|
||||
event_sent_to_esl = 1;
|
||||
}
|
||||
|
||||
} else {
|
||||
ERRORA("cannot create event on interface %s. WHY?????\n", GSMOPEN_P_LOG, tech_pvt->name);
|
||||
}
|
||||
|
||||
if (!event_sent_to_esl) {
|
||||
|
||||
if (switch_event_create(&event, SWITCH_EVENT_MESSAGE) == SWITCH_STATUS_SUCCESS) {
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "proto", GSMOPEN_CHAT_PROTO);
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "login", tech_pvt->name);
|
||||
//switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "hint", tech_pvt->chatmessages[which].from_dispname);
|
||||
//switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "from", tech_pvt->chatmessages[which].from_handle);
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "from", tech_pvt->sms_sender);
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "date", tech_pvt->sms_date);
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "datacodingscheme", tech_pvt->sms_datacodingscheme);
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "servicecentreaddress", tech_pvt->sms_servicecentreaddress);
|
||||
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "messagetype", "%d", tech_pvt->sms_messagetype);
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "subject", "SIMPLE MESSAGE");
|
||||
//switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "chatname", tech_pvt->chatmessages[which].chatname);
|
||||
//switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "id", tech_pvt->chatmessages[which].id);
|
||||
switch_event_add_body(event, "%s\n", tech_pvt->sms_body);
|
||||
if (session) {
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "during-call", "true");
|
||||
} else { //no session
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "during-call", "false");
|
||||
}
|
||||
switch_event_fire(&event);
|
||||
} else {
|
||||
ERRORA("cannot create event on interface %s. WHY?????\n", GSMOPEN_P_LOG, tech_pvt->name);
|
||||
}
|
||||
}
|
||||
|
||||
if (session) {
|
||||
switch_core_session_rwunlock(session);
|
||||
}
|
||||
#endif //NOTDEF
|
||||
/* mod_sms begin */
|
||||
if (switch_event_create(&event, SWITCH_EVENT_MESSAGE) == SWITCH_STATUS_SUCCESS) {
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "proto", GSMOPEN_CHAT_PROTO);
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "login", tech_pvt->name);
|
||||
//switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "hint", tech_pvt->chatmessages[which].from_dispname);
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "from", tech_pvt->sms_sender);
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "date", tech_pvt->sms_date);
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "datacodingscheme", tech_pvt->sms_datacodingscheme);
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "servicecentreaddress", tech_pvt->sms_servicecentreaddress);
|
||||
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "messagetype", "%d", tech_pvt->sms_messagetype);
|
||||
//switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "chatname", tech_pvt->chatmessages[which].chatname);
|
||||
//switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "id", tech_pvt->chatmessages[which].id);
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "subject", "SIMPLE MESSAGE");
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "to", tech_pvt->name);
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "hint", tech_pvt->name);
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "to_proto", GSMOPEN_CHAT_PROTO);
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "from_user", tech_pvt->sms_sender);
|
||||
//switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "from_host", "from_host");
|
||||
//switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "from_full", "from_full");
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "to_user", tech_pvt->name);
|
||||
//switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "to_host", "to_host");
|
||||
switch_event_add_body(event, "%s\n", tech_pvt->sms_body);
|
||||
//switch_core_chat_send("GLOBAL", event); /* mod_sms */
|
||||
switch_core_chat_send("GLOBAL", event); /* mod_sms */
|
||||
} else {
|
||||
|
||||
ERRORA("cannot create event on interface %s. WHY?????\n", GSMOPEN_P_LOG, tech_pvt->name);
|
||||
}
|
||||
/* mod_sms end */
|
||||
|
||||
memset(tech_pvt->sms_message, '\0', sizeof(tech_pvt->sms_message));
|
||||
memset(tech_pvt->sms_sender, '\0', sizeof(tech_pvt->sms_sender));
|
||||
memset(tech_pvt->sms_date, '\0', sizeof(tech_pvt->sms_date));
|
||||
memset(tech_pvt->sms_body, '\0', sizeof(tech_pvt->sms_body));
|
||||
memset(tech_pvt->sms_datacodingscheme, '\0', sizeof(tech_pvt->sms_datacodingscheme));
|
||||
memset(tech_pvt->sms_servicecentreaddress, '\0', sizeof(tech_pvt->sms_servicecentreaddress));
|
||||
|
||||
//memset(&tech_pvt->chatmessages[which], '\0', sizeof(&tech_pvt->chatmessages[which]) );
|
||||
//memset(tech_pvt->sms_message, '\0', sizeof(tech_pvt->sms_message));
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef NOTDEF
|
||||
SWITCH_STANDARD_API(gsmopen_chat_function)
|
||||
{
|
||||
char *mycmd = NULL, *argv[10] = { 0 };
|
||||
int argc = 0;
|
||||
private_t *tech_pvt = NULL;
|
||||
//int tried =0;
|
||||
int i;
|
||||
int found = 0;
|
||||
//char skype_msg[1024];
|
||||
|
||||
if (!zstr(cmd) && (mycmd = strdup(cmd))) {
|
||||
argc = switch_separate_string(mycmd, ' ', argv, (sizeof(argv) / sizeof(argv[0])));
|
||||
}
|
||||
|
||||
if (!argc) {
|
||||
stream->write_function(stream, "ERROR, usage: %s", GSMOPEN_CHAT_SYNTAX);
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (argc < 3) {
|
||||
stream->write_function(stream, "ERROR, usage: %s", GSMOPEN_CHAT_SYNTAX);
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (argv[0]) {
|
||||
for (i = 0; !found && i < GSMOPEN_MAX_INTERFACES; i++) {
|
||||
/* we've been asked for a normal interface name, or we have not found idle interfaces to serve as the "ANY" interface */
|
||||
if (strlen(globals.GSMOPEN_INTERFACES[i].name)
|
||||
&& (strncmp(globals.GSMOPEN_INTERFACES[i].name, argv[0], strlen(argv[0])) == 0)) {
|
||||
tech_pvt = &globals.GSMOPEN_INTERFACES[i];
|
||||
stream->write_function(stream, "Using interface: globals.GSMOPEN_INTERFACES[%d].name=|||%s|||\n", i, globals.GSMOPEN_INTERFACES[i].name);
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
if (!found) {
|
||||
stream->write_function(stream, "ERROR: A GSMopen interface with name='%s' was not found\n", argv[0]);
|
||||
goto end;
|
||||
} else {
|
||||
|
||||
//chat_send(const char *proto, const char *from, const char *to, const char *subject, const char *body, const char *type, const char *hint);
|
||||
//chat_send(p*roto, const char *from, const char *to, const char *subject, const char *body, const char *type, const char *hint);
|
||||
//chat_send(GSMOPEN_CHAT_PROTO, tech_pvt->skype_user, argv[1], "SIMPLE MESSAGE", switch_str_nil((char *) &cmd[strlen(argv[0]) + 1 + strlen(argv[1]) + 1]), NULL, hint);
|
||||
|
||||
NOTICA("chat_send(proto=%s, from=%s, to=%s, subject=%s, body=%s, type=NULL, hint=%s)\n", GSMOPEN_P_LOG, GSMOPEN_CHAT_PROTO,
|
||||
tech_pvt->skype_user, argv[1], "SIMPLE MESSAGE", switch_str_nil((char *) &cmd[strlen(argv[0]) + 1 + strlen(argv[1]) + 1]),
|
||||
tech_pvt->name);
|
||||
|
||||
chat_send(GSMOPEN_CHAT_PROTO, tech_pvt->skype_user, argv[1], "SIMPLE MESSAGE",
|
||||
switch_str_nil((char *) &cmd[strlen(argv[0]) + 1 + strlen(argv[1]) + 1]), NULL, tech_pvt->name);
|
||||
|
||||
//NOTICA("TEXT is: %s\n", GSMOPEN_P_LOG, (char *) &cmd[strlen(argv[0]) + 1 + strlen(argv[1]) + 1] );
|
||||
//snprintf(skype_msg, sizeof(skype_msg), "CHAT CREATE %s", argv[1]);
|
||||
//gsmopen_signaling_write(tech_pvt, skype_msg);
|
||||
//switch_sleep(100);
|
||||
}
|
||||
} else {
|
||||
stream->write_function(stream, "ERROR, usage: %s", GSMOPEN_CHAT_SYNTAX);
|
||||
goto end;
|
||||
}
|
||||
|
||||
#ifdef NOTDEF
|
||||
|
||||
found = 0;
|
||||
|
||||
while (!found) {
|
||||
for (i = 0; i < MAX_CHATS; i++) {
|
||||
if (!strcmp(tech_pvt->chats[i].dialog_partner, argv[1])) {
|
||||
snprintf(skype_msg, sizeof(skype_msg), "CHATMESSAGE %s %s", tech_pvt->chats[i].chatname,
|
||||
(char *) &cmd[strlen(argv[0]) + 1 + strlen(argv[1]) + 1]);
|
||||
gsmopen_signaling_write(tech_pvt, skype_msg);
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (found) {
|
||||
break;
|
||||
}
|
||||
if (tried > 1000) {
|
||||
stream->write_function(stream, "ERROR: no chat with dialog_partner='%s' was found\n", argv[1]);
|
||||
break;
|
||||
}
|
||||
switch_sleep(1000);
|
||||
}
|
||||
#endif //NOTDEF
|
||||
|
||||
end:
|
||||
switch_safe_free(mycmd);
|
||||
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
}
|
||||
#endif // NOTDEF
|
||||
|
||||
/* For Emacs:
|
||||
* Local Variables:
|
||||
* mode:c
|
||||
|
||||
@@ -1415,13 +1415,16 @@ void sofia_glue_pass_sdp(private_object_t *tech_pvt, char *sdp)
|
||||
&& (other_session = switch_core_session_locate(val))) {
|
||||
other_channel = switch_core_session_get_channel(other_session);
|
||||
switch_channel_set_variable(other_channel, SWITCH_B_SDP_VARIABLE, sdp);
|
||||
|
||||
|
||||
#if 0
|
||||
if (!sofia_test_flag(tech_pvt, TFLAG_CHANGE_MEDIA) && !switch_channel_test_flag(tech_pvt->channel, CF_RECOVERING) &&
|
||||
(switch_channel_direction(other_channel) == SWITCH_CALL_DIRECTION_OUTBOUND &&
|
||||
switch_channel_direction(tech_pvt->channel) == SWITCH_CALL_DIRECTION_OUTBOUND && switch_channel_test_flag(tech_pvt->channel, CF_PROXY_MODE))) {
|
||||
switch_channel_direction(tech_pvt->channel) == SWITCH_CALL_DIRECTION_OUTBOUND && switch_channel_test_flag(tech_pvt->channel, CF_PROXY_MODE))) {
|
||||
switch_ivr_nomedia(val, SMF_FORCE);
|
||||
sofia_set_flag_locked(tech_pvt, TFLAG_CHANGE_MEDIA);
|
||||
}
|
||||
#endif
|
||||
|
||||
switch_core_session_rwunlock(other_session);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41467,6 +41467,18 @@ SWIGEXPORT void SWIGSTDCALL CSharp_CoreSession_check_hangup_hook(void * jarg1) {
|
||||
}
|
||||
|
||||
|
||||
SWIGEXPORT void SWIGSTDCALL CSharp_CoreSession_consoleLog(void * jarg1, char * jarg2, char * jarg3) {
|
||||
CoreSession *arg1 = (CoreSession *) 0 ;
|
||||
char *arg2 = (char *) 0 ;
|
||||
char *arg3 = (char *) 0 ;
|
||||
|
||||
arg1 = (CoreSession *)jarg1;
|
||||
arg2 = (char *)jarg2;
|
||||
arg3 = (char *)jarg3;
|
||||
(arg1)->consoleLog(arg2,arg3);
|
||||
}
|
||||
|
||||
|
||||
SWIGEXPORT void SWIGSTDCALL CSharp_console_log(char * jarg1, char * jarg2) {
|
||||
char *arg1 = (char *) 0 ;
|
||||
char *arg2 = (char *) 0 ;
|
||||
|
||||
@@ -416,6 +416,10 @@ public class CoreSession : IDisposable {
|
||||
freeswitchPINVOKE.CoreSession_check_hangup_hook(swigCPtr);
|
||||
}
|
||||
|
||||
public void consoleLog(string level_str, string msg) {
|
||||
freeswitchPINVOKE.CoreSession_consoleLog(swigCPtr, level_str, msg);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -22503,6 +22507,9 @@ class freeswitchPINVOKE {
|
||||
[DllImport("mod_managed", EntryPoint="CSharp_CoreSession_check_hangup_hook")]
|
||||
public static extern void CoreSession_check_hangup_hook(HandleRef jarg1);
|
||||
|
||||
[DllImport("mod_managed", EntryPoint="CSharp_CoreSession_consoleLog")]
|
||||
public static extern void CoreSession_consoleLog(HandleRef jarg1, string jarg2, string jarg3);
|
||||
|
||||
[DllImport("mod_managed", EntryPoint="CSharp_console_log")]
|
||||
public static extern void console_log(string jarg1, string jarg2);
|
||||
|
||||
@@ -25763,6 +25770,7 @@ public enum switch_channel_flag_t {
|
||||
CF_VERBOSE_SDP,
|
||||
CF_DTLS_OK,
|
||||
CF_VIDEO_PASSIVE,
|
||||
CF_NOVIDEO,
|
||||
CF_FLAG_MAX
|
||||
}
|
||||
|
||||
|
||||
@@ -3632,6 +3632,19 @@ SWITCH_DECLARE(switch_status_t) switch_channel_perform_answer(switch_channel_t *
|
||||
switch_channel_hangup(channel, SWITCH_CAUSE_INCOMPATIBLE_DESTINATION);
|
||||
}
|
||||
|
||||
|
||||
if (switch_core_session_in_thread(channel->session)) {
|
||||
const char *delay;
|
||||
|
||||
if ((delay = switch_channel_get_variable(channel, "answer_delay"))) {
|
||||
long msec = atol(delay);
|
||||
|
||||
if (msec) {
|
||||
switch_ivr_sleep(channel->session, msec, SWITCH_TRUE, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
+27
-1
@@ -1890,6 +1890,10 @@ SWITCH_DECLARE(void) switch_core_media_check_video_codecs(switch_core_session_t
|
||||
for (i = 0; i < smh->mparams->num_codecs; i++) {
|
||||
|
||||
if (smh->codecs[i]->codec_type == SWITCH_CODEC_TYPE_VIDEO) {
|
||||
if (switch_channel_direction(session->channel) == SWITCH_CALL_DIRECTION_INBOUND &&
|
||||
switch_channel_test_flag(session->channel, CF_NOVIDEO)) {
|
||||
continue;
|
||||
}
|
||||
smh->video_count++;
|
||||
}
|
||||
}
|
||||
@@ -2993,7 +2997,12 @@ SWITCH_DECLARE(uint8_t) switch_core_media_negotiate_sdp(switch_core_session_t *s
|
||||
for (i = 0; i < total_codecs; i++) {
|
||||
const switch_codec_implementation_t *imp = codec_array[i];
|
||||
|
||||
if (imp->codec_type != SWITCH_CODEC_TYPE_VIDEO) {
|
||||
if (imp->codec_type != SWITCH_CODEC_TYPE_VIDEO) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (switch_channel_direction(session->channel) == SWITCH_CALL_DIRECTION_INBOUND &&
|
||||
switch_channel_test_flag(session->channel, CF_NOVIDEO)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -5540,6 +5549,11 @@ SWITCH_DECLARE(void) switch_core_media_gen_local_sdp(switch_core_session_t *sess
|
||||
continue;
|
||||
}
|
||||
|
||||
if (switch_channel_direction(session->channel) == SWITCH_CALL_DIRECTION_INBOUND &&
|
||||
switch_channel_test_flag(session->channel, CF_NOVIDEO)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (smh->ianacodes[i] < 128) {
|
||||
if (already_did[smh->ianacodes[i]]) {
|
||||
continue;
|
||||
@@ -5606,6 +5620,11 @@ SWITCH_DECLARE(void) switch_core_media_gen_local_sdp(switch_core_session_t *sess
|
||||
continue;
|
||||
}
|
||||
|
||||
if (switch_channel_direction(session->channel) == SWITCH_CALL_DIRECTION_INBOUND &&
|
||||
switch_channel_test_flag(session->channel, CF_NOVIDEO)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (ianacode < 128) {
|
||||
if (already_did[ianacode]) {
|
||||
continue;
|
||||
@@ -7160,9 +7179,16 @@ SWITCH_DECLARE(void) switch_core_media_set_r_sdp_codec_string(switch_core_sessio
|
||||
}
|
||||
for (i = 0; i < num_codecs; i++) {
|
||||
const switch_codec_implementation_t *imp = codecs[i];
|
||||
|
||||
if (imp->codec_type != SWITCH_CODEC_TYPE_VIDEO || imp->ianacode > 127 || already_did[imp->ianacode]) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (switch_channel_direction(session->channel) == SWITCH_CALL_DIRECTION_INBOUND &&
|
||||
switch_channel_test_flag(session->channel, CF_NOVIDEO)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
for (map = m->m_rtpmaps; map; map = map->rm_next) {
|
||||
if (map->rm_pt > 127 || already_did[map->rm_pt]) {
|
||||
continue;
|
||||
|
||||
@@ -1221,6 +1221,18 @@ SWITCH_DECLARE(void) CoreSession::setHangupHook(void *hangup_func) {
|
||||
switch_core_event_hook_add_state_change(session, hanguphook);
|
||||
}
|
||||
|
||||
SWITCH_DECLARE(void) CoreSession::consoleLog(char *level_str, char *msg)
|
||||
{
|
||||
switch_log_level_t level = SWITCH_LOG_DEBUG;
|
||||
if (level_str) {
|
||||
level = switch_log_str2level(level_str);
|
||||
if (level == SWITCH_LOG_INVALID) {
|
||||
level = SWITCH_LOG_DEBUG;
|
||||
}
|
||||
}
|
||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), level, "%s", switch_str_nil(msg));
|
||||
}
|
||||
|
||||
/* ---- methods not bound to CoreSession instance ---- */
|
||||
|
||||
|
||||
|
||||
+24
-10
@@ -1090,12 +1090,19 @@ static switch_bool_t record_callback(switch_media_bug_t *bug, void *user_data, s
|
||||
case SWITCH_ABC_TYPE_TAP_NATIVE_READ:
|
||||
{
|
||||
rh->rready = 1;
|
||||
|
||||
nframe = switch_core_media_bug_get_native_read_frame(bug);
|
||||
len = nframe->datalen;
|
||||
|
||||
if (rh->rready && rh->wready) {
|
||||
if (!rh->wready) {
|
||||
unsigned char fill_data[SWITCH_RECOMMENDED_BUFFER_SIZE] = {0};
|
||||
switch_size_t fill_len = len;
|
||||
|
||||
switch_core_gen_encoded_silence(fill_data, &rh->read_impl, len);
|
||||
switch_core_file_write(&rh->out_fh, fill_data, &fill_len);
|
||||
} else {
|
||||
switch_time_t now = switch_micro_time_now();
|
||||
switch_time_t diff;
|
||||
nframe = switch_core_media_bug_get_native_read_frame(bug);
|
||||
len = nframe->datalen;
|
||||
|
||||
if (rh->last_read_time && rh->last_read_time < now) {
|
||||
diff = ((now - rh->last_read_time) + 3000 ) / rh->read_impl.microseconds_per_packet;
|
||||
@@ -1111,17 +1118,23 @@ static switch_bool_t record_callback(switch_media_bug_t *bug, void *user_data, s
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
switch_core_file_write(&rh->in_fh, mask ? null_data : nframe->data, &len);
|
||||
rh->last_read_time = now;
|
||||
}
|
||||
|
||||
switch_core_file_write(&rh->in_fh, mask ? null_data : nframe->data, &len);
|
||||
rh->last_read_time = now;
|
||||
|
||||
}
|
||||
break;
|
||||
case SWITCH_ABC_TYPE_TAP_NATIVE_WRITE:
|
||||
{
|
||||
rh->wready = 1;
|
||||
|
||||
if (rh->rready && rh->wready) {
|
||||
if (!rh->rready) {
|
||||
unsigned char fill_data[SWITCH_RECOMMENDED_BUFFER_SIZE] = {0};
|
||||
switch_size_t fill_len = len;
|
||||
switch_core_gen_encoded_silence(fill_data, &rh->read_impl, len);
|
||||
switch_core_file_write(&rh->in_fh, fill_data, &fill_len);
|
||||
} else {
|
||||
switch_time_t now = switch_micro_time_now();
|
||||
switch_time_t diff;
|
||||
|
||||
@@ -1143,10 +1156,11 @@ static switch_bool_t record_callback(switch_media_bug_t *bug, void *user_data, s
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
switch_core_file_write(&rh->out_fh, mask ? null_data : nframe->data, &len);
|
||||
rh->last_write_time = now;
|
||||
}
|
||||
|
||||
switch_core_file_write(&rh->out_fh, mask ? null_data : nframe->data, &len);
|
||||
rh->last_write_time = now;
|
||||
|
||||
}
|
||||
break;
|
||||
case SWITCH_ABC_TYPE_CLOSE:
|
||||
|
||||
+28
-13
@@ -1537,22 +1537,37 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_multi_threaded_bridge(switch_core_ses
|
||||
!switch_channel_test_flag(caller_channel, CF_XFER_ZOMBIE) && !a_leg->clean_exit && !inner_bridge) {
|
||||
if ((state != CS_EXECUTE && state != CS_SOFT_EXECUTE && state != CS_PARK && state != CS_ROUTING) ||
|
||||
(switch_channel_test_flag(peer_channel, CF_ANSWERED) && state < CS_HANGUP)) {
|
||||
switch_call_cause_t cause = switch_channel_get_cause(peer_channel);
|
||||
|
||||
if (switch_true(switch_channel_get_variable(caller_channel, SWITCH_PARK_AFTER_BRIDGE_VARIABLE))) {
|
||||
switch_ivr_park_session(session);
|
||||
} else if ((var = switch_channel_get_variable(caller_channel, SWITCH_TRANSFER_AFTER_BRIDGE_VARIABLE))) {
|
||||
transfer_after_bridge(session, var);
|
||||
} else if (switch_channel_test_flag(peer_channel, CF_ANSWERED) &&
|
||||
switch_true(switch_channel_get_variable(caller_channel, SWITCH_HANGUP_AFTER_BRIDGE_VARIABLE))) {
|
||||
switch_call_cause_t cause = switch_channel_get_cause(peer_channel);
|
||||
if (cause == SWITCH_CAUSE_NONE) {
|
||||
cause = SWITCH_CAUSE_NORMAL_CLEARING;
|
||||
}
|
||||
if (cause && !switch_channel_test_flag(peer_channel, CF_ANSWERED)) {
|
||||
switch_channel_handle_cause(caller_channel, cause);
|
||||
}
|
||||
|
||||
if (switch_channel_test_flag(peer_channel, CF_INTERCEPTED)) {
|
||||
switch_channel_set_flag(peer_channel, CF_INTERCEPT);
|
||||
if (!switch_channel_test_flag(caller_channel, CF_TRANSFER)) {
|
||||
if (switch_true(switch_channel_get_variable(caller_channel, SWITCH_PARK_AFTER_BRIDGE_VARIABLE))) {
|
||||
switch_ivr_park_session(session);
|
||||
} else if ((var = switch_channel_get_variable(caller_channel, SWITCH_TRANSFER_AFTER_BRIDGE_VARIABLE))) {
|
||||
transfer_after_bridge(session, var);
|
||||
} else {
|
||||
const char *hup = switch_channel_get_variable(caller_channel, SWITCH_HANGUP_AFTER_BRIDGE_VARIABLE);
|
||||
int explicit = 0;
|
||||
|
||||
if (hup) {
|
||||
explicit = !strcasecmp(hup, "explicit");
|
||||
}
|
||||
|
||||
if (explicit || (switch_channel_test_flag(peer_channel, CF_ANSWERED) && switch_true(hup))) {
|
||||
switch_call_cause_t cause = switch_channel_get_cause(peer_channel);
|
||||
if (cause == SWITCH_CAUSE_NONE) {
|
||||
cause = SWITCH_CAUSE_NORMAL_CLEARING;
|
||||
}
|
||||
|
||||
if (switch_channel_test_flag(peer_channel, CF_INTERCEPTED)) {
|
||||
switch_channel_set_flag(peer_channel, CF_INTERCEPT);
|
||||
}
|
||||
switch_channel_hangup(caller_channel, cause);
|
||||
}
|
||||
}
|
||||
switch_channel_hangup(caller_channel, cause);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user