]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
keep hangup hook in the session thread
authorAnthony Minessale <anthony.minessale@gmail.com>
Sat, 31 May 2008 16:48:54 +0000 (16:48 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Sat, 31 May 2008 16:48:54 +0000 (16:48 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@8734 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/mod/languages/mod_spidermonkey/mod_spidermonkey.c
src/mod/languages/mod_spidermonkey/mod_spidermonkey.h
src/switch_core_io.c

index be5b3cd9986995ba39e4aebad95947f0caabcaa4..aa66dcc82d99cb8d1f5565af4fcaa15bc9253b61 100644 (file)
 #include <curl/curl.h>
 #endif
 static int foo = 0;
+static void check_hangup_hook(struct js_session *jss);
 
 SWITCH_MODULE_LOAD_FUNCTION(mod_spidermonkey_load);
 SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_spidermonkey_shutdown);
 SWITCH_MODULE_DEFINITION(mod_spidermonkey, mod_spidermonkey_load, mod_spidermonkey_shutdown, NULL);
 
-#define METHOD_SANITY_CHECK() do {                                                                             \
-if (!jss || !jss->session) {                                                                                   \
-       eval_some_js("~throw new Error(\"You must call the session.originate method before calling this method!\");", cx, obj, rval); \
-       *rval = BOOLEAN_TO_JSVAL(JS_FALSE);                                                                     \
-       return JS_FALSE;                                                                                                        \
- }                                                                                                                                             \
-       } while(foo == 1)
+#define METHOD_SANITY_CHECK()  if (!jss || !jss->session) {                            \
+               eval_some_js("~throw new Error(\"You must call the session.originate method before calling this method!\");", cx, obj, rval); \
+               *rval = BOOLEAN_TO_JSVAL(JS_FALSE);                                                             \
+               return JS_FALSE;                                                                                                \
+       } else check_hangup_hook(jss)
 
 #define CHANNEL_SANITY_CHECK() do {                                                                            \
                if (!switch_channel_ready(channel)) {                                                   \
@@ -1148,11 +1147,11 @@ static switch_status_t js_common_callback(switch_core_session_t *session, void *
                jss->stack_depth--;
                return SWITCH_STATUS_FALSE;
        }
-
+       check_hangup_hook(jss);
        JS_ResumeRequest(cb_state->cx, cb_state->saveDepth);
        JS_CallFunction(cb_state->cx, cb_state->obj, cb_state->function, argc, argv, &cb_state->ret);
        cb_state->saveDepth = JS_SuspendRequest(cb_state->cx);
-
+       check_hangup_hook(jss);
        jss->stack_depth--;
        return SWITCH_STATUS_SUCCESS;
 }
@@ -1420,7 +1419,9 @@ static JSBool session_recordfile(JSContext * cx, JSObject * obj, uintN argc, jsv
        args.input_callback = dtmf_func;
        args.buf = bp;
        args.buflen = len;
+       check_hangup_hook(jss);
        switch_ivr_record_file(jss->session, &fh, file_name, &args, limit);
+       check_hangup_hook(jss);
        JS_ResumeRequest(cx, cb_state.saveDepth);
        *rval = cb_state.ret;
 
@@ -1470,7 +1471,9 @@ static JSBool session_collect_input(JSContext * cx, JSObject * obj, uintN argc,
        args.input_callback = dtmf_func;
        args.buf = bp;
        args.buflen = len;
+       check_hangup_hook(jss);
        switch_ivr_collect_digits_callback(jss->session, &args, to);
+       check_hangup_hook(jss);
        JS_ResumeRequest(cx, cb_state.saveDepth);
 
        *rval = cb_state.ret;
@@ -1544,9 +1547,9 @@ static JSBool session_sayphrase(JSContext * cx, JSObject * obj, uintN argc, jsva
        args.input_callback = dtmf_func;
        args.buf = bp;
        args.buflen = len;
-
+       check_hangup_hook(jss);
        switch_ivr_phrase_macro(jss->session, phrase_name, phrase_data, phrase_lang, &args);
-
+       check_hangup_hook(jss);
        JS_ResumeRequest(cx, cb_state.saveDepth);
        *rval = cb_state.ret;
 
@@ -1559,7 +1562,8 @@ static void check_hangup_hook(struct js_session *jss)
        int argc = 0;
        jsval ret;
 
-       if (jss->on_hangup && (jss->hook_state == CS_HANGUP || jss->hook_state == CS_ROUTING)) {
+       if (!jss->check_state && jss->on_hangup && (jss->hook_state == CS_HANGUP || jss->hook_state == CS_ROUTING)) {
+               jss->check_state++;
                argv[argc++] = OBJECT_TO_JSVAL(jss->obj);
                if (jss->hook_state == CS_HANGUP) {
                        argv[argc++] = STRING_TO_JSVAL(JS_NewStringCopyZ(jss->cx, "hangup"));
@@ -1579,7 +1583,7 @@ static switch_status_t hanguphook(switch_core_session_t *session)
                switch_channel_state_t state = switch_channel_get_state(channel);
                if (jss->hook_state != state) {
                        jss->hook_state = state;
-                       check_hangup_hook(jss);
+                       jss->check_state = 0;
                }
        }
 
@@ -1673,7 +1677,9 @@ static JSBool session_streamfile(JSContext * cx, JSObject * obj, uintN argc, jsv
        args.input_callback = dtmf_func;
        args.buf = bp;
        args.buflen = len;
+       check_hangup_hook(jss);
        switch_ivr_play_file(jss->session, &fh, file_name, &args);
+       check_hangup_hook(jss);
        JS_ResumeRequest(cx, cb_state.saveDepth);
        *rval = cb_state.ret;
 
@@ -1862,7 +1868,9 @@ static JSBool session_speak(JSContext * cx, JSObject * obj, uintN argc, jsval *
        args.buflen = len;
 
        switch_core_speech_flush_tts(&jss->speech->sh);
+       check_hangup_hook(jss);
        switch_ivr_speak_text_handle(jss->session, &jss->speech->sh, &jss->speech->codec, NULL, text, &args);
+       check_hangup_hook(jss);
        JS_ResumeRequest(cx, cb_state.saveDepth);
        *rval = cb_state.ret;
 
@@ -2011,7 +2019,7 @@ static JSBool session_wait_for_media(JSContext * cx, JSObject * obj, uintN argc,
        if (argc > 0) {
                JS_ValueToInt32(cx, argv[0], &timeout);
        }
-
+       check_hangup_hook(jss);
        saveDepth = JS_SuspendRequest(cx);
        for (;;) {
                if (((elapsed = (unsigned int) ((switch_timestamp_now() - started) / 1000)) > (switch_time_t) timeout)
@@ -2029,7 +2037,7 @@ static JSBool session_wait_for_media(JSContext * cx, JSObject * obj, uintN argc,
                switch_yield(1000);
        }
        JS_ResumeRequest(cx, saveDepth);
-
+       check_hangup_hook(jss);
        return JS_TRUE;
 }
 
@@ -2050,7 +2058,7 @@ static JSBool session_wait_for_answer(JSContext * cx, JSObject * obj, uintN argc
        if (argc > 0) {
                JS_ValueToInt32(cx, argv[0], &timeout);
        }
-
+       check_hangup_hook(jss);
        saveDepth = JS_SuspendRequest(cx);
        for (;;) {
                if (((elapsed = (unsigned int) ((switch_timestamp_now() - started) / 1000)) > (switch_time_t) timeout)
@@ -2067,7 +2075,7 @@ static JSBool session_wait_for_answer(JSContext * cx, JSObject * obj, uintN argc
                switch_yield(1000);
        }
        JS_ResumeRequest(cx, saveDepth);
-
+       check_hangup_hook(jss);
        return JS_TRUE;
 }
 
@@ -2097,7 +2105,9 @@ static JSBool session_execute(JSContext * cx, JSObject * obj, uintN argc, jsval
                if ((application_interface = switch_loadable_module_get_application_interface(app_name))) {
                        if (application_interface->application_function) {
                                saveDepth = JS_SuspendRequest(cx);
+                               check_hangup_hook(jss);
                                switch_core_session_exec(jss->session, application_interface, app_arg);
+                               check_hangup_hook(jss);
                                JS_ResumeRequest(cx, saveDepth);
                                retval = JS_TRUE;
                        }
index cd2ebf1f0e10c879e5c09f6d8d842513e1aabf27..d8e12d9ad137f25d30bb8901b150b229f00ccb6d 100644 (file)
@@ -146,6 +146,7 @@ struct js_session {
        char *rdnis;
        char *context;
        char *username;
+       int check_state;
        struct js_session_speech *speech;
 };
 
index 930645d614746934903bb0e8e61e31fbac1a5fc7..3fec1f208972d16ac9f21cf0f35bd282e703b014 100644 (file)
@@ -634,6 +634,11 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_write_frame(switch_core_sess
                                status = SWITCH_STATUS_SUCCESS;
                                break;
                        default:
+                               if (ptime_mismatch) {
+                                       status = perform_write(session, frame, flags, stream_id);
+                                       return SWITCH_STATUS_SUCCESS;
+                               }
+
                                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Codec %s decoder error!\n", frame->codec->codec_interface->interface_name);
                                return status;
                        }