diff options
author | Victor Toso <me@victortoso.com> | 2015-10-10 13:20:46 +0200 |
---|---|---|
committer | Victor Toso <me@victortoso.com> | 2015-10-12 09:14:39 +0200 |
commit | 9018103c23118e1df6692bc5e259a44eefebef12 (patch) | |
tree | fddea78ef09846cf2a6a9e4a9eb43ed69852dc80 | |
parent | 0530a37bfb60af4647514250f374f2efc4b53589 (diff) |
lua-factory: allow multiple values for each key
All GrlMedia is GrlData and all its keys could have multiple values by
default from grl_data_add_* API. Till now, Lua sources were only getting
the first value of the key.
This patch fixes that by providing multiple values as an array.
https://bugzilla.gnome.org/show_bug.cgi?id=755447
-rw-r--r-- | src/lua-factory/grl-lua-library.c | 94 |
1 files changed, 68 insertions, 26 deletions
diff --git a/src/lua-factory/grl-lua-library.c b/src/lua-factory/grl-lua-library.c index 014bb9e..66ba2ae 100644 --- a/src/lua-factory/grl-lua-library.c +++ b/src/lua-factory/grl-lua-library.c @@ -909,40 +909,82 @@ push_grl_media_key (lua_State *L, GrlRegistry *registry; GType type; const gchar *key_name; + guint i, num_values; + gboolean is_array = FALSE; registry = grl_registry_get_default (); type = grl_registry_lookup_metadata_key_type (registry, key_id); key_name = grl_registry_lookup_metadata_key_name (registry, key_id); - switch (type) { - case G_TYPE_INT: - lua_pushinteger (L, grl_data_get_int (GRL_DATA (media), key_id)); - break; - case G_TYPE_FLOAT: - lua_pushnumber (L, grl_data_get_float (GRL_DATA (media), key_id)); - break; - case G_TYPE_STRING: - lua_pushstring (L, grl_data_get_string (GRL_DATA (media), key_id)); - break; - case G_TYPE_INT64: - lua_pushinteger (L, grl_data_get_int64 (GRL_DATA (media), key_id)); - break; - case G_TYPE_BOOLEAN: - lua_pushboolean (L, grl_data_get_boolean (GRL_DATA (media), key_id)); - break; - default: - if (type == G_TYPE_DATE_TIME) { - GDateTime *date = grl_data_get_boxed (GRL_DATA (media), key_id); - gchar *date_str = g_date_time_format (date, "%F %T"); - lua_pushstring (L, date_str); - g_free(date_str); - } else { - GRL_DEBUG ("Key %s has unhandled G_TYPE. Lua source will miss this data", - key_name); - return FALSE; + num_values = grl_data_length (GRL_DATA (media), key_id); + if (num_values == 0) { + GRL_DEBUG ("Key %s has no data", key_name); + return FALSE; + } else if (num_values > 1) { + is_array = TRUE; + lua_createtable (L, num_values, 0); + } + + for (i = 0; i < num_values; i++) { + GrlRelatedKeys *relkeys; + const GValue *val; + + relkeys = grl_data_get_related_keys (GRL_DATA (media), key_id, i); + if (!relkeys) { + GRL_DEBUG ("Key %s failed to retrieve data at index %d due NULL GrlRelatedKeys", + key_name, i); + continue; + } + + val = grl_related_keys_get (relkeys, key_id); + if (!val) { + GRL_DEBUG ("Key %s failed to retrieve data at index %d due NULL GValue", + key_name, i); + continue; } + + if (is_array) + lua_pushinteger (L, i + 1); + + switch (type) { + case G_TYPE_INT: + lua_pushinteger (L, g_value_get_int (val)); + break; + case G_TYPE_FLOAT: + lua_pushnumber (L, g_value_get_float (val)); + break; + case G_TYPE_STRING: + lua_pushstring (L, g_value_get_string (val)); + break; + case G_TYPE_INT64: + lua_pushinteger (L, g_value_get_int64 (val)); + break; + case G_TYPE_BOOLEAN: + lua_pushboolean (L, g_value_get_boolean (val)); + break; + default: + if (type == G_TYPE_DATE_TIME) { + GDateTime *date = g_value_get_boxed (val); + gchar *date_str = g_date_time_format (date, "%F %T"); + lua_pushstring (L, date_str); + g_free(date_str); + } else { + GRL_DEBUG ("Key %s has unhandled G_TYPE. Lua source will miss this data", + key_name); + goto fail; + } + } + + if (is_array) + lua_settable (L, -3); } return TRUE; + +fail: + if (is_array) + lua_pop (L, 1); + + return FALSE; } /** |