diff options
author | Jean Felder <jfelder@gnome.org> | 2020-05-13 02:57:44 +0200 |
---|---|---|
committer | Victor Toso <me@victortoso.com> | 2020-07-22 17:10:40 +0000 |
commit | 8de41d7c6bf1d105ca5eefba5537a6c784467cdf (patch) | |
tree | 19bb89c54a18c9ca06bc55e90b3b8b62accf107e | |
parent | cd875d01696bd1be8b3c0429fdf15040f312fb94 (diff) | |
download | grilo-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.txt | 1 | ||||
-rw-r--r-- | src/data/grl-data.c | 10 | ||||
-rw-r--r-- | src/data/grl-related-keys.c | 52 | ||||
-rw-r--r-- | src/data/grl-related-keys.h | 4 | ||||
-rw-r--r-- | src/grl-registry-priv.h | 6 | ||||
-rw-r--r-- | 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; @@ -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)) { |