[grilo/wip/jfelder/related-keys-add-for-id: 2/2] core: Add grl_related_keys_set_for_id()



commit 90e0ae596609f9a573ecc1ce166015a5c555693e
Author: Jean Felder <jfelder gnome org>
Date:   Wed May 13 02:57:44 2020 +0200

    core: Add grl_related_keys_set_for_id()
    
    It is the counterpart of grl_data_set_for_id() for GrlRelatedKeys (see
    commit b30608abacd37a4e39d5c5465efc82c566756631).
    
    grl_related_keys_set_for_id() allows keys that aren't registered,
    to be registered and set it's value. It simply sets the value
    for registered keys.
    
    grl_registry_register_metadata_key_for_type() and
    grl_registry_register_or_lookup_metadata_key() need to be updated to
    add a new bind_key parameter. For related keys, bind_key parameters is
    used to create a relation between the key and bind_key.

 doc/grilo/grilo-sections.txt |  1 +
 src/data/grl-data.c          | 10 +++++++--
 src/data/grl-related-keys.c  | 52 +++++++++++++++++++++++++++++++++++++++++++-
 src/data/grl-related-keys.h  |  4 ++++
 src/grl-registry-priv.h      |  6 +++--
 src/grl-registry.c           | 10 +++++----
 6 files changed, 74 insertions(+), 9 deletions(-)
---
diff --git a/doc/grilo/grilo-sections.txt b/doc/grilo/grilo-sections.txt
index 6d8230b..59e12d9 100644
--- a/doc/grilo/grilo-sections.txt
+++ b/doc/grilo/grilo-sections.txt
@@ -264,6 +264,7 @@ grl_related_keys_set_binary
 grl_related_keys_set_boolean
 grl_related_keys_set_boxed
 grl_related_keys_set_float
+grl_related_keys_set_for_id
 grl_related_keys_set_int
 grl_related_keys_set_int64
 grl_related_keys_set_string
diff --git a/src/data/grl-data.c b/src/data/grl-data.c
index d2b5d94..455121d 100644
--- a/src/data/grl-data.c
+++ b/src/data/grl-data.c
@@ -638,7 +638,10 @@ grl_data_set_for_id (GrlData *data, const gchar *key_name, const GValue *value)
   GrlKeyID key_id;
 
   registry = grl_registry_get_default ();
-  key_id = grl_registry_register_or_lookup_metadata_key (registry, key_name, value);
+  key_id = grl_registry_register_or_lookup_metadata_key (registry,
+                                                         key_name,
+                                                         value,
+                                                         GRL_METADATA_KEY_INVALID);
   if (key_id == GRL_METADATA_KEY_INVALID) {
     return FALSE;
   }
@@ -675,7 +678,10 @@ grl_data_add_for_id (GrlData *data, const gchar *key_name, const GValue *value)
   GType value_type;
 
   registry = grl_registry_get_default ();
-  key_id = grl_registry_register_or_lookup_metadata_key (registry, key_name, value);
+  key_id = grl_registry_register_or_lookup_metadata_key (registry,
+                                                         key_name,
+                                                         value,
+                                                         GRL_METADATA_KEY_INVALID);
   if (key_id == GRL_METADATA_KEY_INVALID) {
     return FALSE;
   }
diff --git a/src/data/grl-related-keys.c b/src/data/grl-related-keys.c
index f086ce3..549ba69 100644
--- a/src/data/grl-related-keys.c
+++ b/src/data/grl-related-keys.c
@@ -41,7 +41,7 @@
 
 #include "grl-related-keys.h"
 #include "grl-log.h"
-#include "grl-registry.h"
+#include "grl-registry-priv.h"
 
 struct _GrlRelatedKeysPrivate {
   GHashTable *data;
@@ -676,6 +676,56 @@ grl_related_keys_get_int64 (GrlRelatedKeys *relkeys,
   }
 }
 
+/**
+ * grl_related_keys_set_for_id:
+ * @relkeys: set of related keys to modify
+ * @key_name: name of the key to change or add
+ * @value: the new value
+ *
+ * Sets the value associated with @key_name in @relkeys. 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(). If @key_name already has a @value, old value
+ * is replaced by the new one.
+ *
+ * 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 set to @key_name, FALSE otherwise.
+ *
+ * Since: 0.3.13
+ **/
+gboolean
+grl_related_keys_set_for_id (GrlRelatedKeys *relkeys,
+                             const gchar *key_name,
+                             const GValue *value)
+{
+  GList *keys;
+  GrlKeyID bind_key, key;
+  GrlRegistry *registry;
+
+  keys = grl_related_keys_get_keys (relkeys);
+  if (keys) {
+    bind_key = GRLPOINTER_TO_KEYID (keys->data);
+    g_list_free (keys);
+  } else {
+    bind_key = GRL_METADATA_KEY_INVALID;
+  }
+
+  registry = grl_registry_get_default ();
+  key = grl_registry_register_or_lookup_metadata_key (registry,
+                                                      key_name,
+                                                      value,
+                                                      bind_key);
+  if (key == GRL_METADATA_KEY_INVALID) {
+    return FALSE;
+  }
+
+  grl_related_keys_set (relkeys, key, value);
+  return TRUE;
+}
+
 /**
  * grl_related_keys_remove:
  * @relkeys: set of related keys
diff --git a/src/data/grl-related-keys.h b/src/data/grl-related-keys.h
index c370bb6..58f3964 100644
--- a/src/data/grl-related-keys.h
+++ b/src/data/grl-related-keys.h
@@ -165,6 +165,10 @@ gboolean grl_related_keys_has_key (GrlRelatedKeys *relkeys,
 
 GList *grl_related_keys_get_keys (GrlRelatedKeys *relkeys);
 
+gboolean grl_related_keys_set_for_id (GrlRelatedKeys *relkeys,
+                                      const gchar *key_name,
+                                      const GValue *value);
+
 GrlRelatedKeys *grl_related_keys_dup (GrlRelatedKeys *relkeys);
 
 G_END_DECLS
diff --git a/src/grl-registry-priv.h b/src/grl-registry-priv.h
index 73ca469..a692f51 100644
--- a/src/grl-registry-priv.h
+++ b/src/grl-registry-priv.h
@@ -39,10 +39,12 @@ void grl_registry_shutdown (GrlRegistry *registry);
 
 GrlKeyID grl_registry_register_metadata_key_for_type (GrlRegistry *registry,
                                                       const gchar *key_name,
-                                                      GType type);
+                                                      GType type,
+                                                      GrlKeyID bind_key);
 
 GrlKeyID grl_registry_register_or_lookup_metadata_key (GrlRegistry *registry,
                                                        const gchar *key_name,
-                                                       const GValue *value);
+                                                       const GValue *value,
+                                                       GrlKeyID bind_key);
 
 #endif /* _GRL_REGISTRY_PRIV_H_ */
diff --git a/src/grl-registry.c b/src/grl-registry.c
index 4f4e0af..c202992 100644
--- a/src/grl-registry.c
+++ b/src/grl-registry.c
@@ -606,7 +606,8 @@ grl_registry_register_metadata_key_full (GrlRegistry *registry,
 G_GNUC_INTERNAL GrlKeyID
 grl_registry_register_metadata_key_for_type (GrlRegistry *registry,
                                              const gchar *key_name,
-                                             GType type)
+                                             GType type,
+                                             GrlKeyID bind_key)
 {
   GParamSpec *spec;
 
@@ -668,7 +669,7 @@ grl_registry_register_metadata_key_for_type (GrlRegistry *registry,
     }
   }
 
-  return grl_registry_register_metadata_key (registry, spec, GRL_METADATA_KEY_INVALID, NULL);
+  return grl_registry_register_metadata_key (registry, spec, bind_key, NULL);
 }
 
 /*
@@ -695,7 +696,8 @@ is_canonical (const gchar *key)
 G_GNUC_INTERNAL GrlKeyID
 grl_registry_register_or_lookup_metadata_key (GrlRegistry *registry,
                                               const gchar *key_name,
-                                              const GValue *value)
+                                              const GValue *value,
+                                              GrlKeyID bind_key)
 {
   GrlKeyID key;
   GType value_type;
@@ -713,7 +715,7 @@ grl_registry_register_or_lookup_metadata_key (GrlRegistry *registry,
 
   if (key == GRL_METADATA_KEY_INVALID) {
     GRL_DEBUG ("%s is not a registered metadata-key", key_name);
-    key = grl_registry_register_metadata_key_for_type (registry, key_name, value_type);
+    key = grl_registry_register_metadata_key_for_type (registry, key_name, value_type, bind_key);
   } else {
     GType key_type = grl_registry_lookup_metadata_key_type (registry, key);
     if (!g_value_type_transformable (value_type, key_type)) {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]