[shotwell] Use gp_file_new_from_fd for getting files



commit eceb40c3578c9c795ad20612a0702024686eafba
Author: Jens Georg <mail jensge org>
Date:   Thu Mar 9 21:24:28 2017 +0100

    Use gp_file_new_from_fd for getting files
    
    Previously, we would use a memory file and load the whole file into memory and
    write it to disk afterwards. That was probably ok for (small) photos, but
    totally killed memory usage with videos.
    
    Signed-off-by: Jens Georg <mail jensge org>
    
    https://bugzilla.gnome.org/show_bug.cgi?id=732663

 src/camera/GPhoto.vala |   23 ++++++++++++++---------
 vapi/libgphoto2.vapi   |    2 ++
 2 files changed, 16 insertions(+), 9 deletions(-)
---
diff --git a/src/camera/GPhoto.vala b/src/camera/GPhoto.vala
index 3616cb2..5acc4a3 100644
--- a/src/camera/GPhoto.vala
+++ b/src/camera/GPhoto.vala
@@ -196,22 +196,27 @@ namespace GPhoto {
         return new Gdk.Pixbuf.from_stream(ins, null);
     }
 
-    public void save_image(Context context, Camera camera, string folder, string filename, 
-        File dest_file) throws Error {
+    public void save_image(Context context, Camera camera, string folder, string filename, File dest_file) 
throws Error {
+        var fd = Posix.creat(dest_file.get_path(), 0640);
+        if (fd < 0) {
+            throw new IOError.FAILED("[%d] Error creating file %s: %m", GLib.errno, dest_file.get_path());
+        }
+
         GPhoto.CameraFile camera_file;
-        GPhoto.Result res = GPhoto.CameraFile.create(out camera_file);
-        if (res != Result.OK)
+        GPhoto.Result res = GPhoto.CameraFile.create_from_fd(out camera_file, fd);
+        if (res != Result.OK) {
+            Posix.close(fd);
             throw new GPhotoError.LIBRARY("[%d] Error allocating camera file: %s", (int) res, 
res.as_string());
+        }
         
         res = camera.get_file(folder, filename, GPhoto.CameraFileType.NORMAL, camera_file, context);
-        if (res != Result.OK)
+        if (res != Result.OK) {
+            Posix.close(fd);
             throw new GPhotoError.LIBRARY("[%d] Error retrieving file object for %s/%s: %s", 
                 (int) res, folder, filename, res.as_string());
+        }
 
-        res = camera_file.save(dest_file.get_path());
-        if (res != Result.OK)
-            throw new GPhotoError.LIBRARY("[%d] Error copying file %s/%s to %s: %s", (int) res, 
-                folder, filename, dest_file.get_path(), res.as_string());
+        Posix.close(fd);
     }
     
     public PhotoMetadata? load_metadata(Context context, Camera camera, string folder, string filename)
diff --git a/vapi/libgphoto2.vapi b/vapi/libgphoto2.vapi
index b6deb1f..22f70ee 100644
--- a/vapi/libgphoto2.vapi
+++ b/vapi/libgphoto2.vapi
@@ -104,6 +104,8 @@ namespace GPhoto {
     public class CameraFile {
         [CCode (cname="gp_file_new")]
         public static Result create(out CameraFile file);
+        [CCode (cname="gp_file_new_from_fd")]
+        public static Result create_from_fd(out CameraFile file, int fd);
         public Result get_data_and_size(out uint8 *data, out ulong data_len);
         public Result save(string filename);
         public Result slurp(uint8[] data, out size_t readlen);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]