summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author1PunMan <saurabhsingh412@gmail.com>2018-06-10 00:09:43 +0530
committerVictor Toso <me@victortoso.com>2018-07-25 14:11:43 +0200
commit2b8b32e947ee3317edd2c74decbcfe2e67d81e02 (patch)
tree365f8476867678f83282e95bc7111e55768fa238
parentb30608abacd37a4e39d5c5465efc82c566756631 (diff)
downloadgrilo-2b8b32e947ee3317edd2c74decbcfe2e67d81e02.tar.gz
core: Add grl_data_add_for_id()
grl_data_add_for_id() allow unregistered keys to be registered and set multiple values to it. https://gitlab.gnome.org/GNOME/grilo/issues/1
-rw-r--r--src/data/grl-data.c64
-rw-r--r--src/data/grl-data.h2
2 files changed, 66 insertions, 0 deletions
diff --git a/src/data/grl-data.c b/src/data/grl-data.c
index 68e5c4a..8720349 100644
--- a/src/data/grl-data.c
+++ b/src/data/grl-data.c
@@ -679,6 +679,70 @@ grl_data_set_for_id (GrlData *data, const gchar *key_name, const GValue *value)
/**
+ * grl_data_add_for_id:
+ * @data: data to change
+ * @key_name: name of the key to change or add
+ * @value: the new value
+ *
+ * Appends the value associated with @key_name to @data. This @key_name is used to create
+ * a new #GParamSpec instance, which is further used to create and register a key using
+ * grl_registry_register_metadata_key().
+ *
+ * A property key_name consists of segments consisting of ASCII letters and
+ * digits, separated by either the '-' or '_' character. The first
+ * character of a property key_name must be a letter. Key_names which violate these
+ * rules lead to undefined behaviour.
+ *
+ * Returns: TRUE if @value was added to @key_name, FALSE otherwise.
+ *
+ * Since: 0.3.6
+ **/
+gboolean
+grl_data_add_for_id (GrlData *data, const gchar *key_name, const GValue *value)
+{
+ GrlRegistry *registry;
+ GrlKeyID key_id;
+
+ key_name = g_intern_string (key_name);
+ g_return_val_if_fail (is_canonical (key_name), FALSE);
+
+ registry = grl_registry_get_default ();
+ key_id = grl_registry_lookup_metadata_key (registry, key_name);
+
+ if (key_id == GRL_METADATA_KEY_INVALID) {
+ GRL_DEBUG ("%s is not a registered metadata-key", key_name);
+ key_id = grl_registry_register_metadata_key_for_type (registry, key_name, G_VALUE_TYPE (value));
+ if (key_id == GRL_METADATA_KEY_INVALID) {
+ return FALSE;
+ }
+ }
+
+ switch (G_VALUE_TYPE (value)) {
+ case G_TYPE_INT:
+ grl_data_add_int (data, key_id, g_value_get_int (value));
+ break;
+
+ case G_TYPE_INT64:
+ grl_data_add_int64 (data, key_id, g_value_get_int64 (value));
+ break;
+
+ case G_TYPE_FLOAT:
+ grl_data_add_float (data, key_id, g_value_get_float (value));
+ break;
+
+ case G_TYPE_STRING:
+ grl_data_add_string (data, key_id, g_value_get_string (value));
+ break;
+
+ default:
+ GRL_WARNING ("'%s' is being ignored as G_TYPE is not being handled", key_name);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+/**
* grl_data_remove:
* @data: data to change
* @key: (type GrlKeyID): key to remove
diff --git a/src/data/grl-data.h b/src/data/grl-data.h
index 7a400b6..c2cc370 100644
--- a/src/data/grl-data.h
+++ b/src/data/grl-data.h
@@ -153,6 +153,8 @@ void grl_data_add_boxed (GrlData *data, GrlKeyID key, gconstpointer boxed);
void grl_data_add_int64 (GrlData *data, GrlKeyID key, gint64 intvalue);
+gboolean grl_data_add_for_id (GrlData *data, const gchar *key_name, const GValue *value);
+
guint grl_data_length (GrlData *data, GrlKeyID key);
GrlRelatedKeys *grl_data_get_related_keys (GrlData *data, GrlKeyID key, guint index);