Beispiel #1
0
/* Import play list from a json object */
void plist_import_from_json( plist_t *pl, JsonArray *js_plist )
{
	int num_songs = json_array_get_length(js_plist);
	for ( int i = 0; i < num_songs; ++i )
	{
		JsonNode *js_song_node = json_array_get_element(js_plist, i);
		if (!js_song_node)
			continue;
		if (!JSON_NODE_HOLDS_OBJECT(js_song_node))
			continue;
		JsonObject *js_song = json_node_get_object(js_song_node);

		const char *name = js_get_string(js_song, "name", NULL);
		if (!name)
			continue;

		song_metadata_t metadata = SONG_METADATA_EMPTY;
		const char *title = js_get_string(js_song, "title", NULL);
		if (title)
			metadata.m_title = title;

		metadata.m_len = js_get_int(js_song, "length", 0);
		metadata.m_start_time = js_get_int(js_song, "start_time", -1);
		metadata.m_end_time = js_get_int(js_song, "end_time", -1);

		song_info_t *si = NULL;
		JsonObject *js_si = js_get_obj(js_song, "song_info");
		if (js_si)
		{
			si = si_new();
			si_set_artist	(si, js_get_string(js_si, "artist", ""));
			si_set_name		(si, js_get_string(js_si, "name", ""));
			si_set_album	(si, js_get_string(js_si, "album", ""));
			si_set_year		(si, js_get_string(js_si, "year", ""));
			si_set_genre	(si, js_get_string(js_si, "genre", ""));
			si_set_comments	(si, js_get_string(js_si, "comments", ""));
			si_set_track	(si, js_get_string(js_si, "track", ""));
		}

		bool_t is_static_info = js_get_int(js_song, "static_info", 0);
		if (is_static_info)
			metadata.m_song_info = si;

		song_t *s = fu_is_prefixed(name) ?
			song_new_from_uri(name, &metadata) :
			song_new_from_file(name, &metadata);
		if (s)
		{
			if (!is_static_info && si)
				song_set_info(s, si);
			plist_add_song(pl, s, -1);
		}
	}
}
Beispiel #2
0
void js_debug_argument(JSContext *cx, jsval vp) {
  func(" arg mem address %p", &vp);
  int tag = JSVAL_TAG(vp);

  func(" type tag is %i: %s",tag,
     (tag==0x0)?"object":
     (tag==0x1)?"integer":
     (tag==0x2)?"double":
     (tag==0x4)?"string":
     (tag==0x6)?"boolean":
     "unknown");

  switch(tag) {
  case 0x0:
  {
    JSObject *obj = JSVAL_TO_OBJECT(vp);
    jsval val;
    if( JS_IsArrayObject(cx, obj) ) {
	jsuint len; JS_GetArrayLength(cx, obj, &len);
	func(" object is an array of %u elements", len);
	for(jsuint c = 0; c<len; c++) {
	  func(" dumping element %u:",c);
	  JS_GetElement(cx, obj, c, &val);
	  if(val == JSVAL_VOID)
	    func(" content is VOID");
	  else
	    js_debug_argument(cx, val);
	}
    } else {
	func(" object type is unknown to us (not an array?)");
    }
  }
  break;
  case 0x1:
  {
    jsint num = js_get_int(vp);
    func("  Sint[ %i ] Uint[ %u ] Double [ %.2f ]", num, num, num);
  }
  break;

  case 0x2:
  {
    jsdouble num = js_get_double(vp);
    func("  Double [ %.2f ]", num);
  }
  break;

  case 0x4:
  {
    char *cap;
    if(JSVAL_IS_STRING(vp)) {
	cap = JS_GetStringBytes( JS_ValueToString(cx, vp) );
	func("  string is \"%s\"",cap);
    } else {
	JS_ReportError(cx,"%s: argument value is not a string",__FUNCTION__);
	::error("%s: argument value is not a string",__FUNCTION__);
    }
  }
  break;

  case 0x6:
  {
    bool b = false;
    b = JSVAL_TO_BOOLEAN(vp);
    func("  boolean is %i",b);
  }
  break;

  default:
    func(" arg %u is unhandled, probably double");
    jsint num = js_get_double(vp);
    func("  Double [ %.4f ] - Sint[ %i ] - Uint[ %u ]",
	 num, num, num);
  }
}