[commit] r1855 - in freeswitch/branches/stkn/src: . include mod/applications/mod_conference mod/applications/mod_ivrtest mod/applications/mod_playback mod/applications/mod_rss mod/endpoints/mod_dingaling mod/event_handlers/mod_xmpp_event mod/languages/mod_perl mod/languages/mod_spidermonkey mod/loggers/mod_syslog
Author: stkn Date: Wed Jul 12 19:43:02 2006 New Revision: 1855 Modified: freeswitch/branches/stkn/src/include/switch_core.h freeswitch/branches/stkn/src/include/switch_ivr.h freeswitch/branches/stkn/src/include/switch_module_interfaces.h freeswitch/branches/stkn/src/include/switch_types.h freeswitch/branches/stkn/src/mod/applications/mod_conference/mod_conference.c freeswitch/branches/stkn/src/mod/applications/mod_ivrtest/mod_ivrtest.c freeswitch/branches/stkn/src/mod/applications/mod_playback/mod_playback.c freeswitch/branches/stkn/src/mod/applications/mod_rss/mod_rss.c freeswitch/branches/stkn/src/mod/endpoints/mod_dingaling/mod_dingaling.c freeswitch/branches/stkn/src/mod/event_handlers/mod_xmpp_event/mod_xmpp_event.c freeswitch/branches/stkn/src/mod/languages/mod_perl/switch_swig.c freeswitch/branches/stkn/src/mod/languages/mod_perl/switch_swig_wrap.c freeswitch/branches/stkn/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c freeswitch/branches/stkn/src/mod/loggers/mod_syslog/mod_syslog.c freeswitch/branches/stkn/src/switch_core.c freeswitch/branches/stkn/src/switch_ivr.c freeswitch/branches/stkn/src/switch_loadable_module.c Log: Merge changes from tunk Modified: freeswitch/branches/stkn/src/include/switch_core.h ============================================================================== --- freeswitch/branches/stkn/src/include/switch_core.h (original) +++ freeswitch/branches/stkn/src/include/switch_core.h Wed Jul 12 19:43:02 2006 @@ -335,9 +335,17 @@ \param event the event to send \return the status returned by the message handler */ -SWITCH_DECLARE(switch_status_t) switch_core_session_event_send(char *uuid_str, switch_event_t *event); +SWITCH_DECLARE(switch_status_t) switch_core_session_event_send(char *uuid_str, switch_event_t **event); /*! + \brief Send an event to a session translating it to it's native message format + \param session the session to receive the event + \param event the event to receive + \return the status returned by the handler +*/ +SWITCH_DECLARE(switch_status_t) switch_core_session_receive_event(switch_core_session_t *session, switch_event_t **event); + +/*! \brief Retrieve private user data from a session \param session the session to retrieve from \return a pointer to the private data @@ -433,7 +441,16 @@ \param event the event to queue \return the status returned by the message handler */ -SWITCH_DECLARE(switch_status_t) switch_core_session_queue_event(switch_core_session_t *session, switch_event_t *event); +SWITCH_DECLARE(switch_status_t) switch_core_session_queue_event(switch_core_session_t *session, switch_event_t **event); + +/*! + \brief DE-Queue an event on a given session + \param session the session to de-queue the message on + \param event the de-queued event + \return the SWITCH_STATUS_SUCCESS if the event was de-queued +*/ +SWITCH_DECLARE(switch_status_t) switch_core_session_dequeue_event(switch_core_session_t *session, switch_event_t **event); + /*! \brief Read a frame from a session Modified: freeswitch/branches/stkn/src/include/switch_ivr.h ============================================================================== --- freeswitch/branches/stkn/src/include/switch_ivr.h (original) +++ freeswitch/branches/stkn/src/include/switch_ivr.h Wed Jul 12 19:43:02 2006 @@ -59,7 +59,7 @@ \return SWITCH_STATUS_SUCCESS to keep the collection moving. */ SWITCH_DECLARE(switch_status_t) switch_ivr_collect_digits_callback(switch_core_session_t *session, - switch_dtmf_callback_function_t dtmf_callback, + switch_input_callback_function_t dtmf_callback, void *buf, unsigned int buflen); @@ -98,7 +98,7 @@ switch_file_handle_t *fh, char *file, char *timer_name, - switch_dtmf_callback_function_t dtmf_callback, + switch_input_callback_function_t dtmf_callback, void *buf, unsigned int buflen); @@ -118,7 +118,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_record_file(switch_core_session_t *session, switch_file_handle_t *fh, char *file, - switch_dtmf_callback_function_t dtmf_callback, + switch_input_callback_function_t dtmf_callback, void *buf, unsigned int buflen); @@ -127,7 +127,7 @@ switch_speech_handle_t *sh, switch_codec_t *codec, switch_timer_t *timer, - switch_dtmf_callback_function_t dtmf_callback, + switch_input_callback_function_t dtmf_callback, char *text, void *buf, unsigned int buflen); @@ -150,7 +150,7 @@ char *voice_name, char *timer_name, uint32_t rate, - switch_dtmf_callback_function_t dtmf_callback, + switch_input_callback_function_t dtmf_callback, char *text, void *buf, unsigned int buflen); @@ -169,7 +169,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_multi_threaded_bridge(switch_core_session_t *session, switch_core_session_t *peer_session, unsigned int timelimit, - switch_dtmf_callback_function_t dtmf_callback, + switch_input_callback_function_t dtmf_callback, void *session_data, void *peer_session_data); Modified: freeswitch/branches/stkn/src/include/switch_module_interfaces.h ============================================================================== --- freeswitch/branches/stkn/src/include/switch_module_interfaces.h (original) +++ freeswitch/branches/stkn/src/include/switch_module_interfaces.h Wed Jul 12 19:43:02 2006 @@ -93,10 +93,10 @@ }; /*! \brief Node in which to store custom receive message callback hooks */ -struct switch_io_event_hook_queue_event { +struct switch_io_event_hook_receive_event { /*! the answer channel callback hook*/ - switch_queue_event_hook_t queue_event; - struct switch_io_event_hook_queue_event *next; + switch_receive_event_hook_t receive_event; + struct switch_io_event_hook_receive_event *next; }; /*! \brief Node in which to store custom read frame channel callback hooks */ @@ -150,7 +150,7 @@ /*! a list of receive message hooks */ switch_io_event_hook_receive_message_t *receive_message; /*! a list of queue message hooks */ - switch_io_event_hook_queue_event_t *queue_event; + switch_io_event_hook_receive_event_t *receive_event; /*! a list of read frame hooks */ switch_io_event_hook_read_frame_t *read_frame; /*! a list of write frame hooks */ @@ -186,7 +186,7 @@ /*! receive a message from another session*/ switch_status_t (*receive_message)(switch_core_session_t *, switch_core_session_message_t *); /*! queue a message for another session*/ - switch_status_t (*queue_event)(switch_core_session_t *, switch_event_t *); + switch_status_t (*receive_event)(switch_core_session_t *, switch_event_t *); }; /*! \brief Abstraction of an module endpoint interface Modified: freeswitch/branches/stkn/src/include/switch_types.h ============================================================================== --- freeswitch/branches/stkn/src/include/switch_types.h (original) +++ freeswitch/branches/stkn/src/include/switch_types.h Wed Jul 12 19:43:02 2006 @@ -573,6 +573,10 @@ SWITCH_EVENT_ALL } switch_event_types_t; +typedef enum { + SWITCH_INPUT_TYPE_DTMF, + SWITCH_INPUT_TYPE_EVENT +} switch_input_type_t; typedef enum { SWITCH_CAUSE_UNALLOCATED = 1, @@ -651,7 +655,7 @@ typedef struct switch_io_event_hook_outgoing_channel switch_io_event_hook_outgoing_channel_t; typedef struct switch_io_event_hook_answer_channel switch_io_event_hook_answer_channel_t; typedef struct switch_io_event_hook_receive_message switch_io_event_hook_receive_message_t; -typedef struct switch_io_event_hook_queue_event switch_io_event_hook_queue_event_t; +typedef struct switch_io_event_hook_receive_event switch_io_event_hook_receive_event_t; typedef struct switch_io_event_hook_read_frame switch_io_event_hook_read_frame_t; typedef struct switch_io_event_hook_write_frame switch_io_event_hook_write_frame_t; typedef struct switch_io_event_hook_kill_channel switch_io_event_hook_kill_channel_t; @@ -682,7 +686,7 @@ typedef switch_status_t (*switch_outgoing_channel_hook_t)(switch_core_session_t *, switch_caller_profile_t *, switch_core_session_t *); typedef switch_status_t (*switch_answer_channel_hook_t)(switch_core_session_t *); typedef switch_status_t (*switch_receive_message_hook_t)(switch_core_session_t *, switch_core_session_message_t *); -typedef switch_status_t (*switch_queue_event_hook_t)(switch_core_session_t *, switch_event_t *); +typedef switch_status_t (*switch_receive_event_hook_t)(switch_core_session_t *, switch_event_t *); typedef switch_status_t (*switch_read_frame_hook_t)(switch_core_session_t *, switch_frame_t **, int, switch_io_flag_t, int); typedef switch_status_t (*switch_write_frame_hook_t)(switch_core_session_t *, switch_frame_t *, int, switch_io_flag_t, int); typedef switch_status_t (*switch_kill_channel_hook_t)(switch_core_session_t *, int); @@ -692,7 +696,11 @@ typedef struct switch_stream_handle switch_stream_handle_t; typedef switch_status_t (*switch_stream_handle_write_function_t)(switch_stream_handle_t *handle, char *fmt, ...); typedef switch_status_t (*switch_api_function_t)(char *in, switch_stream_handle_t *stream); -typedef switch_status_t (*switch_dtmf_callback_function_t)(switch_core_session_t *session, char *dtmf, void *buf, unsigned int buflen); +typedef switch_status_t (*switch_input_callback_function_t)(switch_core_session_t *session, + void *input, + switch_input_type_t input_type, + void *buf, + unsigned int buflen); typedef int (*switch_core_db_callback_func_t)(void *pArg, int argc, char **argv, char **columnNames); typedef switch_status_t (*switch_module_load_t) (switch_loadable_module_interface_t **, char *); typedef switch_status_t (*switch_module_reload_t) (void); Modified: freeswitch/branches/stkn/src/mod/applications/mod_conference/mod_conference.c ============================================================================== --- freeswitch/branches/stkn/src/mod/applications/mod_conference/mod_conference.c (original) +++ freeswitch/branches/stkn/src/mod/applications/mod_conference/mod_conference.c Wed Jul 12 19:43:02 2006 @@ -557,7 +557,7 @@ for (x = 0; x < imember->read / 2; x++) { int32_t z = muxed[x] + bptr[x]; normalize_to_16bit(z); - muxed[x] = z; + muxed[x] = (int16_t)z; } ready++; Modified: freeswitch/branches/stkn/src/mod/applications/mod_ivrtest/mod_ivrtest.c ============================================================================== --- freeswitch/branches/stkn/src/mod/applications/mod_ivrtest/mod_ivrtest.c (original) +++ freeswitch/branches/stkn/src/mod/applications/mod_ivrtest/mod_ivrtest.c Wed Jul 12 19:43:02 2006 @@ -39,16 +39,23 @@ dtmf handler function you can hook up to be executed when a digit is dialed during playback if you return anything but SWITCH_STATUS_SUCCESS the playback will stop. */ -static switch_status_t on_dtmf(switch_core_session_t *session, char *dtmf, void *buf, unsigned int buflen) +static switch_status_t on_dtmf(switch_core_session_t *session, void *input, switch_input_type_t itype, void *buf, unsigned int buflen) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Digits %s\n", dtmf); + switch (itype) { + case SWITCH_INPUT_TYPE_DTMF: { + char *dtmf = (char *) input; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Digits %s\n", dtmf); - switch_copy_string((char *)buf, dtmf, buflen); - return SWITCH_STATUS_BREAK; - + switch_copy_string((char *)buf, dtmf, buflen); + return SWITCH_STATUS_BREAK; + } + break; + default: + break; + } + return SWITCH_STATUS_SUCCESS; } - static void disast_function(switch_core_session_t *session, char *data) { void *x = NULL; @@ -107,13 +114,22 @@ } -static switch_status_t show_dtmf(switch_core_session_t *session, char *dtmf, void *buf, unsigned int buflen) +static switch_status_t show_dtmf(switch_core_session_t *session, void *input, switch_input_type_t itype, void *buf, unsigned int buflen) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Digits %s\n", dtmf); - - switch_copy_string((char *)buf, dtmf, buflen); - return SWITCH_STATUS_SUCCESS; + switch (itype) { + case SWITCH_INPUT_TYPE_DTMF: { + char *dtmf = (char *) input; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Digits %s\n", dtmf); + + switch_copy_string((char *)buf, dtmf, buflen); + } + break; + default: + break; + } + + return SWITCH_STATUS_SUCCESS; } static void tts_function(switch_core_session_t *session, char *data) Modified: freeswitch/branches/stkn/src/mod/applications/mod_playback/mod_playback.c ============================================================================== --- freeswitch/branches/stkn/src/mod/applications/mod_playback/mod_playback.c (original) +++ freeswitch/branches/stkn/src/mod/applications/mod_playback/mod_playback.c Wed Jul 12 19:43:02 2006 @@ -37,12 +37,22 @@ dtmf handler function you can hook up to be executed when a digit is dialed during playback if you return anything but SWITCH_STATUS_SUCCESS the playback will stop. */ -static switch_status_t on_dtmf(switch_core_session_t *session, char *dtmf, void *buf, unsigned int buflen) +static switch_status_t on_dtmf(switch_core_session_t *session, void *input, switch_input_type_t itype, void *buf, unsigned int buflen) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Digits %s\n", dtmf); - if (*dtmf == '*') { - return SWITCH_STATUS_FALSE; + + switch (itype) { + case SWITCH_INPUT_TYPE_DTMF: { + char *dtmf = (char *) input; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Digits %s\n", dtmf); + + if (*dtmf == '*') { + return SWITCH_STATUS_FALSE; + } + } + break; + default: + break; } return SWITCH_STATUS_SUCCESS; Modified: freeswitch/branches/stkn/src/mod/applications/mod_rss/mod_rss.c ============================================================================== --- freeswitch/branches/stkn/src/mod/applications/mod_rss/mod_rss.c (original) +++ freeswitch/branches/stkn/src/mod/applications/mod_rss/mod_rss.c Wed Jul 12 19:43:02 2006 @@ -85,69 +85,75 @@ dtmf handler function you can hook up to be executed when a digit is dialed during playback if you return anything but SWITCH_STATUS_SUCCESS the playback will stop. */ -static switch_status_t on_dtmf(switch_core_session_t *session, char *dtmf, void *buf, unsigned int buflen) -{ +static switch_status_t on_dtmf(switch_core_session_t *session, void *input, switch_input_type_t itype, void *buf, unsigned int buflen) - struct dtmf_buffer *dtb; - dtb = (struct dtmf_buffer *) buf; +{ + switch (itype) { + case SWITCH_INPUT_TYPE_DTMF: { + char *dtmf = (char *) input; + struct dtmf_buffer *dtb; + dtb = (struct dtmf_buffer *) buf; - switch(*dtmf) { - case '#': - switch_set_flag(dtb, SFLAG_MAIN); - return SWITCH_STATUS_BREAK; - case '6': - dtb->index++; - return SWITCH_STATUS_BREAK; - case '4': - dtb->index--; - return SWITCH_STATUS_BREAK; - case '*': - if (switch_test_flag(dtb->sh, SWITCH_SPEECH_FLAG_PAUSE)) { - switch_clear_flag(dtb->sh, SWITCH_SPEECH_FLAG_PAUSE); - } else { - switch_set_flag(dtb->sh, SWITCH_SPEECH_FLAG_PAUSE); - } - break; - case '5': - switch_core_speech_text_param_tts(dtb->sh, "voice", "next"); - switch_set_flag(dtb, SFLAG_INFO); - return SWITCH_STATUS_BREAK; - break; - case '9': - switch_core_speech_text_param_tts(dtb->sh, "voice", dtb->voice); - switch_set_flag(dtb, SFLAG_INFO); - return SWITCH_STATUS_BREAK; - break; - case '2': - if (dtb->speed < 260) { - dtb->speed += 30; - switch_core_speech_numeric_param_tts(dtb->sh, "speech/rate", dtb->speed); + switch(*dtmf) { + case '#': + switch_set_flag(dtb, SFLAG_MAIN); + return SWITCH_STATUS_BREAK; + case '6': + dtb->index++; + return SWITCH_STATUS_BREAK; + case '4': + dtb->index--; + return SWITCH_STATUS_BREAK; + case '*': + if (switch_test_flag(dtb->sh, SWITCH_SPEECH_FLAG_PAUSE)) { + switch_clear_flag(dtb->sh, SWITCH_SPEECH_FLAG_PAUSE); + } else { + switch_set_flag(dtb->sh, SWITCH_SPEECH_FLAG_PAUSE); + } + break; + case '5': + switch_core_speech_text_param_tts(dtb->sh, "voice", "next"); switch_set_flag(dtb, SFLAG_INFO); return SWITCH_STATUS_BREAK; - } - break; - case '7': - dtb->speed = TTS_MEAN_SPEED; - switch_core_speech_numeric_param_tts(dtb->sh, "speech/rate", dtb->speed); - switch_set_flag(dtb, SFLAG_INFO); - return SWITCH_STATUS_BREAK; - case '8': - if (dtb->speed > 80) { - dtb->speed -= 30; + break; + case '9': + switch_core_speech_text_param_tts(dtb->sh, "voice", dtb->voice); + switch_set_flag(dtb, SFLAG_INFO); + return SWITCH_STATUS_BREAK; + break; + case '2': + if (dtb->speed < 260) { + dtb->speed += 30; + switch_core_speech_numeric_param_tts(dtb->sh, "speech/rate", dtb->speed); + switch_set_flag(dtb, SFLAG_INFO); + return SWITCH_STATUS_BREAK; + } + break; + case '7': + dtb->speed = TTS_MEAN_SPEED; switch_core_speech_numeric_param_tts(dtb->sh, "speech/rate", dtb->speed); switch_set_flag(dtb, SFLAG_INFO); return SWITCH_STATUS_BREAK; + case '8': + if (dtb->speed > 80) { + dtb->speed -= 30; + switch_core_speech_numeric_param_tts(dtb->sh, "speech/rate", dtb->speed); + switch_set_flag(dtb, SFLAG_INFO); + return SWITCH_STATUS_BREAK; + } + break; + case '0': + switch_set_flag(dtb, SFLAG_INSTRUCT); + return SWITCH_STATUS_BREAK; } + } break; - case '0': - switch_set_flag(dtb, SFLAG_INSTRUCT); - return SWITCH_STATUS_BREAK; + default: + break; } - return SWITCH_STATUS_SUCCESS; } - static void rss_function(switch_core_session_t *session, char *data) { switch_channel_t *channel; @@ -297,14 +303,14 @@ switch_core_speech_flush_tts(&sh); #ifdef MATCH_COUNT snprintf(buf + len, sizeof(buf) - len, - "Main Menu. <break time=\"600ms\"/> " + ",<break time=\"500ms\"/>Main Menu. <break time=\"600ms\"/> " "Select one of the following news sources, or press 0 to exit. " - "<break time=\"600ms\"/>"); + ",<break time=\"600ms\"/>"); #else snprintf(buf + len, sizeof(buf) - len, - "Main Menu. <break time=\"600ms\"/> " + ",<break time=\"500ms\"/>Main Menu. <break time=\"600ms\"/> " "Select one of the following news sources, followed by the pound key or press 0 to exit. " - "<break time=\"600ms\"/>"); + ",<break time=\"600ms\"/>"); #endif len = (int32_t)strlen(buf); @@ -483,7 +489,7 @@ switch_strftime(date, &retsize, sizeof(date), "%I:%M %p", &tm); - snprintf(buf, sizeof(buf), "%s. %s. %s. local time: %s, Press 0 for options, 5 to change voice, or pound to return to the main menu. ", + snprintf(buf, sizeof(buf), ",<break time=\"500ms\"/>%s. %s. %s. local time: %s, Press 0 for options, 5 to change voice, or pound to return to the main menu. ", title_txt, description_txt, rights_txt, date); status = switch_ivr_speak_text_handle(session, &sh, Modified: freeswitch/branches/stkn/src/mod/endpoints/mod_dingaling/mod_dingaling.c ============================================================================== --- freeswitch/branches/stkn/src/mod/endpoints/mod_dingaling/mod_dingaling.c (original) +++ freeswitch/branches/stkn/src/mod/endpoints/mod_dingaling/mod_dingaling.c Wed Jul 12 19:43:02 2006 @@ -1509,7 +1509,9 @@ switch_event_add_header(event, SWITCH_STACK_BOTTOM, "from", from); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "subject", subject); switch_event_add_body(event, msg); - switch_event_fire(&event); + if (switch_core_session_queue_event(tech_pvt->session, &event) != SWITCH_STATUS_SUCCESS) { + switch_event_fire(&event); + } } break; Modified: freeswitch/branches/stkn/src/mod/event_handlers/mod_xmpp_event/mod_xmpp_event.c ============================================================================== --- freeswitch/branches/stkn/src/mod/event_handlers/mod_xmpp_event/mod_xmpp_event.c (original) +++ freeswitch/branches/stkn/src/mod/event_handlers/mod_xmpp_event/mod_xmpp_event.c Wed Jul 12 19:43:02 2006 @@ -239,6 +239,7 @@ stream.data = retbuf; stream.end = stream.data; stream.data_size = sizeof(retbuf); + stream.write_function = switch_console_stream_write; switch_api_execute(cmd, arg, &stream); return 0; Modified: freeswitch/branches/stkn/src/mod/languages/mod_perl/switch_swig.c ============================================================================== --- freeswitch/branches/stkn/src/mod/languages/mod_perl/switch_swig.c (original) +++ freeswitch/branches/stkn/src/mod/languages/mod_perl/switch_swig.c Wed Jul 12 19:43:02 2006 @@ -113,7 +113,7 @@ int fs_ivr_play_file(switch_core_session_t *session, char *file, char *timer_name, - switch_dtmf_callback_function_t dtmf_callback, + switch_input_callback_function_t dtmf_callback, void *buf, unsigned int buflen) { Modified: freeswitch/branches/stkn/src/mod/languages/mod_perl/switch_swig_wrap.c ============================================================================== --- freeswitch/branches/stkn/src/mod/languages/mod_perl/switch_swig_wrap.c (original) +++ freeswitch/branches/stkn/src/mod/languages/mod_perl/switch_swig_wrap.c Wed Jul 12 19:43:02 2006 @@ -992,7 +992,7 @@ /* -------- TYPES TABLE (BEGIN) -------- */ #define SWIGTYPE_p_switch_core_session_t swig_types[0] -#define SWIGTYPE_p_switch_dtmf_callback_function_t swig_types[1] +#define SWIGTYPE_p_switch_input_callback_function_t swig_types[1] static swig_type_info *swig_types[3]; static swig_module_info swig_module = {swig_types, 2, 0, 0, 0, 0}; #define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name) @@ -1408,7 +1408,7 @@ switch_core_session_t *arg1 = (switch_core_session_t *) 0 ; char *arg2 = (char *) 0 ; char *arg3 = (char *) 0 ; - switch_dtmf_callback_function_t arg4 ; + switch_input_callback_function_t arg4 ; void *arg5 = (void *) 0 ; unsigned int arg6 ; int result; @@ -1428,9 +1428,9 @@ if (!SvOK((SV*) ST(2))) arg3 = 0; else arg3 = (char *) SvPV(ST(2), PL_na); { - switch_dtmf_callback_function_t * argp; - if (SWIG_ConvertPtr(ST(3),(void **) &argp, SWIGTYPE_p_switch_dtmf_callback_function_t,0) < 0) { - SWIG_croak("Type error in argument 4 of fs_ivr_play_file. Expected _p_switch_dtmf_callback_function_t"); + switch_input_callback_function_t * argp; + if (SWIG_ConvertPtr(ST(3),(void **) &argp, SWIGTYPE_p_switch_input_callback_function_t,0) < 0) { + SWIG_croak("Type error in argument 4 of fs_ivr_play_file. Expected _p_switch_input_callback_function_t"); } arg4 = *argp; } @@ -1456,19 +1456,19 @@ /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */ static swig_type_info _swigt__p_switch_core_session_t = {"_p_switch_core_session_t", "switch_core_session_t *", 0, 0, 0}; -static swig_type_info _swigt__p_switch_dtmf_callback_function_t = {"_p_switch_dtmf_callback_function_t", "switch_dtmf_callback_function_t *", 0, 0, 0}; +static swig_type_info _swigt__p_switch_input_callback_function_t = {"_p_switch_input_callback_function_t", "switch_input_callback_function_t *", 0, 0, 0}; static swig_type_info *swig_type_initial[] = { &_swigt__p_switch_core_session_t, - &_swigt__p_switch_dtmf_callback_function_t, + &_swigt__p_switch_input_callback_function_t, }; static swig_cast_info _swigc__p_switch_core_session_t[] = { {&_swigt__p_switch_core_session_t, 0, 0, 0},{0, 0, 0, 0}}; -static swig_cast_info _swigc__p_switch_dtmf_callback_function_t[] = { {&_swigt__p_switch_dtmf_callback_function_t, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_switch_input_callback_function_t[] = { {&_swigt__p_switch_input_callback_function_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info *swig_cast_initial[] = { _swigc__p_switch_core_session_t, - _swigc__p_switch_dtmf_callback_function_t, + _swigc__p_switch_input_callback_function_t, }; Modified: freeswitch/branches/stkn/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c ============================================================================== --- freeswitch/branches/stkn/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c (original) +++ freeswitch/branches/stkn/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c Wed Jul 12 19:43:02 2006 @@ -175,218 +175,247 @@ return SWITCH_STATUS_SUCCESS; } -static switch_status_t js_stream_dtmf_callback(switch_core_session_t *session, char *dtmf, void *buf, unsigned int buflen) +static switch_status_t js_stream_dtmf_callback(switch_core_session_t *session, void *input, switch_input_type_t itype, void *buf, unsigned int buflen) { - char code[2048]; - struct dtmf_callback_state *cb_state = buf; - struct js_session *jss = cb_state->session_state; - switch_file_handle_t *fh = cb_state->extra; - jsval rval; - char *ret; + switch (itype) { + case SWITCH_INPUT_TYPE_DTMF: { + char *dtmf = (char *) input; + char code[2048]; + struct dtmf_callback_state *cb_state = buf; + struct js_session *jss = cb_state->session_state; + switch_file_handle_t *fh = cb_state->extra; + jsval rval; + char *ret; - if (!jss) { - return SWITCH_STATUS_FALSE; - } - - if (cb_state->digit_count || (cb_state->code_buffer[0] > 47 && cb_state->code_buffer[0] < 58)) { - char *d; - if (!cb_state->digit_count) { - cb_state->digit_count = atoi(cb_state->code_buffer); + if (!jss) { + return SWITCH_STATUS_FALSE; } + + if (cb_state->digit_count || (cb_state->code_buffer[0] > 47 && cb_state->code_buffer[0] < 58)) { + char *d; + if (!cb_state->digit_count) { + cb_state->digit_count = atoi(cb_state->code_buffer); + } - for(d = dtmf; *d; d++) { - cb_state->ret_buffer[cb_state->ret_buffer_len++] = *d; - if ((cb_state->ret_buffer_len > cb_state->digit_count)|| - (cb_state->ret_buffer_len > sizeof(cb_state->ret_buffer))|| - (cb_state->ret_buffer_len >= cb_state->digit_count) - ) { - return SWITCH_STATUS_FALSE; + for(d = dtmf; *d; d++) { + cb_state->ret_buffer[cb_state->ret_buffer_len++] = *d; + if ((cb_state->ret_buffer_len > cb_state->digit_count)|| + (cb_state->ret_buffer_len > sizeof(cb_state->ret_buffer))|| + (cb_state->ret_buffer_len >= cb_state->digit_count) + ) { + return SWITCH_STATUS_FALSE; + } } - } - return SWITCH_STATUS_SUCCESS; - } else { - snprintf(code, sizeof(code), "~%s(\"%s\")", cb_state->code_buffer, dtmf); - eval_some_js(code, jss->cx, jss->obj, &rval); - ret = JS_GetStringBytes(JS_ValueToString(jss->cx, rval)); + return SWITCH_STATUS_SUCCESS; + } else { + snprintf(code, sizeof(code), "~%s(\"%s\")", cb_state->code_buffer, dtmf); + eval_some_js(code, jss->cx, jss->obj, &rval); + ret = JS_GetStringBytes(JS_ValueToString(jss->cx, rval)); - if (!strncasecmp(ret, "speed", 4)) { - char *p; + if (!strncasecmp(ret, "speed", 4)) { + char *p; - if ((p = strchr(ret, ':'))) { - p++; - if (*p == '+' || *p == '-') { - int step; - if (!(step = atoi(p))) { - step = 1; + if ((p = strchr(ret, ':'))) { + p++; + if (*p == '+' || *p == '-') { + int step; + if (!(step = atoi(p))) { + step = 1; + } + fh->speed += step; + } else { + int speed = atoi(p); + fh->speed = speed; } - fh->speed += step; + return SWITCH_STATUS_SUCCESS; + } + + return SWITCH_STATUS_FALSE; + } else if (!strcasecmp(ret, "pause")) { + if (switch_test_flag(fh, SWITCH_FILE_PAUSE)) { + switch_clear_flag(fh, SWITCH_FILE_PAUSE); } else { - int speed = atoi(p); - fh->speed = speed; + switch_set_flag(fh, SWITCH_FILE_PAUSE); } return SWITCH_STATUS_SUCCESS; - } - - return SWITCH_STATUS_FALSE; - } else if (!strcasecmp(ret, "pause")) { - if (switch_test_flag(fh, SWITCH_FILE_PAUSE)) { - switch_clear_flag(fh, SWITCH_FILE_PAUSE); - } else { - switch_set_flag(fh, SWITCH_FILE_PAUSE); - } - return SWITCH_STATUS_SUCCESS; - } else if (!strcasecmp(ret, "restart")) { - unsigned int pos = 0; - fh->speed = 0; - switch_core_file_seek(fh, &pos, 0, SEEK_SET); - return SWITCH_STATUS_SUCCESS; - } else if (!strncasecmp(ret, "seek", 4)) { - switch_codec_t *codec; - unsigned int samps = 0; - unsigned int pos = 0; - char *p; - codec = switch_core_session_get_read_codec(jss->session); + } else if (!strcasecmp(ret, "restart")) { + unsigned int pos = 0; + fh->speed = 0; + switch_core_file_seek(fh, &pos, 0, SEEK_SET); + return SWITCH_STATUS_SUCCESS; + } else if (!strncasecmp(ret, "seek", 4)) { + switch_codec_t *codec; + unsigned int samps = 0; + unsigned int pos = 0; + char *p; + codec = switch_core_session_get_read_codec(jss->session); - if ((p = strchr(ret, ':'))) { - p++; - if (*p == '+' || *p == '-') { - int step; - if (!(step = atoi(p))) { - step = 1000; - } - if (step > 0) { - samps = step * (codec->implementation->samples_per_second / 1000); - switch_core_file_seek(fh, &pos, samps, SEEK_CUR); + if ((p = strchr(ret, ':'))) { + p++; + if (*p == '+' || *p == '-') { + int step; + if (!(step = atoi(p))) { + step = 1000; + } + if (step > 0) { + samps = step * (codec->implementation->samples_per_second / 1000); + switch_core_file_seek(fh, &pos, samps, SEEK_CUR); + } else { + samps = step * (codec->implementation->samples_per_second / 1000); + switch_core_file_seek(fh, &pos, fh->pos - samps, SEEK_SET); + } } else { - samps = step * (codec->implementation->samples_per_second / 1000); - switch_core_file_seek(fh, &pos, fh->pos - samps, SEEK_SET); + samps = atoi(p) * (codec->implementation->samples_per_second / 1000); + switch_core_file_seek(fh, &pos, samps, SEEK_SET); } - } else { - samps = atoi(p) * (codec->implementation->samples_per_second / 1000); - switch_core_file_seek(fh, &pos, samps, SEEK_SET); } + + return SWITCH_STATUS_SUCCESS; } - return SWITCH_STATUS_SUCCESS; - } - - if (!strcmp(ret, "true") || !strcmp(ret, "undefined")) { - return SWITCH_STATUS_SUCCESS; - } + if (!strcmp(ret, "true") || !strcmp(ret, "undefined")) { + return SWITCH_STATUS_SUCCESS; + } - if (ret) { - switch_copy_string(cb_state->ret_buffer, ret, sizeof(cb_state->ret_buffer)); + if (ret) { + switch_copy_string(cb_state->ret_buffer, ret, sizeof(cb_state->ret_buffer)); + } } + + return SWITCH_STATUS_FALSE; } + break; + default: + break; + } + return SWITCH_STATUS_SUCCESS; - return SWITCH_STATUS_FALSE; } - -static switch_status_t js_record_dtmf_callback(switch_core_session_t *session, char *dtmf, void *buf, unsigned int buflen) +static switch_status_t js_record_dtmf_callback(switch_core_session_t *session, void *input, switch_input_type_t itype, void *buf, unsigned int buflen) { - char code[2048]; - struct dtmf_callback_state *cb_state = buf; - struct js_session *jss = cb_state->session_state; - switch_file_handle_t *fh = cb_state->extra; - jsval rval; - char *ret; + switch (itype) { + case SWITCH_INPUT_TYPE_DTMF: { + char *dtmf = (char *) input; + char code[2048]; + struct dtmf_callback_state *cb_state = buf; + struct js_session *jss = cb_state->session_state; + switch_file_handle_t *fh = cb_state->extra; + jsval rval; + char *ret; - if (!jss) { - return SWITCH_STATUS_FALSE; - } - - if (cb_state->digit_count || (cb_state->code_buffer[0] > 47 && cb_state->code_buffer[0] < 58)) { - char *d; - if (!cb_state->digit_count) { - cb_state->digit_count = atoi(cb_state->code_buffer); + if (!jss) { + return SWITCH_STATUS_FALSE; } - - for(d = dtmf; *d; d++) { - cb_state->ret_buffer[cb_state->ret_buffer_len++] = *d; - if ((cb_state->ret_buffer_len > cb_state->digit_count)|| - (cb_state->ret_buffer_len > sizeof(cb_state->ret_buffer))|| - (cb_state->ret_buffer_len >= cb_state->digit_count) - ) { - return SWITCH_STATUS_FALSE; + + if (cb_state->digit_count || (cb_state->code_buffer[0] > 47 && cb_state->code_buffer[0] < 58)) { + char *d; + if (!cb_state->digit_count) { + cb_state->digit_count = atoi(cb_state->code_buffer); } - } - return SWITCH_STATUS_SUCCESS; - } else { - snprintf(code, sizeof(code), "~%s(\"%s\")", cb_state->code_buffer, dtmf); - eval_some_js(code, jss->cx, jss->obj, &rval); - ret = JS_GetStringBytes(JS_ValueToString(jss->cx, rval)); - if (!strcasecmp(ret, "pause")) { - if (switch_test_flag(fh, SWITCH_FILE_PAUSE)) { - switch_clear_flag(fh, SWITCH_FILE_PAUSE); - } else { - switch_set_flag(fh, SWITCH_FILE_PAUSE); + for(d = dtmf; *d; d++) { + cb_state->ret_buffer[cb_state->ret_buffer_len++] = *d; + if ((cb_state->ret_buffer_len > cb_state->digit_count)|| + (cb_state->ret_buffer_len > sizeof(cb_state->ret_buffer))|| + (cb_state->ret_buffer_len >= cb_state->digit_count) + ) { + return SWITCH_STATUS_FALSE; + } } return SWITCH_STATUS_SUCCESS; - } else if (!strcasecmp(ret, "restart")) { - unsigned int pos = 0; - fh->speed = 0; - switch_core_file_seek(fh, &pos, 0, SEEK_SET); - return SWITCH_STATUS_SUCCESS; - } + } else { + snprintf(code, sizeof(code), "~%s(\"%s\")", cb_state->code_buffer, dtmf); + eval_some_js(code, jss->cx, jss->obj, &rval); + ret = JS_GetStringBytes(JS_ValueToString(jss->cx, rval)); - if (!strcmp(ret, "true") || !strcmp(ret, "undefined")) { - return SWITCH_STATUS_SUCCESS; - } + if (!strcasecmp(ret, "pause")) { + if (switch_test_flag(fh, SWITCH_FILE_PAUSE)) { + switch_clear_flag(fh, SWITCH_FILE_PAUSE); + } else { + switch_set_flag(fh, SWITCH_FILE_PAUSE); + } + return SWITCH_STATUS_SUCCESS; + } else if (!strcasecmp(ret, "restart")) { + unsigned int pos = 0; + fh->speed = 0; + switch_core_file_seek(fh, &pos, 0, SEEK_SET); + return SWITCH_STATUS_SUCCESS; + } + + if (!strcmp(ret, "true") || !strcmp(ret, "undefined")) { + return SWITCH_STATUS_SUCCESS; + } - if (ret) { - switch_copy_string(cb_state->ret_buffer, ret, sizeof(cb_state->ret_buffer)); + if (ret) { + switch_copy_string(cb_state->ret_buffer, ret, sizeof(cb_state->ret_buffer)); + } } + return SWITCH_STATUS_FALSE; } + break; + default: + break; + } - return SWITCH_STATUS_FALSE; + return SWITCH_STATUS_SUCCESS; } -static switch_status_t js_speak_dtmf_callback(switch_core_session_t *session, char *dtmf, void *buf, unsigned int buflen) +static switch_status_t js_speak_dtmf_callback(switch_core_session_t *session, void *input, switch_input_type_t itype, void *buf, unsigned int buflen) { - char code[2048]; - struct dtmf_callback_state *cb_state = buf; - struct js_session *jss = cb_state->session_state; - jsval rval; - char *ret; + switch (itype) { + case SWITCH_INPUT_TYPE_DTMF: { + char *dtmf = (char *) input; + char code[2048]; + struct dtmf_callback_state *cb_state = buf; + struct js_session *jss = cb_state->session_state; + jsval rval; + char *ret; - if (!jss) { - return SWITCH_STATUS_FALSE; - } - - if (cb_state->digit_count || (cb_state->code_buffer[0] > 47 && cb_state->code_buffer[0] < 58)) { - char *d; - if (!cb_state->digit_count) { - cb_state->digit_count = atoi(cb_state->code_buffer); + if (!jss) { + return SWITCH_STATUS_FALSE; } - - for(d = dtmf; *d; d++) { - cb_state->ret_buffer[cb_state->ret_buffer_len++] = *d; - if ((cb_state->ret_buffer_len > cb_state->digit_count)|| - (cb_state->ret_buffer_len > sizeof(cb_state->ret_buffer))|| - (cb_state->ret_buffer_len >= cb_state->digit_count) - ) { - return SWITCH_STATUS_FALSE; + + if (cb_state->digit_count || (cb_state->code_buffer[0] > 47 && cb_state->code_buffer[0] < 58)) { + char *d; + if (!cb_state->digit_count) { + cb_state->digit_count = atoi(cb_state->code_buffer); } - } - return SWITCH_STATUS_SUCCESS; - } else { - snprintf(code, sizeof(code), "~%s(\"%s\")", cb_state->code_buffer, dtmf); - eval_some_js(code, jss->cx, jss->obj, &rval); - ret = JS_GetStringBytes(JS_ValueToString(jss->cx, rval)); - if (!strcmp(ret, "true") || !strcmp(ret, "undefined")) { + for(d = dtmf; *d; d++) { + cb_state->ret_buffer[cb_state->ret_buffer_len++] = *d; + if ((cb_state->ret_buffer_len > cb_state->digit_count)|| + (cb_state->ret_buffer_len > sizeof(cb_state->ret_buffer))|| + (cb_state->ret_buffer_len >= cb_state->digit_count) + ) { + return SWITCH_STATUS_FALSE; + } + } return SWITCH_STATUS_SUCCESS; - } + } else { + snprintf(code, sizeof(code), "~%s(\"%s\")", cb_state->code_buffer, dtmf); + eval_some_js(code, jss->cx, jss->obj, &rval); + ret = JS_GetStringBytes(JS_ValueToString(jss->cx, rval)); + + if (!strcmp(ret, "true") || !strcmp(ret, "undefined")) { + return SWITCH_STATUS_SUCCESS; + } - if (ret) { - switch_copy_string(cb_state->ret_buffer, ret, sizeof(cb_state->ret_buffer)); + if (ret) { + switch_copy_string(cb_state->ret_buffer, ret, sizeof(cb_state->ret_buffer)); + } } + + return SWITCH_STATUS_FALSE; } + break; + default: + break; + } - return SWITCH_STATUS_FALSE; + return SWITCH_STATUS_SUCCESS; + } static JSBool session_recordfile(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) @@ -397,7 +426,7 @@ char *dtmf_callback = NULL; void *bp = NULL; int len = 0; - switch_dtmf_callback_function_t dtmf_func = NULL; + switch_input_callback_function_t dtmf_func = NULL; struct dtmf_callback_state cb_state = {0}; switch_file_handle_t fh; @@ -443,7 +472,7 @@ char *dtmf_callback = NULL; void *bp = NULL; int len = 0; - switch_dtmf_callback_function_t dtmf_func = NULL; + switch_input_callback_function_t dtmf_func = NULL; struct dtmf_callback_state cb_state = {0}; switch_file_handle_t fh; @@ -499,7 +528,7 @@ void *bp = NULL; int len = 0; struct dtmf_callback_state cb_state = {0}; - switch_dtmf_callback_function_t dtmf_func = NULL; + switch_input_callback_function_t dtmf_func = NULL; channel = switch_core_session_get_channel(jss->session); assert(channel != NULL); @@ -1756,12 +1785,24 @@ /*********************************************************************************/ static JSBool js_log(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - char *msg; + char *level_str, *msg; + switch_log_level_t level = SWITCH_LOG_DEBUG; + + if (argc > 1) { + if ((level_str = JS_GetStringBytes(JS_ValueToString(cx, argv[0])))) { + level = switch_log_str2level(level_str); + } - if ((msg = JS_GetStringBytes(JS_ValueToString(cx, argv[0])))) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "JS_LOG: %s", msg); - return JS_TRUE; - } + if ((msg = JS_GetStringBytes(JS_ValueToString(cx, argv[1])))) { + switch_log_printf(SWITCH_CHANNEL_LOG, level, "JS_LOG: %s", msg); + return JS_TRUE; + } + } else if (argc > 0) { + if ((msg = JS_GetStringBytes(JS_ValueToString(cx, argv[0])))) { + switch_log_printf(SWITCH_CHANNEL_LOG, level, "JS_LOG: %s", msg); + return JS_TRUE; + } + } return JS_FALSE; } @@ -1804,6 +1845,8 @@ stream.end = stream.data; stream.data_size = sizeof(retbuf); switch_api_execute(cmd, arg, &stream); + stream.write_function = switch_console_stream_write; + *rval = STRING_TO_JSVAL (JS_NewStringCopyZ(cx, retbuf)); } else { *rval = STRING_TO_JSVAL (JS_NewStringCopyZ(cx, "")); Modified: freeswitch/branches/stkn/src/mod/loggers/mod_syslog/mod_syslog.c ============================================================================== --- freeswitch/branches/stkn/src/mod/loggers/mod_syslog/mod_syslog.c (original) +++ freeswitch/branches/stkn/src/mod/loggers/mod_syslog/mod_syslog.c Wed Jul 12 19:43:02 2006 @@ -106,12 +106,15 @@ SWITCH_MOD_DECLARE(switch_status_t) switch_module_load(const switch_loadable_module_interface_t **interface, char *filename) { *interface = &console_module_interface; + switch_status_t status; - switch_log_bind_logger(mod_syslog_logger, SWITCH_LOG_DEBUG); + if ((status=load_config()) != SWITCH_STATUS_SUCCESS) { + return status; + } - load_config(); - openlog(globals.ident, LOG_PID, LOG_USER); + + switch_log_bind_logger(mod_syslog_logger, SWITCH_LOG_DEBUG); return SWITCH_STATUS_SUCCESS; } @@ -129,27 +132,28 @@ char *var, *val; char *cf = "syslog.conf"; - if (!switch_config_open_file(&cfg, cf)) { + memset(&globals, 0, sizeof(globals)); + + if (switch_config_open_file(&cfg, cf)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf); - return SWITCH_STATUS_TERM; - } - while (switch_config_next_pair(&cfg, &var, &val)) { - if (!strcasecmp(cfg.category, "settings")) { - if (!strcmp(var, "ident")) { - set_global_ident(val); - } else if (!strcmp(var, "facility")) { - set_global_facility(val); - } else if (!strcmp(var, "format")) { - set_global_format(val); - } else if (!strcmp(var, "level")) { - set_global_level(val);; + while (switch_config_next_pair(&cfg, &var, &val)) { + if (!strcasecmp(cfg.category, "settings")) { + if (!strcmp(var, "ident")) { + set_global_ident(val); + } else if (!strcmp(var, "facility")) { + set_global_facility(val); + } else if (!strcmp(var, "format")) { + set_global_format(val); + } else if (!strcmp(var, "level")) { + set_global_level(val);; + } } } + + switch_config_close_file(&cfg); } - switch_config_close_file(&cfg); - if (switch_strlen_zero(globals.ident)) { set_global_ident(DEFAULT_IDENT); } Modified: freeswitch/branches/stkn/src/switch_core.c ============================================================================== --- freeswitch/branches/stkn/src/switch_core.c (original) +++ freeswitch/branches/stkn/src/switch_core.c Wed Jul 12 19:43:02 2006 @@ -307,7 +307,7 @@ return status; } -SWITCH_DECLARE(switch_status_t) switch_core_session_event_send(char *uuid_str, switch_event_t *event) +SWITCH_DECLARE(switch_status_t) switch_core_session_event_send(char *uuid_str, switch_event_t **event) { switch_core_session_t *session = NULL; switch_status_t status = SWITCH_STATUS_FALSE; @@ -1057,35 +1057,79 @@ return status; } -SWITCH_DECLARE(switch_status_t) switch_core_session_queue_event(switch_core_session_t *session, switch_event_t *event) + +SWITCH_DECLARE(switch_status_t) switch_core_session_receive_event(switch_core_session_t *session, switch_event_t **event) { - switch_io_event_hook_queue_event_t *ptr; - switch_status_t status = SWITCH_STATUS_FALSE, istatus = SWITCH_STATUS_FALSE;; + switch_io_event_hook_receive_event_t *ptr; + switch_status_t status = SWITCH_STATUS_FALSE; assert(session != NULL); - if (session->endpoint_interface->io_routines->queue_event) { - status = session->endpoint_interface->io_routines->queue_event(session, event); - if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK) { - for (ptr = session->event_hooks.queue_event; ptr; ptr = ptr->next) { - if ((istatus = ptr->queue_event(session, event)) != SWITCH_STATUS_SUCCESS) { - break; + /* Acquire a read lock on the session or forget it the channel is dead */ + if (switch_thread_rwlock_tryrdlock(session->rwlock) == SWITCH_STATUS_SUCCESS) { + if (switch_channel_get_state(session->channel) < CS_HANGUP) { + if (session->endpoint_interface->io_routines->receive_event) { + status = session->endpoint_interface->io_routines->receive_event(session, *event); + } + + if (status == SWITCH_STATUS_SUCCESS) { + for (ptr = session->event_hooks.receive_event; ptr; ptr = ptr->next) { + if ((status = ptr->receive_event(session, *event)) != SWITCH_STATUS_SUCCESS) { + break; + } } } - } - - if (status == SWITCH_STATUS_SUCCESS || status == SWITCH_STATUS_BREAK) { - if (!session->event_queue) { - switch_queue_create(&session->event_queue, SWITCH_EVENT_QUEUE_LEN, session->pool); + + if (status == SWITCH_STATUS_BREAK) { + status = SWITCH_STATUS_SUCCESS; } - switch_queue_push(session->event_queue, event); + + if (status == SWITCH_STATUS_SUCCESS) { + switch_event_destroy(event); + } } + switch_thread_rwlock_unlock(session->rwlock); } + + return status; +} +SWITCH_DECLARE(switch_status_t) switch_core_session_queue_event(switch_core_session_t *session, switch_event_t **event) + +{ + switch_status_t status = SWITCH_STATUS_SUCCESS; + + assert(session != NULL); + + if (!session->event_queue) { + switch_queue_create(&session->event_queue, SWITCH_EVENT_QUEUE_LEN, session->pool); + } + + if ((status = (switch_status_t) switch_queue_push(session->event_queue, *event) == SWITCH_STATUS_SUCCESS)) { + *event = NULL; + } + return status; } +SWITCH_DECLARE(switch_status_t) switch_core_session_dequeue_event(switch_core_session_t *session, switch_event_t **event) + +{ + switch_status_t status = SWITCH_STATUS_FALSE; + void *pop; + + assert(session != NULL); + + if (session->event_queue) { + if ((status = (switch_status_t) switch_queue_trypop(session->event_queue, &pop)) == SWITCH_STATUS_SUCCESS) { + *event = (switch_event_t *) pop; + } + } + + return status; +} + SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_session_t *session, switch_frame_t **frame, int timeout, int stream_id) { @@ -2870,9 +2914,9 @@ SWITCH_DECLARE(switch_status_t) switch_core_init(char *console, const char **err) { + switch_xml_t xml = NULL, cfg = NULL; memset(&runtime, 0, sizeof(runtime)); runtime.session_limit = 1000; - switch_xml_t xml = NULL, cfg = NULL; switch_core_set_globals(); Modified: freeswitch/branches/stkn/src/switch_ivr.c ============================================================================== --- freeswitch/branches/stkn/src/switch_ivr.c (original) +++ freeswitch/branches/stkn/src/switch_ivr.c Wed Jul 12 19:43:02 2006 @@ -36,7 +36,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_collect_digits_callback(switch_core_session_t *session, - switch_dtmf_callback_function_t dtmf_callback, + switch_input_callback_function_t input_callback, void *buf, unsigned int buflen) { @@ -46,19 +46,26 @@ channel = switch_core_session_get_channel(session); assert(channel != NULL); - if (!dtmf_callback) { + if (!input_callback) { return SWITCH_STATUS_GENERR; } while(switch_channel_ready(channel)) { switch_frame_t *read_frame; + switch_event_t *event; + char dtmf[128]; if (switch_channel_has_dtmf(channel)) { switch_channel_dequeue_dtmf(channel, dtmf, sizeof(dtmf)); - status = dtmf_callback(session, dtmf, buf, buflen); + status = input_callback(session, dtmf, SWITCH_INPUT_TYPE_DTMF, buf, buflen); } + if (switch_core_session_dequeue_event(session, &event) == SWITCH_STATUS_SUCCESS) { + status = input_callback(session, event, SWITCH_INPUT_TYPE_EVENT, buf, buflen); + switch_event_destroy(&event); + } + if (status != SWITCH_STATUS_SUCCESS) { break; } @@ -156,7 +163,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_record_file(switch_core_session_t *session, switch_file_handle_t *fh, char *file, - switch_dtmf_callback_function_t dtmf_callback, + switch_input_callback_function_t input_callback, void *buf, unsigned int buflen) { @@ -216,22 +223,31 @@ while(switch_channel_ready(channel)) { switch_size_t len; + switch_event_t *event; - if (dtmf_callback || buf) { + if (input_callback || buf) { /* dtmf handler function you can hook up to be executed when a digit is dialed during playback if you return anything but SWITCH_STATUS_SUCCESS the playback will stop. */ if (switch_channel_has_dtmf(channel)) { switch_channel_dequeue_dtmf(channel, dtmf, sizeof(dtmf)); - if (dtmf_callback) { - status = dtmf_callback(session, dtmf, buf, buflen); + if (input_callback) { + status = input_callback(session, dtmf, SWITCH_INPUT_TYPE_DTMF, buf, buflen); } else { switch_copy_string((char *)buf, dtmf, buflen); status = SWITCH_STATUS_BREAK; } } + if (input_callback) { + if (switch_core_session_dequeue_event(session, &event) == SWITCH_STATUS_SUCCESS) { + status = input_callback(session, event, SWITCH_INPUT_TYPE_EVENT, buf, buflen); + switch_event_destroy(&event); + } + } + + if (status != SWITCH_STATUS_SUCCESS) { break; } @@ -257,7 +273,7 @@ switch_file_handle_t *fh, char *file, char *timer_name, - switch_dtmf_callback_function_t dtmf_callback, + switch_input_callback_function_t input_callback, void *buf, unsigned int buflen) { @@ -352,21 +368,29 @@ int done = 0; int do_speed = 1; int last_speed = -1; + switch_event_t *event; - if (dtmf_callback || buf) { + if (input_callback || buf) { /* dtmf handler function you can hook up to be executed when a digit is dialed during playback if you return anything but SWITCH_STATUS_SUCCESS the playback will stop. */ if (switch_channel_has_dtmf(channel)) { switch_channel_dequeue_dtmf(channel, dtmf, sizeof(dtmf)); - if (dtmf_callback) { - status = dtmf_callback(session, dtmf, buf, buflen); + if (input_callback) { + status = input_callback(session, dtmf, SWITCH_INPUT_TYPE_DTMF, buf, buflen); } else { switch_copy_string((char *)buf, dtmf, buflen); status = SWITCH_STATUS_BREAK; } } + + if (input_callback) { + if (switch_core_session_dequeue_event(session, &event) == SWITCH_STATUS_SUCCESS) { + status = input_callback(session, event, SWITCH_INPUT_TYPE_EVENT, buf, buflen); + switch_event_destroy(&event); + } + } if (status != SWITCH_STATUS_SUCCESS) { done = 1; @@ -501,7 +525,7 @@ switch_speech_handle_t *sh, switch_codec_t *codec, switch_timer_t *timer, - switch_dtmf_callback_function_t dtmf_callback, + switch_input_callback_function_t input_callback, char *text, void *buf, unsigned int buflen) @@ -559,8 +583,9 @@ ilen = len; while(switch_channel_ready(channel)) { + switch_event_t *event; - if (dtmf_callback || buf) { + if (input_callback || buf) { /* dtmf handler function you can hook up to be executed when a digit is dialed during playback if you return anything but SWITCH_STATUS_SUCCESS the playback will stop. @@ -570,15 +595,22 @@ status = SWITCH_STATUS_BREAK; } else { switch_channel_dequeue_dtmf(channel, dtmf, sizeof(dtmf)); - if (dtmf_callback) { - status = dtmf_callback(session, dtmf, buf, buflen); + if (input_callback) { + status = input_callback(session, dtmf, SWITCH_INPUT_TYPE_DTMF, buf, buflen); } else { switch_copy_string((char *)buf, dtmf, buflen); status = SWITCH_STATUS_BREAK; } } } - + + if (input_callback) { + if (switch_core_session_dequeue_event(session, &event) == SWITCH_STATUS_SUCCESS) { + status = input_callback(session, event, SWITCH_INPUT_TYPE_EVENT, buf, buflen); + switch_event_destroy(&event); + } + } + if (status != SWITCH_STATUS_SUCCESS) { done = 1; break; @@ -679,7 +711,7 @@ char *voice_name, char *timer_name, uint32_t rate, - switch_dtmf_callback_function_t dtmf_callback, + switch_input_callback_function_t input_callback, char *text, void *buf, unsigned int buflen) @@ -761,7 +793,7 @@ } } - switch_ivr_speak_text_handle(session, &sh, &codec, timer_name ? &timer : NULL, dtmf_callback, text, buf, buflen); + switch_ivr_speak_text_handle(session, &sh, &codec, timer_name ? &timer : NULL, input_callback, text, buf, buflen); flags = 0; switch_core_speech_close(&sh, &flags); switch_core_codec_destroy(&codec); @@ -790,7 +822,7 @@ switch_core_thread_session_t *his_thread, *data = obj; int *stream_id_p; int stream_id = 0, ans_a = 0, ans_b = 0; - switch_dtmf_callback_function_t dtmf_callback; + switch_input_callback_function_t input_callback; switch_core_session_message_t msg = {0}; void *user_data; @@ -804,7 +836,7 @@ session_b = data->objs[1]; stream_id_p = data->objs[2]; - dtmf_callback = (switch_dtmf_callback_function_t) data->objs[3]; + input_callback = (switch_input_callback_function_t) data->objs[3]; user_data = data->objs[4]; his_thread = data->objs[5]; @@ -824,6 +856,7 @@ while (data->running > 0 && his_thread->running > 0) { switch_channel_state_t b_state = switch_channel_get_state(chan_b); switch_status_t status; + switch_event_t *event; switch (b_state) { case CS_HANGUP: @@ -862,14 +895,26 @@ switch_channel_dequeue_dtmf(chan_a, dtmf, sizeof(dtmf)); switch_core_session_send_dtmf(session_b, dtmf); - if (dtmf_callback) { - if (dtmf_callback(session_a, dtmf, user_data, 0) != SWITCH_STATUS_SUCCESS) { + if (input_callback) { + if (input_callback(session_a, dtmf, SWITCH_INPUT_TYPE_DTMF, user_data, 0) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s ended call via DTMF\n", switch_channel_get_name(chan_a)); data->running = -1; break; } } - } + } + + if (switch_core_session_dequeue_event(session_a, &event) == SWITCH_STATUS_SUCCESS) { + if (input_callback) { + status = input_callback(session_a, event, SWITCH_INPUT_TYPE_EVENT, user_data, 0); + } + + if (switch_core_session_receive_event(session_b, &event) != SWITCH_STATUS_SUCCESS) { + switch_event_destroy(&event); + } + + } + } /* read audio from 1 channel and write it to the other */ @@ -973,7 +1018,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_multi_threaded_bridge(switch_core_session_t *session, switch_core_session_t *peer_session, unsigned int timelimit, - switch_dtmf_callback_function_t dtmf_callback, + switch_input_callback_function_t input_callback, void *session_data, void *peer_session_data) @@ -1002,7 +1047,7 @@ other_audio_thread->objs[0] = session; other_audio_thread->objs[1] = peer_session; other_audio_thread->objs[2] = &stream_id; - other_audio_thread->objs[3] = (void *) dtmf_callback; + other_audio_thread->objs[3] = (void *) input_callback; other_audio_thread->objs[4] = session_data; other_audio_thread->objs[5] = this_audio_thread; other_audio_thread->running = 5; @@ -1010,7 +1055,7 @@ this_audio_thread->objs[0] = peer_session; this_audio_thread->objs[1] = session; this_audio_thread->objs[2] = &stream_id; - this_audio_thread->objs[3] = (void *) dtmf_callback; + this_audio_thread->objs[3] = (void *) input_callback; this_audio_thread->objs[4] = peer_session_data; this_audio_thread->objs[5] = other_audio_thread; this_audio_thread->running = 2; Modified: freeswitch/branches/stkn/src/switch_loadable_module.c ============================================================================== --- freeswitch/branches/stkn/src/switch_loadable_module.c (original) +++ freeswitch/branches/stkn/src/switch_loadable_module.c Wed Jul 12 19:43:02 2006 @@ -668,7 +668,7 @@ name = prefs[x]; if ((p = strchr(name, '@'))) { p++; - len = p-name; + len = (uint32_t)(p-name); if (len > sizeof(buf)) { len = sizeof(buf); @@ -683,7 +683,7 @@ for (imp = codec_interface->implementations; imp; imp = imp->next) { if (!interval) { array[i++] = imp; - } else if ((imp->microseconds_per_frame / 1000) == interval) { + } else if ((uint32_t)(imp->microseconds_per_frame / 1000) == interval) { array[i++] = imp; } }
participants (1)
-
Freeswitch SVN