diff --git a/honoka-plugins/jsfilter/src/jsfilter.cpp b/honoka-plugins/jsfilter/src/jsfilter.cpp index c9ec71d..e578add 100644 --- a/honoka-plugins/jsfilter/src/jsfilter.cpp +++ b/honoka-plugins/jsfilter/src/jsfilter.cpp @@ -40,6 +40,7 @@ HonokaPluginRegister(JSFilter); HonokaPluginSetup(JSFilter); +HonokaPluginReload(JSFilter); HonokaSetupCorePage *JSFilter::setup() { @@ -69,19 +70,38 @@ return page; }; +JSFilter *JSFilter::jsself = 0; +bool JSFilter::resetf = false; + +bool JSFilter::reload(ConfigPointer cfg) +{ + resetf = true; + return true; +} JSFilter::JSFilter(ConfigPointer cfg) : TextFilter(cfg) { + init(cfg); +} + +void JSFilter::init(ConfigPointer cfg) { + //if (jsself != 0) delete jsproc; file = cfg->read(String(HONOKA_CONFIG_JSFILTER_FILE), String(HONOKA_DEFAULT_JSFILTER_FILE)); func = cfg->read(String(HONOKA_CONFIG_JSFILTER_FUNC), String(HONOKA_DEFAULT_JSFILTER_FUNC)); - jsproc = new JSProc(file); + if (jsself == 0) { + jsproc = new JSProc(file); + jsself = this; + } else { + jsproc->init(file); + } } JSFilter::~JSFilter() { + delete jsproc; } @@ -98,6 +118,10 @@ const WideString JSFilter::filter(const WideString &text) { + if (resetf == true) { + init(config); + resetf = false; + } String script; String sanit; //String func = "misakura(\"%%\").toString();"; diff --git a/honoka-plugins/jsfilter/src/jsfilter.h b/honoka-plugins/jsfilter/src/jsfilter.h index c6bff4b..55440cd 100644 --- a/honoka-plugins/jsfilter/src/jsfilter.h +++ b/honoka-plugins/jsfilter/src/jsfilter.h @@ -56,12 +56,16 @@ virtual String getPropertyName(); virtual const WideString filter(const WideString &text); static HonokaSetupCorePage *setup(); - + static bool reload(ConfigPointer cfg); +protected: + void init(ConfigPointer cfg); protected: JSProc *jsproc; String file; String func; + static JSFilter *jsself; + static bool resetf; }; } #endif diff --git a/honoka-plugins/jsfilter/src/jsproc.cpp b/honoka-plugins/jsfilter/src/jsproc.cpp index c204f9f..2b8d222 100644 --- a/honoka-plugins/jsfilter/src/jsproc.cpp +++ b/honoka-plugins/jsfilter/src/jsproc.cpp @@ -54,7 +54,9 @@ jscs.resolve = (JSResolveOp)resolve; jscs.convert = JS_ConvertStub; jscs.finalize = JS_FinalizeStub; - + jsrt = NULL; + jsct = NULL; + jsobj = NULL; }; static JSBool resolve(JSContext *context,JSObject *obj,jsval id,uintN flags,JSObject **objp) { return JS_TRUE; @@ -69,10 +71,14 @@ JSProc::JSProc(const string &filename) { jspriv = new JSProcPriv(); - jspriv->jsrt = NULL; - jspriv->jsct = NULL; - jspriv->jsobj = NULL; - + init(filename); +} + + +void JSProc::init(const string &filename) +{ + if (jspriv->jsct) JS_DestroyContext(jspriv->jsct); + if (jspriv->jsrt) JS_DestroyRuntime(jspriv->jsrt); int fd = open(filename.c_str(),O_RDONLY); if (fd == -1) return; off_t mmapsize = lseek(fd,0,SEEK_END); @@ -84,6 +90,8 @@ if (!jspriv->jsct) { JS_DestroyRuntime(jspriv->jsrt); jspriv->jsrt = NULL; + munmap(mmapptr,mmapsize); + close(fd); return; } jspriv->jsobj = JS_NewObject(jspriv->jsct,&jspriv->jscs, NULL, NULL); @@ -92,6 +100,8 @@ jspriv->jsct = NULL; JS_DestroyRuntime(jspriv->jsrt); jspriv->jsrt = NULL; + munmap(mmapptr,mmapsize); + close(fd); return; } if (!JS_InitStandardClasses(jspriv->jsct,jspriv->jsobj)) { @@ -99,6 +109,8 @@ jspriv->jsct = NULL; JS_DestroyRuntime(jspriv->jsrt); jspriv->jsrt = NULL; + munmap(mmapptr,mmapsize); + close(fd); return; } @@ -110,6 +122,8 @@ jspriv->jsct = NULL; JS_DestroyRuntime(jspriv->jsrt); jspriv->jsrt = NULL; + munmap(mmapptr,mmapsize); + close(fd); return; } munmap(mmapptr,mmapsize); @@ -117,7 +131,6 @@ return; } - JSProc::~JSProc() { if (jspriv->jsct) JS_DestroyContext(jspriv->jsct); diff --git a/honoka-plugins/jsfilter/src/jsproc.h b/honoka-plugins/jsfilter/src/jsproc.h index aeb3a8f..ba4938f 100644 --- a/honoka-plugins/jsfilter/src/jsproc.h +++ b/honoka-plugins/jsfilter/src/jsproc.h @@ -36,6 +36,7 @@ ~JSProc(); string eval(const string &script); + void init(const string &filename); private: JSProcPriv *jspriv;