]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
add preAnswer method, and throw a js exception if session methods requiring a answere...
authorMichael Jerris <mike@jerris.com>
Sun, 24 Jun 2007 21:01:55 +0000 (21:01 +0000)
committerMichael Jerris <mike@jerris.com>
Sun, 24 Jun 2007 21:01:55 +0000 (21:01 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@5460 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/mod/languages/mod_spidermonkey/mod_spidermonkey.c

index 8bcdbe427e72def5bcf3d717e6259f6c959a068a..763293f5b4a38aaeb108b87ead594d1ed20669bd 100644 (file)
@@ -58,6 +58,19 @@ if (!jss || !jss->session) {                                                                                 \
                        *rval = BOOLEAN_TO_JSVAL(JS_FALSE);                                                     \
                        return JS_FALSE;                                                                                        \
                }                                                                                                                               \
+               if (!((switch_channel_test_flag(channel, CF_ANSWERED) || switch_channel_test_flag(channel, CF_EARLY_MEDIA)))) {                                                 \
+                       eval_some_js("~throw new Error(\"Session is not answered!\");", cx, obj, rval); \
+                       *rval = BOOLEAN_TO_JSVAL(JS_FALSE);                                                     \
+                       return JS_FALSE;                                                                                        \
+               }                                                                                                                               \
+       } while (foo == 1)
+
+#define CHANNEL_SANITY_CHECK_ANSWER() do {                                                                             \
+               if (!switch_channel_ready(channel)) {                                                   \
+                       eval_some_js("~throw new Error(\"Session is not active!\");", cx, obj, rval); \
+                       *rval = BOOLEAN_TO_JSVAL(JS_FALSE);                                                     \
+                       return JS_FALSE;                                                                                        \
+               }                                                                                                                               \
        } while (foo == 1)
 
 static void session_destroy(JSContext * cx, JSObject * obj);
@@ -1603,12 +1616,27 @@ static JSBool session_answer(JSContext * cx, JSObject * obj, uintN argc, jsval *
        channel = switch_core_session_get_channel(jss->session);
        assert(channel != NULL);
 
-       CHANNEL_SANITY_CHECK();
+       CHANNEL_SANITY_CHECK_ANSWER();
 
        switch_channel_answer(channel);
        return JS_TRUE;
 }
 
+static JSBool session_pre_answer(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval)
+{
+       struct js_session *jss = JS_GetPrivate(cx, obj);
+       switch_channel_t *channel;
+
+       METHOD_SANITY_CHECK();
+
+       channel = switch_core_session_get_channel(jss->session);
+       assert(channel != NULL);
+
+       CHANNEL_SANITY_CHECK_ANSWER();
+
+       switch_channel_pre_answer(channel);
+       return JS_TRUE;
+}
 
 static JSBool session_cdr(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval)
 {
@@ -2012,6 +2040,7 @@ static JSFunctionSpec session_methods[] = {
        {"getVariable", session_get_variable, 1},
        {"getDigits", session_get_digits, 1},
        {"answer", session_answer, 0},
+       {"preAnswer", session_pre_answer, 0},
        {"generateXmlCdr", session_cdr, 0},
        {"ready", session_ready, 0},
        {"waitForAnswer", session_wait_for_answer, 0},