📄 jsbind.c
字号:
url_priv_t *up; dllist *ptr; JSObject *robj; if(argc != 1 || !JSVAL_IS_INT(argv[0])) { JS_ReportError(cx, "PavukUrl.get_parent: %s\n", gettext("bad parent index")); return JS_FALSE; } n = JSVAL_TO_INT(argv[0]); up = JS_GetPrivate(cx, obj); ptr = dllist_nth(up->urlp->parent_url, n); if(ptr) { rurl = (url *) ptr->data; robj = pjs_url_to_jsobj(cx, rurl, NULL); *rv = OBJECT_TO_JSVAL(robj); } else *rv = JSVAL_NULL; return JS_TRUE;}static JSBool pjs_url_check_cond(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rv){ url_priv_t *up; char *name; JSString *s; int r, i; cond_info_t condp; condp.level = 0; condp.urlnr = 0; condp.size = 0; condp.time = 0L; condp.mimet = NULL; condp.params = NULL; up = JS_GetPrivate(cx, obj); if(up->condp) { condp.level = up->condp->level; condp.urlnr = up->condp->urlnr; condp.size = up->condp->size; condp.time = up->condp->time; condp.mimet = up->condp->mimet; condp.params = up->condp->params; } if(argc < 1) { JS_ReportError(cx, "PavukUrl.check_cond: %s\n", gettext("not enough parameters")); return JS_FALSE; } s = JS_ValueToString(cx, argv[0]); name = JS_GetStringBytes(s); for(i = 1; i < argc; i++) { char *p; s = JS_ValueToString(cx, argv[i]); p = JS_GetStringBytes(s); if(p) condp.params = dllist_append(condp.params, p); } r = url_append_one_condition(name, up->urlp, &condp); dllist_free_all(condp.params); if(r < 0) { JS_ReportError(cx, "pjs: PavukUrl.check_cond: %s - \"%s\"", gettext("unknown limiting condition"), name); return JS_FALSE; } *rv = r ? JSVAL_TRUE : JSVAL_FALSE; return JS_TRUE;}static JSObject *pjs_url_class_init(JSContext *cx, JSObject *obj){ JSObject *prot; prot = JS_InitClass(cx, obj, NULL, &urlClass, pjs_url_new, 0, urlProperties, urlMethods, NULL, NULL); return prot;}/* PavukFnrules class implementation */static JSBool pjs_fnrules_get_macro(JSContext *, JSObject *, uintN, jsval *, jsval *);static JSBool pjs_fnrules_get_sub(JSContext *, JSObject *, uintN, jsval *, jsval *);static JSBool pjs_fnrules_get_property(JSContext *, JSObject *, jsval, jsval *);static JSClass fnrulesClass = { "PavukFnrules", JSCLASS_HAS_PRIVATE, JS_PropertyStub, JS_PropertyStub, pjs_fnrules_get_property, JS_PropertyStub, JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub};static JSFunctionSpec fnrulesMethods[] = { {"get_macro", pjs_fnrules_get_macro, 1, JSPROP_ENUMERATE}, {"get_sub", pjs_fnrules_get_sub, 1, JSPROP_ENUMERATE}, {NULL, NULL, 0, 0}};enum _fnrules_prop{ PJSFNRULES_URL, PJSFNRULES_PATTERN, PJSFNRULES_PATTERN_TYPE, PJSFNRULES_NULL};static JSPropertySpec fnrulesProperties[] = { {"url", PJSFNRULES_URL, JSPROP_ENUMERATE | JSPROP_READONLY}, {"pattern", PJSFNRULES_PATTERN, JSPROP_ENUMERATE | JSPROP_READONLY}, {"pattern_type", PJSFNRULES_PATTERN_TYPE, JSPROP_ENUMERATE | JSPROP_READONLY}, {NULL, 0, 0},};static JSObject *pjs_fnrules_to_jsobj(JSContext *cx, struct lfname_lsp_interp *interp){ JSObject *obj; obj = JS_NewObject(cx, &fnrulesClass, NULL, NULL); JS_SetPrivate(cx, obj, interp); return obj;}/* constructor */static JSBool pjs_fnrules_new(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rv){ JS_ReportError(cx, gettext("PavukFnrules constructor call prohibited from script\n")); return JS_TRUE;}static JSBool pjs_fnrules_get_property(JSContext *cx, JSObject *obj, jsval id, jsval *val){ if(JSVAL_IS_INT(id)) { struct lfname_lsp_interp *interp; JSObject *uobj; interp = JS_GetPrivate(cx, obj); switch (JSVAL_TO_INT(id)) { case PJSFNRULES_URL: uobj = pjs_url_to_jsobj(cx, interp->urlp, NULL); *val = OBJECT_TO_JSVAL(uobj); break; case PJSFNRULES_PATTERN: SET_STR(interp->orig->matchstr); break; case PJSFNRULES_PATTERN_TYPE: *val = INT_TO_JSVAL(interp->orig->type); break; } } return JS_TRUE;}static JSBool pjs_fnrules_get_macro(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *val){ struct lfname_lsp_interp *interp; const char *v; JSString *s; if(argc != 1 || !(s = JS_ValueToString(cx, argv[0]))) { JS_ReportError(cx, "PavukFnrules.get_macro: %s\n", gettext("bad parameters")); return JS_FALSE; } interp = JS_GetPrivate(cx, obj); v = JS_GetStringBytes(s); if(v && v[0] == '%' && lfname_check_macro(v[1]) && !v[2]) v = lfname_interp_get_macro(interp, v[1]); SET_STR(v); return JS_TRUE;}static JSBool pjs_fnrules_get_sub(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *val){ struct lfname_lsp_interp *interp; char *v; int32 n; if(argc != 1 || !JSVAL_IS_INT(argv[0])) { JS_ReportError(cx, "PavukFnrules.get_sub: %s\n", gettext("bad parameters")); return JS_FALSE; } interp = JS_GetPrivate(cx, obj); JS_ValueToInt32(cx, argv[0], &n); v = lfname_re_sub(interp->orig, interp->urlstr, n); SET_STR(v); return JS_TRUE;}static JSObject *pjs_fnrules_class_init(JSContext *cx, JSObject *obj){ JSObject *prot; prot = JS_InitClass(cx, obj, NULL, &fnrulesClass, pjs_fnrules_new, 0, fnrulesProperties, fnrulesMethods, NULL, NULL); return prot;}static int pjs_func_exist(JSContext *cx, JSObject *obj, char *name){ jsval rv; if(!JS_GetProperty(cx, obj, name, &rv) || rv == JSVAL_VOID) return FALSE; else return TRUE;}int pjs_init(void){ LOCK_MOZJS; if(!rt) { rt = JS_Init(1000000L); cx = JS_NewContext(rt, STACK_CHUNK_SIZE); JS_SetErrorReporter(cx, pjs_error); go = JS_NewObject(cx, &globalClass, NULL, NULL); JS_InitStandardClasses(cx, go); JS_DefineFunctions(cx, go, globalMethods); pjs_url_class_init(cx, go); pjs_fnrules_class_init(cx, go); pjs_load_script(priv_cfg.js_script_file); pjs_have_pavuk_url_cond_check = pjs_func_exist(cx, go, "pavuk_url_cond_check"); } UNLOCK_MOZJS; return 0;}int pjs_destroy(void){ LOCK_MOZJS; if(rt) { if(script) { JS_RemoveRoot(cx, &scriptobj); JS_DestroyScript(cx, script); } JS_GC(cx); JS_DestroyContext(cx); JS_Finish(rt); cx = NULL; rt = NULL; go = NULL; script = NULL; scriptobj = NULL; pjs_have_pavuk_url_cond_check = FALSE; } UNLOCK_MOZJS; return 0;}int pjs_load_script(char *name){ jsval rv; JS_ClearPendingException(cx); if(script) { JS_RemoveRoot(cx, &scriptobj); JS_DestroyScript(cx, script); script = NULL; scriptobj = NULL; } if(name) { script = JS_CompileFile(cx, go, name); if(!script) return -1; scriptobj = JS_NewScriptObject(cx, script); JS_AddNamedRoot(cx, &scriptobj, "pjs_script"); JS_ExecuteScript(cx, go, script, &rv); } return 0;}int pjs_load_script_string(char *str){ jsval rv; LOCK_MOZJS; JS_ClearPendingException(cx); if(script) { JS_RemoveRoot(cx, &scriptobj); JS_DestroyScript(cx, script); script = NULL; scriptobj = NULL; } script = JS_CompileScript(cx, go, str, strlen(str), "intbuffer", 0); if(!script) { UNLOCK_MOZJS; return -1; } scriptobj = JS_NewScriptObject(cx, script); JS_AddNamedRoot(cx, &scriptobj, "pjs_script"); JS_ExecuteScript(cx, go, script, &rv); UNLOCK_MOZJS; return 0;}int pjs_execute(char *scr){ jsval rval; int rv; LOCK_MOZJS; rv = JS_EvaluateScript(cx, go, scr, strlen(scr), "pjs", 0, &rval); UNLOCK_MOZJS; return rv;}int pjs_run_cond_check_func(url *urlp, cond_info_t *condp){ jsval param[2]; jsval rv; JSObject *ourl; int ret; if(!pjs_have_pavuk_url_cond_check || !script) return -1; LOCK_MOZJS; ourl = pjs_url_to_jsobj(cx, urlp, condp); param[0] = OBJECT_TO_JSVAL(ourl); param[1] = INT_TO_JSVAL(condp->level); rv = JSVAL_FALSE; if(!JS_CallFunctionName(cx, go, "pavuk_url_cond_check", 2, param, &rv)) ret = -1; else { if(JSVAL_IS_BOOLEAN(rv)) ret = (rv == JSVAL_TRUE); else ret = -1; } JS_GC(cx); UNLOCK_MOZJS; return ret;}char *pjs_run_fnrules_func(char *name, struct lfname_lsp_interp *interp){ char *ret = NULL; JSObject *rl; jsval param[1]; JSString *s; jsval rv; LOCK_MOZJS; if(pjs_func_exist(cx, go, name)) { rl = pjs_fnrules_to_jsobj(cx, interp); param[0] = OBJECT_TO_JSVAL(rl); rv = JSVAL_FALSE; if(JS_CallFunctionName(cx, go, name, 1, param, &rv)) { s = JS_ValueToString(cx, rv); if(s) ret = tl_strdup(JS_GetStringBytes(s)); } JS_GC(cx); } else { xprintf(1, gettext("pjs: There is no \"%s\" JavaScript function!\n"), name); } UNLOCK_MOZJS; return ret;}#endif /* HAVE_MOZJS */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -