static void photos_base_item_create_thumbnail_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) { PhotosBaseItem *self = PHOTOS_BASE_ITEM (source_object); PhotosBaseItemPrivate *priv = self->priv; GError *error; GFile *file = G_FILE (user_data); error = NULL; photos_base_item_create_thumbnail_finish (self, res, &error); if (error != NULL) { priv->failed_thumbnailing = TRUE; g_warning ("Unable to create thumbnail: %s", error->message); photos_base_item_set_failed_icon (self); g_error_free (error); goto out; } g_file_query_info_async (file, G_FILE_ATTRIBUTE_THUMBNAIL_PATH, G_FILE_QUERY_INFO_NONE, G_PRIORITY_DEFAULT, NULL, photos_base_item_thumbnail_path_info, g_object_ref (self)); out: g_object_unref (file); }
static void photos_base_item_refresh_thumb_path_read (GObject *source_object, GAsyncResult *res, gpointer user_data) { PhotosBaseItem *self = PHOTOS_BASE_ITEM (user_data); PhotosBaseItemPrivate *priv = self->priv; GError *error = NULL; GFile *file = G_FILE (source_object); GFileInputStream *stream; stream = g_file_read_finish (file, res, &error); if (error != NULL) { gchar *uri; uri = g_file_get_uri (file); g_warning ("Unable to read file at %s: %s", uri, error->message); priv->failed_thumbnailing = TRUE; priv->thumb_path = NULL; g_file_delete_async (file, G_PRIORITY_DEFAULT, NULL, NULL, NULL); photos_base_item_set_failed_icon (self); g_free (uri); g_error_free (error); goto out; } g_object_set_data_full (G_OBJECT (stream), "file", g_object_ref (file), g_object_unref); gdk_pixbuf_new_from_stream_async (G_INPUT_STREAM (stream), NULL, photos_base_item_refresh_thumb_path_pixbuf, g_object_ref (self)); g_object_unref (stream); out: g_object_unref (self); }
static void photos_base_item_refresh_thumb_path_pixbuf (GObject *source_object, GAsyncResult *res, gpointer user_data) { PhotosBaseItem *self = PHOTOS_BASE_ITEM (user_data); PhotosBaseItemPrivate *priv = self->priv; GApplication *app; GdkPixbuf *pixbuf = NULL; GdkPixbuf *scaled_pixbuf = NULL; GError *error = NULL; GInputStream *stream = G_INPUT_STREAM (source_object); gint icon_size; gint scale; pixbuf = gdk_pixbuf_new_from_stream_finish (res, &error); if (error != NULL) { GFile *file; gchar *uri; file = G_FILE (g_object_get_data (G_OBJECT (stream), "file")); uri = g_file_get_uri (file); g_warning ("Unable to create pixbuf from %s: %s", uri, error->message); priv->failed_thumbnailing = TRUE; priv->thumb_path = NULL; g_file_delete_async (file, G_PRIORITY_DEFAULT, NULL, NULL, NULL); photos_base_item_set_failed_icon (self); g_free (uri); g_error_free (error); goto out; } app = g_application_get_default (); scale = photos_application_get_scale_factor (PHOTOS_APPLICATION (app)); icon_size = photos_utils_get_icon_size_unscaled (); scaled_pixbuf = photos_utils_downscale_pixbuf_for_scale (pixbuf, icon_size, scale); photos_base_item_set_original_icon (self, scaled_pixbuf); out: g_input_stream_close_async (stream, G_PRIORITY_DEFAULT, NULL, NULL, NULL); g_clear_object (&scaled_pixbuf); g_clear_object (&pixbuf); g_object_unref (self); }