/* 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); } } }
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); } }