Esempio n. 1
0
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;
}
Esempio n. 2
0
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);
    }
  }
}
Esempio n. 3
0
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;
}