static int file_open_dir(prop_t *page, const char *url) { prop_t *model; int type; char parent[URL_MAX]; int r; fa_handle_t *ref; ref = fa_reference(url); type = fa_probe_dir(NULL, url); if(type == CONTENT_DVD) { r = backend_open_video(page, url); } else { model = prop_create(page, "model"); prop_set_string(prop_create(model, "type"), "directory"); /* Find a meaningful page title (last component of URL) */ set_title_from_url(prop_create(model, "metadata"), url); // Set parent if(!fa_parent(parent, sizeof(parent), url)) prop_set_string(prop_create(page, "parent"), parent); fa_scanner(url, model, NULL); r = 0; } fa_unreference(ref); return r; }
const char *showtime_dataroot(void) { if(!initialized) { hts_mutex_lock(&mtx); snprintf(buf, sizeof(buf), "zip://%s/"ZIPBUNDLE ".zip", showtime_path); fa_reference(buf); hts_mutex_unlock(&mtx); initialized = 1; } return buf; }
static void file_open_dir(prop_t *page, const char *url, time_t mtime) { fa_handle_t *ref = fa_reference(url); metadata_t *md = fa_probe_dir(url); switch(md->md_contenttype) { case CONTENT_DVD: backend_open_video(page, url, 0); break; case CONTENT_DIR: case CONTENT_ARCHIVE: file_open_browse(page, url, mtime); break; default: nav_open_errorf(page, _("Can't handle content type %d"), md->md_contenttype); break; } metadata_destroy(md); fa_unreference(ref); }
int js_plugin_load(const char *id, const char *url, char *errbuf, size_t errlen) { char *sbuf; size_t size; JSContext *cx; js_plugin_t *jsp; JSObject *pobj, *gobj; JSScript *s; char path[PATH_MAX]; jsval val; fa_handle_t *ref; ref = fa_reference(url); if((sbuf = fa_load(url, &size, NULL, errbuf, errlen, NULL)) == NULL) { fa_unreference(ref); return -1; } cx = js_newctx(err_reporter); JS_BeginRequest(cx); /* Remove any plugin with same URL */ LIST_FOREACH(jsp, &js_plugins, jsp_link) if(!strcmp(jsp->jsp_id, id)) break; if(jsp != NULL) js_plugin_unload0(cx, jsp); jsp = calloc(1, sizeof(js_plugin_t)); jsp->jsp_url = strdup(url); jsp->jsp_id = strdup(id); jsp->jsp_ref = ref; LIST_INSERT_HEAD(&js_plugins, jsp, jsp_link); gobj = JS_NewObject(cx, &global_class, NULL, NULL); JS_InitStandardClasses(cx, gobj); JS_DefineProperty(cx, gobj, "showtime", OBJECT_TO_JSVAL(showtimeobj), NULL, NULL, JSPROP_READONLY | JSPROP_PERMANENT); /* Plugin object */ pobj = JS_NewObject(cx, &plugin_class, NULL, gobj); JS_AddNamedRoot(cx, &pobj, "plugin"); JS_SetPrivate(cx, pobj, jsp); JS_DefineFunctions(cx, pobj, plugin_functions); val = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, url)); JS_SetProperty(cx, pobj, "url", &val); if(!fa_parent(path, sizeof(path), url)) { val = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, path)); JS_SetProperty(cx, pobj, "path", &val); } JS_DefineProperty(cx, pobj, "URIRouting", BOOLEAN_TO_JSVAL(1), NULL, jsp_setEnableURIRoute, JSPROP_PERMANENT); jsp->jsp_enable_uri_routing = 1; JS_DefineProperty(cx, pobj, "search", BOOLEAN_TO_JSVAL(1), NULL, jsp_setEnableSearch, JSPROP_PERMANENT); jsp->jsp_enable_search = 1; jsp->jsp_protect_object = 1; s = JS_CompileScript(cx, pobj, sbuf, size, url, 1); free(sbuf); if(s != NULL) { JSObject *sobj = JS_NewScriptObject(cx, s); jsval result; JS_AddNamedRoot(cx, &sobj, "script"); JS_ExecuteScript(cx, pobj, s, &result); JS_RemoveRoot(cx, &sobj); } JS_RemoveRoot(cx, &pobj); JS_EndRequest(cx); JS_GC(cx); JS_DestroyContext(cx); return 0; }