--- mediatomb-0.12.1/configure.ac 2010-04-07 18:38:51.000000000 -0400 +++ mediatomb-0.12.1/configure.ac 2011-11-16 21:56:46.000000000 -0500 @@ -1006,14 +1006,23 @@ MOZLIB=smjs ], [ - LDFLAGS="-L$JS_SEARCH_LIBS $LDFLAGS_SAVE -lmozjs $ADD_PTHREAD_CFLAGS" - AC_CHECK_LIB(mozjs, JS_NewObject, + LDFLAGS="-L$JS_SEARCH_LIBS $LDFLAGS_SAVE -lmozjs185 $ADD_PTHREAD_CFLAGS" + AC_CHECK_LIB(mozjs185, JS_NewObject, [ - JS_LIBS="-L$JS_SEARCH_LIBS -lmozjs" - MOZLIB=mozjs + JS_LIBS="-L$JS_SEARCH_LIBS -lmozjs185" + MOZLIB=mozjs185 ], [ - AC_MSG_ERROR([Spidermonkey not found in requested location $JS_SEARCH_LIBS]) + LDFLAGS="-L$JS_SEARCH_LIBS $LDFLAGS_SAVE -lmozjs $ADD_PTHREAD_CFLAGS" + AC_CHECK_LIB(mozjs, JS_NewObject, + [ + JS_LIBS="-L$JS_SEARCH_LIBS -lmozjs" + MOZLIB=mozjs + ], + [ + AC_MSG_ERROR([Spidermonkey not found in requested location $JS_SEARCH_LIBS]) + ] + ) ] ) ] @@ -1036,39 +1045,58 @@ ], [ unset ac_cv_lib_smjs_JS_NewObject - AC_CHECK_LIB(mozjs, JS_NewObject, + AC_CHECK_LIB(mozjs185, JS_NewObject, [ - MOZLIB=mozjs - JS_LIBS="-lmozjs" + MOZLIB=mozjs185 + JS_LIBS="-lmozjs185" ], [ - LDFLAGS="-L$SEARCH_DIR_LIBS $LDFLAGS_SAVE $ADD_PTHREAD_CFLAGS" - unset ac_cv_lib_js_JS_NewObject - AC_CHECK_LIB(js, JS_NewObject, - [ - JS_LIBS="-L$SEARCH_DIR_LIBS -ljs" - MOZLIB=js - ], - [ - unset ac_cv_lib_smjs_JS_NewObject - AC_CHECK_LIB(smjs, JS_NewObject, - [ - JS_LIBS="-L$SEARCH_DIR_LIBS -lsmjs" - MOZLIB=smjs - ], - [ - LDFLAGS="-L$SEARCH_DIR_LIBS $LDFLAGS_SAVE -lmozjs" - unset ac_cv_lib_mozjs_JS_NewObject - AC_CHECK_LIB(mozjs, JS_NewObject, - [ - JS_LIBS="-L$SEARCH_DIR_LIBS -lmozjs" - MOZLIB=mozjs - ], - [ - JS_OK=missing - AC_MSG_RESULT(libjs/libsmjs link failed, giving up) - ] - ) + unset ac_cv_lib_smjs_JS_NewObject + AC_CHECK_LIB(mozjs, JS_NewObject, + [ + MOZLIB=mozjs + JS_LIBS="-lmozjs" + ], + [ + LDFLAGS="-L$SEARCH_DIR_LIBS $LDFLAGS_SAVE $ADD_PTHREAD_CFLAGS" + unset ac_cv_lib_js_JS_NewObject + AC_CHECK_LIB(js, JS_NewObject, + [ + JS_LIBS="-L$SEARCH_DIR_LIBS -ljs" + MOZLIB=js + ], + [ + unset ac_cv_lib_smjs_JS_NewObject + AC_CHECK_LIB(smjs, JS_NewObject, + [ + JS_LIBS="-L$SEARCH_DIR_LIBS -lsmjs" + MOZLIB=smjs + ], + [ + LDFLAGS="-L$SEARCH_DIR_LIBS $LDFLAGS_SAVE -lmozjs185" + unset ac_cv_lib_mozjs_JS_NewObject + AC_CHECK_LIB(mozjs185, JS_NewObject, + [ + JS_LIBS="-L$SEARCH_DIR_LIBS -lmozjs185" + MOZLIB=mozjs185 + ], + [ + LDFLAGS="-L$SEARCH_DIR_LIBS $LDFLAGS_SAVE -lmozjs" + unset ac_cv_lib_mozjs_JS_NewObject + AC_CHECK_LIB(mozjs, JS_NewObject, + [ + JS_LIBS="-L$SEARCH_DIR_LIBS -lmozjs" + MOZLIB=mozjs + ], + [ + JS_OK=missing + AC_MSG_RESULT(libjs/libsmjs link failed, giving up) + ] + ) + ] + ) + ] + ) ] ) ] diff -ur mediatomb-0.12.1.orig/build/Makefile.in mediatomb-0.12.1/build/Makefile.in --- mediatomb-0.12.1.orig/build/Makefile.in 2010-04-07 18:40:15.000000000 -0400 +++ mediatomb-0.12.1/build/Makefile.in 2011-11-16 22:28:06.000000000 -0500 @@ -257,7 +257,7 @@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ +CXXFLAGS = -fpermissive @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DB_AUTOCREATE_OPTION_ENABLED = @DB_AUTOCREATE_OPTION_ENABLED@ DB_AUTOCREATE_OPTION_REQUESTED = @DB_AUTOCREATE_OPTION_REQUESTED@ diff -ur mediatomb-0.12.1.orig/src/scripting/import_script.cc mediatomb-0.12.1/src/scripting/import_script.cc --- mediatomb-0.12.1.orig/src/scripting/import_script.cc 2010-03-25 10:58:05.000000000 -0400 +++ mediatomb-0.12.1/src/scripting/import_script.cc 2011-11-16 22:28:06.000000000 -0500 @@ -53,8 +53,8 @@ try { load(scriptPath); - root = JS_NewScriptObject(cx, script); - JS_AddNamedRoot(cx, &root, "ImportScript"); + root = JS_NewObject(cx, NULL, script, NULL); + JS_AddNamedObjectRoot(cx, &root, "ImportScript"); } catch (Exception ex) { @@ -117,7 +117,7 @@ #endif if (root) - JS_RemoveRoot(cx, &root); + JS_RemoveObjectRoot(cx, &root); #ifdef JS_THREADSAFE JS_EndRequest(cx); diff -ur mediatomb-0.12.1.orig/src/scripting/js_functions.cc mediatomb-0.12.1/src/scripting/js_functions.cc --- mediatomb-0.12.1.orig/src/scripting/js_functions.cc 2010-03-25 10:58:05.000000000 -0400 +++ mediatomb-0.12.1/src/scripting/js_functions.cc 2011-11-16 22:28:21.000000000 -0500 @@ -49,30 +49,45 @@ extern "C" { JSBool -js_print(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) +js_print(JSContext *cx, uintN argc, jsval *argv) { - uintN i; + uintN i, j; JSString *str; for (i = 0; i < argc; i++) { - str = JS_ValueToString(cx, argv[i]); + String fmtStr; + for (j = 0; j < argc; j++) + { + if (j == i) + fmtStr = fmtStr + "S"; + else + fmtStr = fmtStr + "*"; + } + if(!JS_ConvertArguments(cx, 1, JS_ARGV(cx, argv), fmtStr.c_str(), &str)) + { + log_debug("Could not parse input arguments\n"); + return JS_TRUE; + } + if (!str) return JS_TRUE; - argv[i] = STRING_TO_JSVAL(str); - log_js("%s\n", JS_GetStringBytes(str)); + + char * log_str = JS_EncodeString(cx, str); + log_js("%s\n", log_str); + JS_free(cx, log_str); } return JS_TRUE; } JSBool -js_copyObject(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) +js_copyObject(JSContext *cx, uintN argc, jsval *argv) { jsval arg; JSObject *js_cds_obj; JSObject *js_cds_clone_obj; - Script *self = (Script *)JS_GetPrivate(cx, obj); + Script *self = (Script *)JS_GetPrivate(cx, JS_THIS_OBJECT(cx, argv)); try { @@ -91,7 +106,7 @@ self->cdsObject2jsObject(cds_obj, js_cds_clone_obj); - *rval = OBJECT_TO_JSVAL(js_cds_clone_obj); + JS_SET_RVAL(cx, argv, OBJECT_TO_JSVAL(js_cds_clone_obj)); return JS_TRUE; @@ -110,28 +125,58 @@ } JSBool -js_addCdsObject(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) +js_addCdsObject(JSContext *cx, uintN argc, jsval *argv) { try { - jsval arg; - JSString *str; - String path; - String containerclass; + // Inputs from native code + JSObject *js_cds_obj = NULL; + JSString *str = NULL; + JSString *cont = NULL; - JSObject *js_cds_obj; + String path = nil; + String containerclass = nil; + + JSObject *obj = JS_THIS_OBJECT(cx, argv); JSObject *js_orig_obj = NULL; Ref orig_object; Ref p2i; Ref i2i; + switch (argc) + { + case 0: + log_debug("No input arguments given\n"); + return JS_FALSE; + case 1: + if(!JS_ConvertArguments(cx, 1, JS_ARGV(cx, argv), "o", &js_cds_obj)) + { + log_debug("Could not parse input arguments\n"); + return JS_TRUE; + } + break; + case 2: + if(!JS_ConvertArguments(cx, 2, JS_ARGV(cx, argv), "oS", &js_cds_obj, &str)) + { + log_debug("Could not parse input arguments\n"); + return JS_TRUE; + } + break; + default: + if(!JS_ConvertArguments(cx, 3, JS_ARGV(cx, argv), "oSS", &js_cds_obj, &str, &cont)) + { + log_debug("Could not parse input arguments\n"); + return JS_TRUE; + } + break; + } Script *self = (Script *)JS_GetPrivate(cx, obj); if (self == NULL) { log_debug("Could not retrieve class instance from global object\n"); - return JS_FALSE; + return JS_TRUE; } if (self->whoami() == S_PLAYLIST) @@ -142,26 +187,17 @@ { i2i = StringConverter::i2i(); } - - arg = argv[0]; - if (!JSVAL_IS_OBJECT(arg)) - return JS_TRUE; - if (!JS_ValueToObject(cx, arg, &js_cds_obj)) - return JS_TRUE; - // root it - argv[0] = OBJECT_TO_JSVAL(js_cds_obj); - str = JS_ValueToString(cx, argv[1]); if (!str) path = _("/"); else - path = JS_GetStringBytes(str); + path = JS_EncodeString(cx, str); + - JSString *cont = JS_ValueToString(cx, argv[2]); if (cont) { - containerclass = JS_GetStringBytes(cont); + containerclass = JS_EncodeString(cx, cont); if (!string_ok(containerclass) || containerclass == "undefined") containerclass = nil; } @@ -177,9 +213,6 @@ return JS_TRUE; } - // root it - argv[1] = OBJECT_TO_JSVAL(js_orig_obj); - orig_object = self->jsObject2cdsObject(js_orig_obj, self->getProcessedObject()); if (orig_object == nil) return JS_TRUE; @@ -285,8 +318,7 @@ JSString *str2 = JS_NewStringCopyN(cx, tmp.c_str(), tmp.length()); if (!str2) return JS_TRUE; - *rval = STRING_TO_JSVAL(str2); - + JS_SET_RVAL(cx, argv, STRING_TO_JSVAL(str2)); return JS_TRUE; } catch (ServerShutdownException se) @@ -302,7 +334,7 @@ return JS_TRUE; } -static JSBool convert_charset_generic(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval, charset_convert_t chr) +static JSBool convert_charset_generic(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, charset_convert_t chr) { try { @@ -321,7 +353,7 @@ { str = JS_ValueToString(cx, argv[0]); if (str) - result = JS_GetStringBytes(str); + result = JS_EncodeString(cx, str); } if (result != nil) @@ -330,7 +362,7 @@ JSString *str2 = JS_NewStringCopyN(cx, result.c_str(), result.length()); if (!str2) return JS_TRUE; - *rval = STRING_TO_JSVAL(str2); + JS_SET_RVAL(cx, argv, STRING_TO_JSVAL(str2)); } } catch (ServerShutdownException se) @@ -347,24 +379,23 @@ } -JSBool js_f2i(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) +JSBool js_f2i(JSContext *cx, uintN argc, jsval *argv) { - return convert_charset_generic(cx, obj, argc, argv, rval, F2I); + return convert_charset_generic(cx, JS_THIS_OBJECT(cx, argv), argc, argv, F2I); } -JSBool js_m2i(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) +JSBool js_m2i(JSContext *cx, uintN argc, jsval *argv) { - return convert_charset_generic(cx, obj, argc, argv, rval, M2I); -} + return convert_charset_generic(cx, JS_THIS_OBJECT(cx, argv), argc, argv, M2I); } -JSBool js_p2i(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) +JSBool js_p2i(JSContext *cx, uintN argc, jsval *argv) { - return convert_charset_generic(cx, obj, argc, argv, rval, P2I); + return convert_charset_generic(cx, JS_THIS_OBJECT(cx, argv), argc, argv, P2I); } -JSBool js_j2i(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) +JSBool js_j2i(JSContext *cx, uintN argc, jsval *argv) { - return convert_charset_generic(cx, obj, argc, argv, rval, J2I); + return convert_charset_generic(cx, JS_THIS_OBJECT(cx, argv), argc, argv, J2I); } } // extern "C" diff -ur mediatomb-0.12.1.orig/src/scripting/js_functions.h mediatomb-0.12.1/src/scripting/js_functions.h --- mediatomb-0.12.1.orig/src/scripting/js_functions.h 2010-03-25 10:58:05.000000000 -0400 +++ mediatomb-0.12.1/src/scripting/js_functions.h 2011-11-16 22:28:06.000000000 -0500 @@ -40,18 +40,18 @@ extern "C" { /// \brief Log output. -JSBool js_print(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval); +JSBool js_print(JSContext *cx, uintN argc, jsval *argv); /// \brief Adds an object to the database. -JSBool js_addCdsObject(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval); +JSBool js_addCdsObject(JSContext *cx, uintN argc, jsval *argv); /// \brief Makes a copy of an CDS object. -JSBool js_copyObject(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval); +JSBool js_copyObject(JSContext *cx, uintN argc, jsval *argv); -JSBool js_f2i(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval); -JSBool js_m2i(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval); -JSBool js_p2i(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval); -JSBool js_j2i(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval); +JSBool js_f2i(JSContext *cx, uintN argc, jsval *argv); +JSBool js_m2i(JSContext *cx, uintN argc, jsval *argv); +JSBool js_p2i(JSContext *cx, uintN argc, jsval *argv); +JSBool js_j2i(JSContext *cx, uintN argc, jsval *argv); } // extern "C" diff -ur mediatomb-0.12.1.orig/src/scripting/playlist_parser_script.cc mediatomb-0.12.1/src/scripting/playlist_parser_script.cc --- mediatomb-0.12.1.orig/src/scripting/playlist_parser_script.cc 2010-03-25 10:58:05.000000000 -0400 +++ mediatomb-0.12.1/src/scripting/playlist_parser_script.cc 2011-11-16 22:28:06.000000000 -0500 @@ -46,9 +46,9 @@ extern "C" { static JSBool -js_readln(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) +js_readln(JSContext *cx, uintN argc, jsval *argv) { - PlaylistParserScript *self = (PlaylistParserScript *)JS_GetPrivate(cx, obj); + PlaylistParserScript *self = (PlaylistParserScript *)JS_GetPrivate(cx, JS_THIS_OBJECT(cx, argv)); String line; @@ -69,7 +69,7 @@ JSString *jsline = JS_NewStringCopyZ(cx, line.c_str()); - *rval = STRING_TO_JSVAL(jsline); + JS_SET_RVAL(cx, argv, STRING_TO_JSVAL(jsline)); return JS_TRUE; } @@ -93,8 +93,8 @@ String scriptPath = ConfigManager::getInstance()->getOption(CFG_IMPORT_SCRIPTING_PLAYLIST_SCRIPT); load(scriptPath); - root = JS_NewScriptObject(cx, script); - JS_AddNamedRoot(cx, &root, "PlaylistScript"); + root = JS_NewObject(cx, NULL, script, NULL); + JS_AddNamedObjectRoot(cx, &root, "PlaylistScript"); } catch (Exception ex) { @@ -245,7 +245,7 @@ #endif if (root) - JS_RemoveRoot(cx, &root); + JS_RemoveObjectRoot(cx, &root); #ifdef JS_THREADSAFE JS_EndRequest(cx); diff -ur mediatomb-0.12.1.orig/src/scripting/script.cc mediatomb-0.12.1/src/scripting/script.cc --- mediatomb-0.12.1.orig/src/scripting/script.cc 2010-03-25 10:58:05.000000000 -0400 +++ mediatomb-0.12.1/src/scripting/script.cc 2011-11-16 22:28:06.000000000 -0500 @@ -87,7 +87,7 @@ str = JS_ValueToString(cx, val); if (! str) return nil; - return JS_GetStringBytes(str); + return JS_EncodeString(cx, str); } int Script::getBoolProperty(JSObject *obj, String name) @@ -427,14 +427,14 @@ try { common_script = _load(common_scr_path); - common_root = JS_NewScriptObject(cx, common_script); - JS_AddNamedRoot(cx, &common_root, "common-script"); + common_root = JS_NewObject(cx, NULL, common_script, NULL); + JS_AddNamedObjectRoot(cx, &common_root, "common-script"); _execute(common_script); } catch (Exception e) { if (common_root) - JS_RemoveRoot(cx, &common_root); + JS_RemoveObjectRoot(cx, &common_root); log_js("Unable to load %s: %s\n", common_scr_path.c_str(), e.getMessage().c_str()); @@ -460,7 +460,7 @@ JS_BeginRequest(cx); #endif if (common_root) - JS_RemoveRoot(cx, &common_root); + JS_RemoveObjectRoot(cx, &common_root); /* * scripts are unrooted and will be cleaned up by GC @@ -504,11 +504,11 @@ static JSClass global_class = { "global", /* name */ - JSCLASS_HAS_PRIVATE, /* flags */ + JSCLASS_HAS_PRIVATE | JSCLASS_GLOBAL_FLAGS,/* flags */ JS_PropertyStub, /* add property */ JS_PropertyStub, /* del property */ JS_PropertyStub, /* get property */ - JS_PropertyStub, /* set property */ + JS_StrictPropertyStub, /* set property */ JS_EnumerateStandardClasses, /* enumerate */ JS_ResolveStub, /* resolve */ JS_ConvertStub, /* convert */ @@ -517,7 +517,7 @@ }; /* create the global object here */ - glob = JS_NewObject(cx, &global_class, NULL, NULL); + glob = JS_NewCompartmentAndGlobalObject(cx, &global_class, NULL); if (! glob) throw _Exception(_("Scripting: could not initialize glboal class")); @@ -539,12 +539,12 @@ throw _Exception(_("Scripting: JS_DefineFunctions failed")); } -JSScript *Script::_load(zmm::String scriptPath) +JSObject *Script::_load(zmm::String scriptPath) { if (glob == NULL) initGlobalObject(); - JSScript *scr; + JSObject *scr; String scriptText = read_text_file(scriptPath); @@ -571,14 +571,11 @@ void Script::load(zmm::String scriptPath) { - if (script) - JS_DestroyScript(cx, script); - script = _load((scriptPath)); } -void Script::_execute(JSScript *scr) +void Script::_execute(JSObject *scr) { jsval ret_val; @@ -662,7 +659,7 @@ JSObject *js_meta = getObjectProperty(js, _("meta")); if (js_meta) { - JS_AddNamedRoot(cx, &js_meta, "meta"); + JS_AddNamedObjectRoot(cx, &js_meta, "meta"); /// \todo: only metadata enumerated in MT_KEYS is taken for (int i = 0; i < M_MAX; i++) { @@ -687,7 +684,7 @@ } } } - JS_RemoveRoot(cx, &js_meta); + JS_RemoveObjectRoot(cx, &js_meta); } // stuff that has not been exported to js diff -ur mediatomb-0.12.1.orig/src/scripting/script.h mediatomb-0.12.1/src/scripting/script.h --- mediatomb-0.12.1.orig/src/scripting/script.h 2010-03-25 10:58:05.000000000 -0400 +++ mediatomb-0.12.1/src/scripting/script.h 2011-11-16 22:28:06.000000000 -0500 @@ -66,8 +66,8 @@ JSRuntime *rt; JSContext *cx; JSObject *glob; - JSScript *script; - JSScript *common_script; + JSObject *script; + JSObject *common_script; public: Script(zmm::Ref runtime); @@ -115,8 +115,8 @@ JSObject *common_root; void initGlobalObject(); - JSScript *_load(zmm::String scriptPath); - void _execute(JSScript *scr); + JSObject *_load(zmm::String scriptPath); + void _execute(JSObject *scr); zmm::Ref _p2i; zmm::Ref _j2i; zmm::Ref _f2i;