summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/data/grl-data.c69
-rw-r--r--src/data/grl-data.h2
-rw-r--r--src/grl-registry-priv.h4
-rw-r--r--src/grl-registry.c68
4 files changed, 142 insertions, 1 deletions
diff --git a/src/data/grl-data.c b/src/data/grl-data.c
index 3b20f44..68e5c4a 100644
--- a/src/data/grl-data.c
+++ b/src/data/grl-data.c
@@ -36,7 +36,7 @@
#include "grl-data.h"
#include "grl-log.h"
-#include <grl-registry.h>
+#include "grl-registry-priv.h"
#define GRL_LOG_DOMAIN_DEFAULT data_log_domain
GRL_LOG_DOMAIN(data_log_domain);
@@ -612,6 +612,73 @@ 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
+ * @key_name: name of the key to change or add
+ * @value: the new value
+ *
+ * Sets the first value associated with @key_name in @data. 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 first @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.6
+ **/
+gboolean
+grl_data_set_for_id (GrlData *data, const gchar *key_name, const GValue *value)
+{
+ GrlRegistry *registry;
+ GrlKeyID key_id;
+
+ 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);
+
+ if (key_id != GRL_METADATA_KEY_INVALID) {
+ grl_data_set (data, key_id, value);
+ return TRUE;
+ }
+
+ GRL_DEBUG ("%s is not a registered metadata-key", key_name);
+ key_id = grl_registry_register_metadata_key_for_type(registry, key_name, G_VALUE_TYPE (value));
+ if (key_id != GRL_METADATA_KEY_INVALID)
+ grl_data_set (data, key_id, value);
+
+ return (key_id != GRL_METADATA_KEY_INVALID);
+}
+
+
+/**
* grl_data_remove:
* @data: data to change
* @key: (type GrlKeyID): key to remove
diff --git a/src/data/grl-data.h b/src/data/grl-data.h
index ae95d99..7a400b6 100644
--- a/src/data/grl-data.h
+++ b/src/data/grl-data.h
@@ -115,6 +115,8 @@ void grl_data_set_boxed (GrlData *data, GrlKeyID key, gconstpointer boxed);
void grl_data_set_int64 (GrlData *data, GrlKeyID key, gint64 intvalue);
+gboolean grl_data_set_for_id (GrlData *data, const gchar *key_name, const GValue *value);
+
const GValue *grl_data_get (GrlData *data, GrlKeyID key);
const gchar *grl_data_get_string (GrlData *data, GrlKeyID key);
diff --git a/src/grl-registry-priv.h b/src/grl-registry-priv.h
index b86a37c..e8eeef2 100644
--- a/src/grl-registry-priv.h
+++ b/src/grl-registry-priv.h
@@ -37,4 +37,8 @@ GrlKeyID grl_registry_register_metadata_key_system (GrlRegistry *registry,
void grl_registry_shutdown (GrlRegistry *registry);
+GrlKeyID grl_registry_register_metadata_key_for_type (GrlRegistry *registry,
+ const gchar *key_name,
+ GType type);
+
#endif /* _GRL_REGISTRY_PRIV_H_ */
diff --git a/src/grl-registry.c b/src/grl-registry.c
index 6a1106f..a6189b7 100644
--- a/src/grl-registry.c
+++ b/src/grl-registry.c
@@ -565,6 +565,74 @@ grl_registry_register_metadata_key_full (GrlRegistry *registry,
return registered_key;
}
+G_GNUC_INTERNAL GrlKeyID
+grl_registry_register_metadata_key_for_type (GrlRegistry *registry,
+ const gchar *key_name,
+ GType type)
+{
+ GParamSpec *spec;
+
+ switch (type) {
+ case G_TYPE_INT:
+ spec = g_param_spec_int (key_name,
+ key_name,
+ key_name,
+ 0, G_MAXINT,
+ 0,
+ G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
+ break;
+
+ case G_TYPE_INT64:
+ spec = g_param_spec_int64 (key_name,
+ key_name,
+ key_name,
+ -1, G_MAXINT64,
+ -1,
+ G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
+ break;
+
+ case G_TYPE_STRING:
+ spec = g_param_spec_string (key_name,
+ key_name,
+ key_name,
+ NULL,
+ G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
+ break;
+
+ case G_TYPE_BOOLEAN:
+ spec = g_param_spec_boolean (key_name,
+ key_name,
+ key_name,
+ FALSE,
+ G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
+ break;
+
+ case G_TYPE_FLOAT:
+ spec = g_param_spec_float (key_name,
+ key_name,
+ key_name,
+ 0, G_MAXFLOAT,
+ 0,
+ G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
+ break;
+
+ default:
+ if (type == G_TYPE_DATE_TIME) {
+ spec = g_param_spec_boxed (key_name,
+ key_name,
+ key_name,
+ G_TYPE_DATE_TIME,
+ G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
+ } else {
+ GRL_WARNING ("'%s' is being ignored as G_TYPE '%s' is not being handled",
+ key_name, G_VALUE_TYPE_NAME (type));
+ return GRL_METADATA_KEY_INVALID;
+ }
+ }
+
+ return grl_registry_register_metadata_key (registry, spec, GRL_METADATA_KEY_INVALID, NULL);
+}
+
static void
key_id_handler_init (struct KeyIDHandler *handler)
{