static void photos_search_provider_return_metas_from_cache (PhotosSearchProvider *self, const gchar *const *identifiers, GDBusMethodInvocation *invocation) { GApplication *app; GVariantBuilder builder; guint i; g_variant_builder_init (&builder, G_VARIANT_TYPE ("aa{sv}")); for (i = 0; identifiers[i] != NULL; i++) { PhotosFetchMeta *meta; const gchar *id = identifiers[i]; meta = (PhotosFetchMeta *) g_hash_table_lookup (self->cache, id); if (meta == NULL) continue; g_variant_builder_open (&builder, G_VARIANT_TYPE ("a{sv}")); g_variant_builder_add (&builder, "{sv}", "id", g_variant_new_string (meta->id)); g_variant_builder_add (&builder, "{sv}", "name", g_variant_new_string (meta->title)); if (meta->icon != NULL) g_variant_builder_add (&builder, "{sv}", "icon", g_icon_serialize (meta->icon)); g_variant_builder_close (&builder); } app = g_application_get_default (); g_application_release (app); shell_search_provider2_complete_get_result_metas (self->skeleton, invocation, g_variant_builder_end (&builder)); }
/*< private > * g_notification_serialize: * * Serializes @notification into an floating variant of type a{sv}. * * Returns: the serialized @notification as a floating variant. */ GVariant * g_notification_serialize (GNotification *notification) { GVariantBuilder builder; g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}")); if (notification->title) g_variant_builder_add (&builder, "{sv}", "title", g_variant_new_string (notification->title)); if (notification->body) g_variant_builder_add (&builder, "{sv}", "body", g_variant_new_string (notification->body)); if (notification->icon) { GVariant *serialized_icon; if ((serialized_icon = g_icon_serialize (notification->icon))) { g_variant_builder_add (&builder, "{sv}", "icon", serialized_icon); g_variant_unref (serialized_icon); } } g_variant_builder_add (&builder, "{sv}", "priority", g_notification_get_priority_nick (notification)); if (notification->default_action) { g_variant_builder_add (&builder, "{sv}", "default-action", g_variant_new_string (notification->default_action)); if (notification->default_action_target) g_variant_builder_add (&builder, "{sv}", "default-action-target", notification->default_action_target); } if (notification->buttons->len > 0) { GVariantBuilder actions_builder; guint i; g_variant_builder_init (&actions_builder, G_VARIANT_TYPE ("aa{sv}")); for (i = 0; i < notification->buttons->len; i++) { Button *button = g_ptr_array_index (notification->buttons, i); g_variant_builder_add (&actions_builder, "@a{sv}", g_notification_serialize_button (button)); } g_variant_builder_add (&builder, "{sv}", "buttons", g_variant_builder_end (&actions_builder)); } return g_variant_builder_end (&builder); }
static gboolean get_result_metas_cb (GcalShellSearchProvider *search_provider, GDBusMethodInvocation *invocation, gchar **results, GcalShellSearchProvider2 *skel) { GcalShellSearchProviderPrivate *priv; GDateTime *local_datetime; GVariantBuilder abuilder, builder; GVariant *icon_variant; GcalEvent *event; GdkPixbuf *gicon; gchar *uuid, *desc; gchar *start_date; gint i; priv = search_provider->priv; g_variant_builder_init (&abuilder, G_VARIANT_TYPE ("aa{sv}")); for (i = 0; i < g_strv_length (results); i++) { uuid = results[i]; event = g_hash_table_lookup (priv->events, uuid); g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}")); g_variant_builder_add (&builder, "{sv}", "id", g_variant_new_string (uuid)); g_variant_builder_add (&builder, "{sv}", "name", g_variant_new_string (gcal_event_get_summary (event))); gicon = get_circle_pixbuf_from_color (gcal_event_get_color (event), 128); icon_variant = g_icon_serialize (G_ICON (gicon)); g_variant_builder_add (&builder, "{sv}", "icon", icon_variant); g_object_unref (gicon); g_variant_unref (icon_variant); local_datetime = g_date_time_to_local (gcal_event_get_date_start (event)); /* FIXME: respect 24h time format */ start_date = g_date_time_format (local_datetime, gcal_event_get_all_day (event) ? "%x" : "%c"); if (gcal_event_get_location (event)) desc = g_strconcat (start_date, ". ", gcal_event_get_location (event), NULL); else desc = g_strdup (start_date); g_variant_builder_add (&builder, "{sv}", "description", g_variant_new_string (desc)); g_variant_builder_add_value (&abuilder, g_variant_builder_end (&builder)); } g_dbus_method_invocation_return_value (invocation, g_variant_new ("(aa{sv})", &abuilder)); return TRUE; }
static void test_serialize (void) { GError *error = NULL; GdkPixbuf *pixbuf; GdkPixbuf *pixbuf2; GVariant *data; GIcon *icon; GInputStream *stream; pixbuf = gdk_pixbuf_new_from_file (g_test_get_filename (G_TEST_DIST, "test-image.png", NULL), &error); g_assert_no_error (error); g_assert (pixbuf != NULL); /* turn it into a GVariant */ data = g_icon_serialize (G_ICON (pixbuf)); /* back to a GIcon, but this will be a GBytesIcon, not GdkPixbuf */ icon = g_icon_deserialize (data); g_assert (G_IS_BYTES_ICON (icon)); /* but since that is a GLoadableIcon, we can load it again */ stream = g_loadable_icon_load (G_LOADABLE_ICON (icon), 0, NULL, NULL, &error); g_assert_no_error (error); pixbuf2 = gdk_pixbuf_new_from_stream (stream, NULL, &error); g_assert_no_error (error); /* make sure that the pixels are the same. * our _serialize() uses png, so this should be perfect. */ { guchar *pixels_a, *pixels_b; guint len_a, len_b; pixels_a = gdk_pixbuf_get_pixels_with_length (pixbuf, &len_a); pixels_b = gdk_pixbuf_get_pixels_with_length (pixbuf2, &len_b); g_assert (len_a == len_b); g_assert (memcmp (pixels_a, pixels_b, len_a) == 0); } g_object_unref (pixbuf2); g_object_unref (pixbuf); g_object_unref (stream); g_variant_unref (data); }
static gboolean get_result_metas_cb (GcalShellSearchProvider *search_provider, GDBusMethodInvocation *invocation, gchar **results, GcalShellSearchProvider2 *skel) { GcalShellSearchProviderPrivate *priv; gint i; gchar *uuid, *desc; const gchar* location; g_autoptr(GTimeZone) tz; g_autoptr (GDateTime) datetime; g_autoptr (GDateTime) local_datetime; ECalComponentDateTime dtstart; gchar *start_date; ECalComponentText summary; GdkRGBA color; GVariantBuilder abuilder, builder; GVariant *icon_variant; GcalEventData *data; GdkPixbuf *gicon; priv = search_provider->priv; g_variant_builder_init (&abuilder, G_VARIANT_TYPE ("aa{sv}")); for (i = 0; i < g_strv_length (results); i++) { uuid = results[i]; data = g_hash_table_lookup (priv->events, uuid); g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}")); g_variant_builder_add (&builder, "{sv}", "id", g_variant_new_string (uuid)); e_cal_component_get_summary (data->event_component, &summary); g_variant_builder_add (&builder, "{sv}", "name", g_variant_new_string (summary.value)); get_color_name_from_source (data->source, &color); gicon = get_circle_pixbuf_from_color (&color, 128); icon_variant = g_icon_serialize (G_ICON (gicon)); g_variant_builder_add (&builder, "{sv}", "icon", icon_variant); g_object_unref (gicon); g_variant_unref (icon_variant); e_cal_component_get_dtstart (data->event_component, &dtstart); if (dtstart.tzid != NULL) tz = g_time_zone_new (dtstart.tzid); else if (dtstart.value->zone != NULL) tz = g_time_zone_new (icaltimezone_get_tzid ((icaltimezone*) dtstart.value->zone)); else tz = g_time_zone_new_local (); datetime = g_date_time_new (tz, dtstart.value->year, dtstart.value->month, dtstart.value->day, dtstart.value->hour, dtstart.value->minute, dtstart.value->second); local_datetime = g_date_time_to_local (datetime); /* FIXME: respect 24h time format */ start_date = g_date_time_format (local_datetime, (dtstart.value->is_date == 1) ? "%x" : "%c"); e_cal_component_free_datetime (&dtstart); e_cal_component_get_location (data->event_component, &location); if (location != NULL) desc = g_strconcat (start_date, ". ", location, NULL); else desc = g_strdup (start_date); g_variant_builder_add (&builder, "{sv}", "description", g_variant_new_string (desc)); g_free (start_date); g_free (desc); g_variant_builder_add_value (&abuilder, g_variant_builder_end (&builder)); } g_dbus_method_invocation_return_value (invocation, g_variant_new ("(aa{sv})", &abuilder)); return TRUE; }