change callback prototype on js (will break all callback scripts)

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@6995 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
Anthony Minessale 2007-12-27 20:45:26 +00:00
parent cdf7c4a032
commit 7123237991
2 changed files with 145 additions and 12 deletions

View File

@ -147,7 +147,7 @@ function SpeechDetect(session, mod, ip) {
} }
/* Callback function for streaming,TTS or bridged calls */ /* Callback function for streaming,TTS or bridged calls */
this.onInput = function(type, inputEvent, _this) { this.onInput = function(s, type, inputEvent, _this) {
if (type == "event") { if (type == "event") {
var speech_type = inputEvent.getHeader("Speech-Type"); var speech_type = inputEvent.getHeader("Speech-Type");
var rv = new Array(); var rv = new Array();

View File

@ -760,6 +760,111 @@ JSClass event_class = {
}; };
/* Dtmf Object */
/*********************************************************************************/
static JSBool dtmf_construct(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval)
{
if (argc > 0) {
switch_dtmf_t *dtmf;
int32_t duration = SWITCH_DEFAULT_DTMF_DURATION;
char *ename;
if (argc > 0) {
ename = JS_GetStringBytes(JS_ValueToString(cx, argv[0]));
} else {
eval_some_js("~throw new Error(\"Invalid Args\");", cx, obj, rval);
return JS_FALSE;
}
if (argc > 1) {
JS_ValueToInt32(cx, argv[1], &duration);
if (duration <= 0) {
duration = SWITCH_DEFAULT_DTMF_DURATION;
}
}
if ((dtmf = malloc(sizeof(*dtmf)))) {
JS_SetPrivate(cx, obj, dtmf);
return JS_TRUE;
}
}
return JS_FALSE;
}
static void dtmf_destroy(JSContext * cx, JSObject * obj)
{
switch_dtmf_t *dtmf = JS_GetPrivate(cx, obj);
if (dtmf) {
switch_safe_free(dtmf);
JS_SetPrivate(cx, obj, NULL);
}
}
enum dtmf_tinyid {
DTMF_DIGIT, DTMF_DURATION
};
static JSFunctionSpec dtmf_methods[] = {
{0}
};
static JSPropertySpec dtmf_props[] = {
{"digit", DTMF_DIGIT, JSPROP_READONLY | JSPROP_PERMANENT},
{"duration", DTMF_DURATION, JSPROP_READONLY | JSPROP_PERMANENT},
{0}
};
static JSBool dtmf_getProperty(JSContext * cx, JSObject * obj, jsval id, jsval * vp)
{
JSBool res = JS_TRUE;
switch_dtmf_t *dtmf = JS_GetPrivate(cx, obj);
char *name;
int param = 0;
if (!dtmf) {
*vp = BOOLEAN_TO_JSVAL(JS_FALSE);
return JS_TRUE;
}
name = JS_GetStringBytes(JS_ValueToString(cx, id));
/* numbers are our props anything else is a method */
if (name[0] >= 48 && name[0] <= 57) {
param = atoi(name);
} else {
return JS_TRUE;
}
switch (param) {
case DTMF_DIGIT:
{
char tmp[2] = { dtmf->digit, '\0' };
*vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, tmp));
}
break;
case DTMF_DURATION:
{
*vp = INT_TO_JSVAL((int)dtmf->duration);
}
break;
}
return res;
}
JSClass dtmf_class = {
"DTMF", JSCLASS_HAS_PRIVATE,
JS_PropertyStub, JS_PropertyStub, dtmf_getProperty, DEFAULT_SET_PROPERTY,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, dtmf_destroy, NULL, NULL, NULL,
dtmf_construct
};
static void js_error(JSContext * cx, const char *message, JSErrorReport * report) static void js_error(JSContext * cx, const char *message, JSErrorReport * report)
{ {
const char *filename = __FILE__; const char *filename = __FILE__;
@ -977,11 +1082,29 @@ JSObject *new_js_event(switch_event_t *event, char *name, JSContext * cx, JSObje
return Event; return Event;
} }
JSObject *new_js_dtmf(switch_dtmf_t *dtmf, char *name, JSContext * cx, JSObject * obj)
{
JSObject *DTMF = NULL;
switch_dtmf_t *ddtmf;
if ((ddtmf = malloc(sizeof(*ddtmf)))) {
*ddtmf = *dtmf;
if ((DTMF = JS_DefineObject(cx, obj, name, &dtmf_class, NULL, 0))) {
JS_SetPrivate(cx, DTMF, ddtmf);
JS_DefineProperties(cx, DTMF, dtmf_props);
JS_DefineFunctions(cx, DTMF, dtmf_methods);
} else {
abort();
}
}
return DTMF;
}
#define MAX_STACK_DEPTH 2 #define MAX_STACK_DEPTH 2
static switch_status_t js_common_callback(switch_core_session_t *session, void *input, switch_input_type_t itype, void *buf, unsigned int buflen) static switch_status_t js_common_callback(switch_core_session_t *session, void *input, switch_input_type_t itype, void *buf, unsigned int buflen)
{ {
char dtmf[2] = "";
switch_event_t *event = NULL; switch_event_t *event = NULL;
struct input_callback_state *cb_state = buf; struct input_callback_state *cb_state = buf;
struct js_session *jss = cb_state->session_state; struct js_session *jss = cb_state->session_state;
@ -997,6 +1120,15 @@ static switch_status_t js_common_callback(switch_core_session_t *session, void *
jss->stack_depth++; jss->stack_depth++;
if (cb_state->jss_a && cb_state->jss_a->session && cb_state->jss_a->session == session) {
argv[argc++] = OBJECT_TO_JSVAL(cb_state->session_obj_a);
} else if (cb_state->jss_b && cb_state->jss_b->session && cb_state->jss_b->session == session) {
argv[argc++] = OBJECT_TO_JSVAL(cb_state->session_obj_b);
} else {
argv[argc++] = OBJECT_TO_JSVAL(cb_state->session_state);
}
switch (itype) { switch (itype) {
case SWITCH_INPUT_TYPE_EVENT: case SWITCH_INPUT_TYPE_EVENT:
if ((event = (switch_event_t *) input)) { if ((event = (switch_event_t *) input)) {
@ -1012,11 +1144,14 @@ static switch_status_t js_common_callback(switch_core_session_t *session, void *
break; break;
case SWITCH_INPUT_TYPE_DTMF: case SWITCH_INPUT_TYPE_DTMF:
{ {
switch_dtmf_t *_dtmf = (switch_dtmf_t *) input; switch_dtmf_t *dtmf = (switch_dtmf_t *) input;
dtmf[0] = _dtmf->digit;
dtmf[1] = '\0'; if (dtmf) {
argv[argc++] = STRING_TO_JSVAL(JS_NewStringCopyZ(cb_state->cx, "dtmf")); if ((Event = new_js_dtmf(dtmf, "_XX_DTMF_XX_", cb_state->cx, cb_state->obj))) {
argv[argc++] = STRING_TO_JSVAL(JS_NewStringCopyZ(cb_state->cx, dtmf)); argv[argc++] = STRING_TO_JSVAL(JS_NewStringCopyZ(cb_state->cx, "dtmf"));
argv[argc++] = OBJECT_TO_JSVAL(Event);
}
}
} }
break; break;
} }
@ -1025,11 +1160,7 @@ static switch_status_t js_common_callback(switch_core_session_t *session, void *
argv[argc++] = cb_state->arg; argv[argc++] = cb_state->arg;
} }
if (cb_state->jss_a && cb_state->jss_a->session && cb_state->jss_a->session == session) {
argv[argc++] = OBJECT_TO_JSVAL(cb_state->session_obj_a);
} else if (cb_state->jss_b && cb_state->jss_b->session && cb_state->jss_b->session == session) {
argv[argc++] = OBJECT_TO_JSVAL(cb_state->session_obj_b);
}
if (jss->stack_depth > MAX_STACK_DEPTH) { if (jss->stack_depth > MAX_STACK_DEPTH) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Maximum recursive callback limit %d reached.\n", MAX_STACK_DEPTH); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Maximum recursive callback limit %d reached.\n", MAX_STACK_DEPTH);
@ -3247,6 +3378,8 @@ static int env_init(JSContext * cx, JSObject * javascript_object)
JS_InitClass(cx, javascript_object, NULL, &event_class, event_construct, 3, event_props, event_methods, event_props, event_methods); JS_InitClass(cx, javascript_object, NULL, &event_class, event_construct, 3, event_props, event_methods, event_props, event_methods);
JS_InitClass(cx, javascript_object, NULL, &dtmf_class, dtmf_construct, 3, dtmf_props, dtmf_methods, dtmf_props, dtmf_methods);
JS_InitClass(cx, javascript_object, NULL, &pcre_class, pcre_construct, 3, pcre_props, pcre_methods, pcre_props, pcre_methods); JS_InitClass(cx, javascript_object, NULL, &pcre_class, pcre_construct, 3, pcre_props, pcre_methods, pcre_props, pcre_methods);
return 1; return 1;