Add api to serialize GtkFileFilter to a variant

This will be used to send filters over D-Bus in future commits.

https://bugzilla.gnome.org/show_bug.cgi?id=768499
This commit is contained in:
Matthias Clasen 2016-06-11 00:45:27 -04:00
parent 01d0bac83e
commit 35181e793d
3 changed files with 110 additions and 0 deletions

View File

@ -1528,6 +1528,11 @@ gtk_file_filter_add_pixbuf_formats
gtk_file_filter_add_custom
gtk_file_filter_get_needed
gtk_file_filter_filter
<SUBSECTION Serialization>
gtk_file_filter_new_from_gvariant
gtk_file_filter_to_gvariant
<SUBSECTION Standard>
GTK_FILE_FILTER
GTK_IS_FILE_FILTER

View File

@ -718,3 +718,103 @@ gtk_file_filter_filter (GtkFileFilter *filter,
return FALSE;
}
/**
* gtk_file_filter_to_gvariant:
* @settings: a #GtkFileFilter
*
* Serialize a file filter to an a{sv} variant.
*
* Returns: (transfer none): a new, floating, #GVariant
*
* Since: 3.22
*/
GVariant *
gtk_file_filter_to_gvariant (GtkFileFilter *filter)
{
GVariantBuilder builder;
GSList *l;
g_variant_builder_init (&builder, G_VARIANT_TYPE ("a(us)"));
for (l = filter->rules; l; l = l->next)
{
FilterRule *rule = l->data;
switch (rule->type)
{
case FILTER_RULE_PATTERN:
g_variant_builder_add (&builder, "(us)", 0, rule->u.pattern);
break;
case FILTER_RULE_MIME_TYPE:
g_variant_builder_add (&builder, "(us)", 1, rule->u.mime_type);
break;
case FILTER_RULE_PIXBUF_FORMATS:
{
GSList *f;
for (f = rule->u.pixbuf_formats; f; f = f->next)
{
GdkPixbufFormat *fmt = f->data;
gchar **mime_types;
int i;
mime_types = gdk_pixbuf_format_get_mime_types (fmt);
for (i = 0; mime_types[i]; i++)
g_variant_builder_add (&builder, "(us)", 1, mime_types[i]);
g_strfreev (mime_types);
}
}
break;
case FILTER_RULE_CUSTOM:
default:
break;
}
}
return g_variant_new ("(s@a(us))", filter->name, g_variant_builder_end (&builder));
}
/**
* gtk_file_filter_new_from_gvariant:
* @variant: an a{sv} #GVariant
*
* Deserialize a file filter from an a{sv} variant in
* the format produced by gtk_file_filter_to_gvariant().
*
* Returns: (transfer full): a new #GtkFileFilter object
*
* Since: 3.22
*/
GtkFileFilter *
gtk_file_filter_new_from_gvariant (GVariant *variant)
{
GtkFileFilter *filter;
GVariantIter *iter;
const char *name;
int type;
char *tmp;
filter = gtk_file_filter_new ();
g_variant_get (variant, "(&sa(us))", &name, &iter);
gtk_file_filter_set_name (filter, name);
while (g_variant_iter_next (iter, "(u&s)", &type, &tmp))
{
switch (type)
{
case 0:
gtk_file_filter_add_pattern (filter, tmp);
break;
case 1:
gtk_file_filter_add_mime_type (filter, tmp);
break;
default:
break;
}
}
g_variant_iter_free (iter);
return filter;
}

View File

@ -122,6 +122,11 @@ GDK_AVAILABLE_IN_ALL
gboolean gtk_file_filter_filter (GtkFileFilter *filter,
const GtkFileFilterInfo *filter_info);
GDK_AVAILABLE_IN_3_22
GVariant *gtk_file_filter_to_gvariant (GtkFileFilter *filter);
GDK_AVAILABLE_IN_3_22
GtkFileFilter *gtk_file_filter_new_from_gvariant (GVariant *variant);
G_END_DECLS
#endif /* __GTK_FILE_FILTER_H__ */