JSBool js_json_encode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { JSObject *o; htsbuf_queue_t out; char *r; size_t len; if(!JS_ConvertArguments(cx, argc, argv, "o", &o)) return JS_FALSE; if(o == NULL) { JS_ReportError(cx, "Not an object"); return JS_FALSE; } htsbuf_queue_init(&out, 0); json_encode_from_object(cx, o, &out); len = out.hq_size; r = malloc(out.hq_size+1); r[len] = 0; htsbuf_read(&out, r, len); *rval = STRING_TO_JSVAL(JS_NewString(cx, r, len)); return JS_TRUE; }
static void js_json_emit_jsval(JSContext *cx, jsval value, htsbuf_queue_t *out) { char buf[100]; if(JSVAL_IS_BOOLEAN(value)) { if(JSVAL_TO_BOOLEAN(value)) htsbuf_append(out, "true", 4); else htsbuf_append(out, "false", 5); } else if(JSVAL_IS_INT(value)) { snprintf(buf, sizeof(buf), "%d", JSVAL_TO_INT(value)); htsbuf_append(out, buf, strlen(buf)); } else if(JSVAL_IS_DOUBLE(value)) { double dbl; if(JS_ValueToNumber(cx, value, &dbl) && !my_double2str(buf, sizeof(buf), dbl)) htsbuf_append(out, buf, strlen(buf)); else htsbuf_append(out, "null", 4); } else if(JSVAL_IS_NULL(value)) { htsbuf_append(out, "null", 4); } else if(JSVAL_IS_STRING(value)) { js_json_emit_str(cx, value, out); } else if(JSVAL_IS_OBJECT(value)) { JSObject *obj = JSVAL_TO_OBJECT(value); JSClass *c = JS_GetClass(cx, obj); if(!strcmp(c->name, "XML")) // Treat some classes special js_json_emit_str(cx, value, out); else { if(json_encode_from_object(cx, obj, out)) htsbuf_append(out, "null", 4); } } }
JSBool js_cache_put(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { char stash[256]; const char *key,*lstash; char *value; uint32_t len, maxage; JSObject *o; htsbuf_queue_t out; js_plugin_t *jsp = JS_GetPrivate(cx, obj); if (!JS_ConvertArguments(cx, argc, argv, "ssou", &lstash, &key, &o, &maxage)) return JS_FALSE; if (o == NULL) { JS_ReportError(cx, "Not an object"); return JS_FALSE; } // json encode object htsbuf_queue_init(&out, 0); if (json_encode_from_object(cx, o, &out) != 0) { JS_ReportError(cx, "Not an JSON object"); return JS_FALSE; } len = out.hq_size; value = JS_malloc(cx,len + 1); value[len] = '\0'; htsbuf_read(&out, value, len); // put json encoded object onto cache snprintf(stash, sizeof(stash), "plugin/%s/%s", jsp->jsp_id, lstash); blobcache_put(key, stash, value, len, maxage, NULL, 0); return JS_TRUE; }