/** * grl_related_keys_set: * @relkeys: set of related keys to modify * @key: (type GrlKeyID): key to change or add * @value: the new value * * Sets the value associated with @key into @relkeys. Old value is freed and * the new one is set. * * Also, checks that @value is compliant with @key specification, modifying it * accordingly. For instance, if @key requires a number between 0 and 10, but * value is outside this range, it will be adapted accordingly. * * Since: 0.1.10 **/ void grl_related_keys_set (GrlRelatedKeys *relkeys, GrlKeyID key, const GValue *value) { GValue *copy = NULL; GrlRegistry *registry; g_return_if_fail (GRL_IS_RELATED_KEYS (relkeys)); g_return_if_fail (key); if (!value) { return; } /* Dup value */ if (G_VALUE_TYPE (value) != GRL_METADATA_KEY_GET_TYPE (key)) { GRL_WARNING ("value has type %s, but expected %s", g_type_name (G_VALUE_TYPE (value)), g_type_name (GRL_METADATA_KEY_GET_TYPE (key))); return; } copy = g_new0 (GValue, 1); g_value_init (copy, G_VALUE_TYPE (value)); g_value_copy (value, copy); registry = grl_registry_get_default (); if (!grl_registry_metadata_key_validate (registry, key, copy)) { GRL_WARNING ("'%s' value invalid, adjusting", GRL_METADATA_KEY_GET_NAME (key)); } g_hash_table_insert (relkeys->priv->data, GRLKEYID_TO_POINTER (key), copy); }
static void gen_prop_insert_string (GString *gstr, tracker_grl_sparql_t *assoc, GrlData *data) { gchar *tmp; switch (GRL_METADATA_KEY_GET_TYPE (assoc->grl_key)) { case G_TYPE_STRING: tmp = g_strescape (grl_data_get_string (data, assoc->grl_key), NULL); g_string_append_printf (gstr, "%s \"%s\"", assoc->sparql_key_attr, tmp); g_free (tmp); break; case G_TYPE_INT: g_string_append_printf (gstr, "%s %i", assoc->sparql_key_attr, grl_data_get_int (data, assoc->grl_key)); break; case G_TYPE_FLOAT: g_string_append_printf (gstr, "%s %f", assoc->sparql_key_attr, grl_data_get_float (data, assoc->grl_key)); break; default: break; } }
/** * grl_related_keys_new_valist: * @key: first key * @args: #va_list of value, followed by (key,value) pairs to insert * * Creates a new #GrlRelatedKeys containing pairs of (key, value). Finish the * list with %NULL. * * In case of a binary-type key, the expected element is (key, value, size). * * value type will be extracted from key information. * * Returns: a new #GrlRelatedKeys * * Since: 0.1.10 **/ GrlRelatedKeys * grl_related_keys_new_valist (GrlKeyID key, va_list args) { GType key_type; GrlKeyID next_key; GrlRelatedKeys *prop; gpointer next_value; prop = grl_related_keys_new (); next_key = key; while (next_key) { key_type = GRL_METADATA_KEY_GET_TYPE (next_key); if (key_type == G_TYPE_STRING) { grl_related_keys_set_string (prop, next_key, va_arg (args, gchar *)); } else if (key_type == G_TYPE_INT) { grl_related_keys_set_int (prop, next_key, va_arg (args, gint)); } else if (key_type == G_TYPE_FLOAT) { grl_related_keys_set_float (prop, next_key, va_arg (args, double)); } else if (key_type == G_TYPE_BYTE_ARRAY) { next_value = va_arg (args, gpointer); grl_related_keys_set_binary (prop, next_key, next_value, va_arg (args, gsize)); } next_key = va_arg (args, GrlKeyID); } return prop; }
static void gen_prop_insert_string (GString *gstr, tracker_grl_sparql_t *assoc, GrlData *data) { gchar *tmp; GType type = GRL_METADATA_KEY_GET_TYPE (assoc->grl_key); switch (type) { case G_TYPE_STRING: tmp = g_strescape (grl_data_get_string (data, assoc->grl_key), NULL); g_string_append_printf (gstr, "%s \"%s\"", assoc->sparql_key_attr, tmp); g_free (tmp); break; case G_TYPE_INT: g_string_append_printf (gstr, "%s %i", assoc->sparql_key_attr, grl_data_get_int (data, assoc->grl_key)); break; case G_TYPE_FLOAT: g_string_append_printf (gstr, "%s %f", assoc->sparql_key_attr, grl_data_get_float (data, assoc->grl_key)); break; case G_TYPE_BOOLEAN: /* Special case for favourite tag, see comment in * grl_tracker_tracker_get_insert_string for more details. */ if (assoc->grl_key == GRL_METADATA_KEY_FAVOURITE) { g_string_append_printf (gstr, "%s nao:predefined-tag-favorite", assoc->sparql_key_attr); } break; default: if (type == G_TYPE_DATE_TIME) { tmp = g_date_time_format (grl_data_get_boxed (data, assoc->grl_key), "%FT%T%:z"); g_string_append_printf (gstr, "%s '%s'", assoc->sparql_key_attr, tmp); g_free (tmp); } break; } }
/** * grl_operation_options_set_key_filters: * @options: a #GrlOperationOptions instance * @...: pairs of #GrlKeyID, value * * Set filter as "k1 == v1 AND k2 == v2 AND ..." * * <example> * Elements from album "Frozen" with a bitrate of 256kbs. * <programlisting> * grl_operation_options_set_key_filters (my_options, * GRL_METADATA_KEY_ALBUM, "Frozen", * GRL_METADATA_KEY_BITRATE, 256, * NULL); * </programlisting> * </example> * * Returns: %TRUE on success * * Since: 0.2.0 **/ gboolean grl_operation_options_set_key_filters (GrlOperationOptions *options, ...) { GType key_type; GValue value = { 0 }; GrlKeyID next_key; gboolean skip; gboolean success = TRUE; va_list args; va_start (args, options); next_key = va_arg (args, GrlKeyID); while (next_key) { key_type = GRL_METADATA_KEY_GET_TYPE (next_key); g_value_init (&value, key_type); skip = FALSE; if (key_type == G_TYPE_STRING) { g_value_set_string (&value, va_arg (args, gchar *)); } else if (key_type == G_TYPE_INT) {