static void parse_metadata(E_Music_Control_Module_Context *ctxt, Eina_Value *array) { unsigned i; E_FREE_FUNC(ctxt->meta_title, eina_stringshare_del); E_FREE_FUNC(ctxt->meta_album, eina_stringshare_del); E_FREE_FUNC(ctxt->meta_artist, eina_stringshare_del); E_FREE_FUNC(ctxt->meta_cover, eina_stringshare_del); // DBG("Metadata: %s", eina_value_to_string(array)); for (i = 0; i < eina_value_array_count(array); i++) { const char *key, *str_val; Eina_Value st, subst; Efreet_Uri *uri; eina_value_array_value_get(array, i, &st); eina_value_struct_get(&st, "arg0", &key); if (!strcmp(key, "xesam:title")) { eina_value_struct_value_get(&st, "arg1", &subst); eina_value_struct_get(&subst, "arg0", &str_val); ctxt->meta_title = eina_stringshare_add(str_val); eina_value_flush(&subst); } else if (!strcmp(key, "xesam:album")) { eina_value_struct_value_get(&st, "arg1", &subst); eina_value_struct_get(&subst, "arg0", &str_val); ctxt->meta_album = eina_stringshare_add(str_val); eina_value_flush(&subst); } else if (!strcmp(key, "xesam:artist")) { Eina_Value arr; eina_value_struct_value_get(&st, "arg1", &subst); eina_value_struct_value_get(&subst, "arg0", &arr); eina_value_array_get(&arr, 0, &str_val); ctxt->meta_artist = eina_stringshare_add(str_val); eina_value_flush(&arr); eina_value_flush(&subst); } else if (!strcmp(key, "mpris:artUrl")) { eina_value_struct_value_get(&st, "arg1", &subst); eina_value_struct_get(&subst, "arg0", &str_val); uri = efreet_uri_decode(str_val); if (uri && !strncmp(uri->protocol, "file", 4)) ctxt->meta_cover = eina_stringshare_add(uri->path); E_FREE_FUNC(uri, efreet_uri_free); eina_value_flush(&subst); } eina_value_flush(&st); } }
static Eina_Bool _array_append(const char *type, const Eina_Value *value_array, Eldbus_Message_Iter *iter) { Eldbus_Message_Iter *array; Eina_Bool ok = eldbus_message_iter_arguments_append(iter, type, &array); EINA_SAFETY_ON_FALSE_RETURN_VAL(ok, EINA_FALSE); DBG("array of type %c", type[1]); switch (type[1]) { case '{': case '(': { unsigned i = strlen(type+2);//remove 'a()' of len a(sv) char *entry_sig = malloc(sizeof(char) * i); memcpy(entry_sig, type+2, i); entry_sig[i-1] = 0; for (i = 0; i < eina_value_array_count(value_array); i++) { Eina_Value st; Eldbus_Message_Iter *entry; eina_value_array_value_get(value_array, i, &st); eldbus_message_iter_arguments_append(array, type+1, &entry); _message_iter_from_eina_value_struct(entry_sig, entry, &st); eldbus_message_iter_container_close(array, entry); eina_value_flush(&st); } free(entry_sig); break; } case 'a': { unsigned i; for (i = 0; i < eina_value_array_count(value_array); i++) { Eina_Value inner_array; Eldbus_Message_Iter *sub_array; eina_value_array_value_get(value_array, i, &inner_array); eldbus_message_iter_arguments_append(array, type+1, &sub_array); _array_append(type+1, &inner_array, sub_array); eldbus_message_iter_container_close(array, sub_array); eina_value_flush(&inner_array); } break; } case 'v': { ERR("Variant not supported."); return EINA_FALSE; } case 'i': case 'h'://fd { int32_t z; unsigned i; for (i = 0; i < eina_value_array_count(value_array); i++) { eina_value_array_get(value_array, i, &z); eldbus_message_iter_basic_append(array, type[1], z); } break; } case 's': case 'o'://object path case 'g'://signature { const char *txt; unsigned i; for (i = 0; i < eina_value_array_count(value_array); i++) { eina_value_array_get(value_array, i, &txt); eldbus_message_iter_basic_append(array, type[1], txt); } break; } case 'b'://boolean case 'y'://byte { unsigned char z; unsigned i; for (i = 0; i < eina_value_array_count(value_array); i++) { eina_value_array_get(value_array, i, &z); eldbus_message_iter_basic_append(array, type[1], z); } break; } case 'n'://int16 { int16_t z; unsigned i; for (i = 0; i < eina_value_array_count(value_array); i++) { eina_value_array_get(value_array, i, &z); eldbus_message_iter_basic_append(array, type[1], z); } break; } case 'q'://uint16 { uint16_t z; unsigned i; for (i = 0; i < eina_value_array_count(value_array); i++) { eina_value_array_get(value_array, i, &z); eldbus_message_iter_basic_append(array, type[1], z); } break; } case 'u'://uint32 { uint32_t z; unsigned i; for (i = 0; i < eina_value_array_count(value_array); i++) { eina_value_array_get(value_array, i, &z); eldbus_message_iter_basic_append(array, type[1], z); } break; } case 'x'://int64 { int64_t z; unsigned i; for (i = 0; i < eina_value_array_count(value_array); i++) { eina_value_array_get(value_array, i, &z); eldbus_message_iter_basic_append(array, type[1], z); } break; } case 't'://uint64 { uint64_t z; unsigned i; for (i = 0; i < eina_value_array_count(value_array); i++) { eina_value_array_get(value_array, i, &z); eldbus_message_iter_basic_append(array, type[1], z); } break; } case 'd'://double { double z; unsigned i; for (i = 0; i < eina_value_array_count(value_array); i++) { eina_value_array_get(value_array, i, &z); eldbus_message_iter_basic_append(array, type[1], z); } break; } default: { ERR("Unknown type %c", type[1]); return EINA_FALSE; } } eldbus_message_iter_container_close(iter, array); return EINA_TRUE; }