summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean Felder <jfelder@gnome.org>2020-05-13 03:45:09 +0200
committerVictor Toso <me@victortoso.com>2020-07-22 17:10:40 +0000
commitcd875d01696bd1be8b3c0429fdf15040f312fb94 (patch)
treeb00aeb93b90b3b3bc81813270b7ffdaf0fd1fb9c
parentccca23820c89cd0b3910313de19cf781c08ac2ba (diff)
downloadgrilo-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.c78
-rw-r--r--src/grl-registry-priv.h4
-rw-r--r--src/grl-registry.c56
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)
{