diff options
author | Jean Felder <jfelder@gnome.org> | 2020-05-13 03:45:09 +0200 |
---|---|---|
committer | Victor Toso <me@victortoso.com> | 2020-07-22 17:10:40 +0000 |
commit | cd875d01696bd1be8b3c0429fdf15040f312fb94 (patch) | |
tree | b00aeb93b90b3b3bc81813270b7ffdaf0fd1fb9c | |
parent | ccca23820c89cd0b3910313de19cf781c08ac2ba (diff) | |
download | grilo-cd875d01696bd1be8b3c0429fdf15040f312fb94.tar.gz |
core: Factor out register or lookup key logic from GrlData
grl_data_set_for_id() and grl_data_new_for_id() share some code to
register or lookup a key by its name.
This shared code is put in a new private function named
grl_registry_register_or_lookup_metadata_key().
grl_registry_register_or_lookup_metadata_key() will be used in the
commit by the new grl_related_keys_set_for_id() function.
-rw-r--r-- | src/data/grl-data.c | 78 | ||||
-rw-r--r-- | src/grl-registry-priv.h | 4 | ||||
-rw-r--r-- | src/grl-registry.c | 56 |
3 files changed, 69 insertions, 69 deletions
diff --git a/src/data/grl-data.c b/src/data/grl-data.c index 7a3d995..d2b5d94 100644 --- a/src/data/grl-data.c +++ b/src/data/grl-data.c @@ -611,27 +611,6 @@ grl_data_get_int64 (GrlData *data, GrlKeyID key) } } -/* - * Returns whether the string is a canonical one. - */ -static gboolean -is_canonical (const gchar *key) -{ - if (key == NULL) { - return FALSE; - } - - for (; *key != '\0'; key++) { - if (*key != '-' && - (*key < '0' || *key > '9') && - (*key < 'A' || *key > 'Z') && - (*key < 'a' || *key > 'z')) - return FALSE; - } - - return TRUE; -} - /** * grl_data_set_for_id: * @data: data to change @@ -657,36 +636,15 @@ grl_data_set_for_id (GrlData *data, const gchar *key_name, const GValue *value) { GrlRegistry *registry; GrlKeyID key_id; - GType value_type; - - if (value == NULL) - return TRUE; - - 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); - value_type = G_VALUE_TYPE (value); - - if (key_id != GRL_METADATA_KEY_INVALID) { - GType key_type = grl_registry_lookup_metadata_key_type (registry, key_id); - if (!g_value_type_transformable (value_type, key_type)) { - GRL_WARNING ("Value type %s can't be set to existing metadata-key of type %s", - g_type_name (value_type), - g_type_name (key_type)); - return FALSE; - } - grl_data_set (data, key_id, value); - return TRUE; + key_id = grl_registry_register_or_lookup_metadata_key (registry, key_name, value); + if (key_id == GRL_METADATA_KEY_INVALID) { + return FALSE; } - GRL_DEBUG ("%s is not a registered metadata-key", key_name); - key_id = grl_registry_register_metadata_key_for_type(registry, key_name, value_type); - if (key_id != GRL_METADATA_KEY_INVALID) - grl_data_set (data, key_id, value); - - return (key_id != GRL_METADATA_KEY_INVALID); + grl_data_set (data, key_id, value); + return TRUE; } @@ -716,32 +674,14 @@ grl_data_add_for_id (GrlData *data, const gchar *key_name, const GValue *value) GrlKeyID key_id; GType value_type; - if (value == NULL) - return TRUE; - - 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); - value_type = G_VALUE_TYPE (value); - + key_id = grl_registry_register_or_lookup_metadata_key (registry, key_name, value); 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, value_type); - if (key_id == GRL_METADATA_KEY_INVALID) { - return FALSE; - } - } else { - GType key_type = grl_registry_lookup_metadata_key_type (registry, key_id); - if (!g_value_type_transformable (value_type, key_type)) { - GRL_WARNING ("Value type %s can't be set to existing metadata-key of type %s", - g_type_name (value_type), - g_type_name (key_type)); - return FALSE; - } + return FALSE; } + value_type = G_VALUE_TYPE (value); + switch (value_type) { case G_TYPE_INT: grl_data_add_int (data, key_id, g_value_get_int (value)); diff --git a/src/grl-registry-priv.h b/src/grl-registry-priv.h index e8eeef2..73ca469 100644 --- a/src/grl-registry-priv.h +++ b/src/grl-registry-priv.h @@ -41,4 +41,8 @@ GrlKeyID grl_registry_register_metadata_key_for_type (GrlRegistry *registry, const gchar *key_name, GType type); +GrlKeyID grl_registry_register_or_lookup_metadata_key (GrlRegistry *registry, + const gchar *key_name, + const GValue *value); + #endif /* _GRL_REGISTRY_PRIV_H_ */ diff --git a/src/grl-registry.c b/src/grl-registry.c index 2aedfa5..4f4e0af 100644 --- a/src/grl-registry.c +++ b/src/grl-registry.c @@ -671,6 +671,62 @@ grl_registry_register_metadata_key_for_type (GrlRegistry *registry, return grl_registry_register_metadata_key (registry, spec, GRL_METADATA_KEY_INVALID, NULL); } +/* + * Returns whether the string is a canonical one. + */ +static gboolean +is_canonical (const gchar *key) +{ + if (key == NULL) { + return FALSE; + } + + for (; *key != '\0'; key++) { + if (*key != '-' && + (*key < '0' || *key > '9') && + (*key < 'A' || *key > 'Z') && + (*key < 'a' || *key > 'z')) + return FALSE; + } + + return TRUE; +} + +G_GNUC_INTERNAL GrlKeyID +grl_registry_register_or_lookup_metadata_key (GrlRegistry *registry, + const gchar *key_name, + const GValue *value) +{ + GrlKeyID key; + GType value_type; + + g_return_val_if_fail (GRL_IS_REGISTRY (registry), GRL_METADATA_KEY_INVALID); + + if (value == NULL) + return GRL_METADATA_KEY_INVALID; + + key_name = g_intern_string (key_name); + g_return_val_if_fail (is_canonical (key_name), GRL_METADATA_KEY_INVALID); + + key = grl_registry_lookup_metadata_key (registry, key_name); + value_type = G_VALUE_TYPE (value); + + 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); + } else { + GType key_type = grl_registry_lookup_metadata_key_type (registry, key); + if (!g_value_type_transformable (value_type, key_type)) { + GRL_WARNING ("Value type %s can't be set to existing metadata-key of type %s", + g_type_name (value_type), + g_type_name (key_type)); + return GRL_METADATA_KEY_INVALID; + } + } + + return key; +} + static void key_id_handler_init (struct KeyIDHandler *handler) { |