diff options
Diffstat (limited to 'src/camera/ImportPage.vala')
| -rw-r--r-- | src/camera/ImportPage.vala | 76 | 
1 files changed, 48 insertions, 28 deletions
| diff --git a/src/camera/ImportPage.vala b/src/camera/ImportPage.vala index 4e055ec..f7698a6 100644 --- a/src/camera/ImportPage.vala +++ b/src/camera/ImportPage.vala @@ -615,20 +615,13 @@ public class ImportPage : CheckerboardPage {              return true;          } -         -        public override bool complete(MediaSource source, BatchImportRoll import_roll) throws Error { -            bool ret = false; -            if (source is Photo) { -                Photo photo = source as Photo; -                 -                // Associate paired JPEG with RAW photo. -                if (associated_file != null) { -                    photo.add_backing_photo_for_development(RawDeveloper.CAMERA, associated_file); -                    ret = true; -                    photo.set_raw_developer(Config.Facade.get_instance().get_default_raw_developer()); -                } + +        public override File? get_associated_file() { +            if (associated_file == null) { +                return null;              } -            return ret; + +            return File.new_for_path(associated_file.filepath);          }      } @@ -917,8 +910,8 @@ public class ImportPage : CheckerboardPage {      protected override void init_actions(int selected_count, int count) {          on_view_changed(); -        set_action_important("ImportSelected", true); -        set_action_important("ImportAll", true); +        set_action_sensitive("ImportSelected", true); +        set_action_sensitive("ImportAll", true);          base.init_actions(selected_count, count);      } @@ -1015,6 +1008,17 @@ public class ImportPage : CheckerboardPage {                  } catch (Error err) {                      // error means not mounted                  } + +                // Could not find mount for gphoto2://, re-try with mtp:// +                // It seems some devices are mounted using MTP and not gphoto2 daemon +                if (mount == null && this.uri.has_prefix("gphoto2")) { +                    uri = File.new_for_uri("mtp" + this.uri.substring(7)); +                    try { +                        mount = uri.find_enclosing_mount(null); +                    } catch (Error err) { +                        // error means not mounted +                    } +                }                  if (mount != null) {                      // it's mounted, offer to unmount for the user @@ -1153,22 +1157,45 @@ public class ImportPage : CheckerboardPage {          return false;      } +    private int claim_timeout = 500; +      private RefreshResult refresh_camera() {          if (busy)              return RefreshResult.BUSY; -        this.set_page_message (_("Starting import, please wait…")); - +        this.set_page_message (_("Connecting to camera, please wait…"));          update_status(busy, false);          refresh_error = null;          refresh_result = camera.init(spin_idle_context.context); + +        // If we fail to claim the device, we might have run into a conflict +        // with gvfs-gphoto2-volume-monitor. Back off, try again after +        // claim_timeout ms. +        // We will wait 3.5s in total (500 + 1000 + 2000) before giving +        // up with the infamous -53 error dialog. +        if (refresh_result == GPhoto.Result.IO_USB_CLAIM) { +            if (claim_timeout < 4000) { +                Timeout.add (claim_timeout, () => { +                    refresh_camera(); +                    return false; +                }); +                claim_timeout *= 2; + +                return RefreshResult.LOCKED; +            } +        } + +        // reset claim_timeout to initial value +        claim_timeout = 500; +          if (refresh_result != GPhoto.Result.OK) {              warning("Unable to initialize camera: %s", refresh_result.to_full_string());              return (refresh_result == GPhoto.Result.IO_LOCK) ? RefreshResult.LOCKED : RefreshResult.LIBRARY_ERROR;          } +        this.set_page_message (_("Starting import, please wait…"));          update_status(true, refreshed);          on_view_changed(); @@ -1379,6 +1406,7 @@ public class ImportPage : CheckerboardPage {              return true;          } +        files.sort();          for (int ctr = 0; ctr < files.count(); ctr++) {              string filename; @@ -1553,9 +1581,7 @@ public class ImportPage : CheckerboardPage {              // calculate EXIF's fingerprint              string? exif_only_md5 = null;              if (metadata != null) { -                uint8[]? flattened_sans_thumbnail = metadata.flatten_exif(false); -                if (flattened_sans_thumbnail != null && flattened_sans_thumbnail.length > 0) -                    exif_only_md5 = md5_binary(flattened_sans_thumbnail, flattened_sans_thumbnail.length); +                exif_only_md5 = metadata.exif_hash();              }              // XXX: Cannot use the metadata for the thumbnail preview because libgphoto2 @@ -1564,9 +1590,8 @@ public class ImportPage : CheckerboardPage {              // this means the preview orientation will be wrong and the MD5 is not generated              // if the EXIF did not parse properly (see above) -            uint8[] preview_raw = null; -            size_t preview_raw_length = 0;              Gdk.Pixbuf preview = null; +            string? preview_md5 = null;              try {                  string preview_fulldir = fulldir;                  string preview_filename = filename; @@ -1575,7 +1600,7 @@ public class ImportPage : CheckerboardPage {                      preview_filename = associated.get_filename();                  }                  preview = GPhoto.load_preview(spin_idle_context.context, camera, preview_fulldir, -                    preview_filename, out preview_raw, out preview_raw_length); +                    preview_filename, out preview_md5);              } catch (Error err) {                  // only issue the warning message if we're not reading a video. GPhoto is capable                  // of reading video previews about 50% of the time, so we don't want to put a guard @@ -1587,11 +1612,6 @@ public class ImportPage : CheckerboardPage {                  }              } -            // calculate thumbnail fingerprint -            string? preview_md5 = null; -            if (preview != null && preview_raw != null && preview_raw_length > 0) -                preview_md5 = md5_binary(preview_raw, preview_raw_length); -              #if TRACE_MD5              debug("camera MD5 %s: exif=%s preview=%s", filename, exif_only_md5, preview_md5);  #endif | 
