+static gboolean
+g_emblem_to_tokens (GIcon *icon,
+ GPtrArray *tokens,
+ gint *out_version)
+{
+ GEmblem *emblem = G_EMBLEM (icon);
+ char *s;
+
+ /* GEmblem are encoded as
+ *
+ * <origin> <icon>
+ */
+
+ g_return_val_if_fail (out_version != NULL, FALSE);
+
+ *out_version = 0;
+
+ s = g_icon_to_string (emblem->icon);
+ if (s == NULL)
+ return FALSE;
+
+ g_ptr_array_add (tokens, s);
+
+ s = g_strdup_printf ("%d", emblem->origin);
+ g_ptr_array_add (tokens, s);
+
+ return TRUE;
+}
+
+static GIcon *
+g_emblem_from_tokens (gchar **tokens,
+ gint num_tokens,
+ gint version,
+ GError **error)
+{
+ GEmblem *emblem;
+ GIcon *icon;
+ GEmblemOrigin origin;
+
+ emblem = NULL;
+
+ if (version != 0)
+ {
+ g_set_error (error,
+ G_IO_ERROR,
+ G_IO_ERROR_INVALID_ARGUMENT,
+ _("Can't handle version %d of GEmblem encoding"),
+ version);
+ return NULL;
+ }
+
+ if (num_tokens != 2)
+ {
+ g_set_error (error,
+ G_IO_ERROR,
+ G_IO_ERROR_INVALID_ARGUMENT,
+ _("Malformed number of tokens (%d) in GEmblem encoding"),
+ num_tokens);
+ return NULL;
+ }
+
+ icon = g_icon_new_for_string (tokens[0], error);
+
+ if (icon == NULL)
+ return NULL;
+
+ origin = atoi (tokens[1]);
+
+ emblem = g_emblem_new_with_origin (icon, origin);
+ g_object_unref (icon);
+
+ return G_ICON (emblem);
+}
+
+static GVariant *
+g_emblem_serialize (GIcon *icon)
+{
+ GEmblem *emblem = G_EMBLEM (icon);
+ GVariant *icon_data;
+ GEnumValue *origin;
+ GVariant *result;
+
+ icon_data = g_icon_serialize (emblem->icon);
+ if (!icon_data)
+ return NULL;
+
+ origin = g_enum_get_value (g_type_class_peek (G_TYPE_EMBLEM_ORIGIN), emblem->origin);
+ result = g_variant_new_parsed ("('emblem', <(%v, {'origin': <%s>})>)",
+ icon_data, origin ? origin->value_nick : "unknown");
+ g_variant_unref (icon_data);
+
+ return result;
+}
+