summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean Felder <jfelder@gnome.org>2020-05-13 02:57:44 +0200
committerVictor Toso <me@victortoso.com>2020-07-22 17:10:40 +0000
commit8de41d7c6bf1d105ca5eefba5537a6c784467cdf (patch)
tree19bb89c54a18c9ca06bc55e90b3b8b62accf107e
parentcd875d01696bd1be8b3c0429fdf15040f312fb94 (diff)
downloadgrilo-8de41d7c6bf1d105ca5eefba5537a6c784467cdf.tar.gz
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.
-rw-r--r--doc/grilo/grilo-sections.txt1
-rw-r--r--src/data/grl-data.c10
-rw-r--r--src/data/grl-related-keys.c52
-rw-r--r--src/data/grl-related-keys.h4
-rw-r--r--src/grl-registry-priv.h6
-rw-r--r--src/grl-registry.c10
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;
@@ -677,6 +677,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
* @key: (type GrlKeyID): key to remove
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)) {