void ImportPhoto(Photo photo, bool copy) { Log.WarningFormat("Importing {0}", photo.Name); PhotoStore from_store = from_db.Photos; PhotoStore to_store = to_db.Photos; string photo_path = photo.VersionUri(Photo.OriginalVersionId).AbsolutePath; while (!System.IO.File.Exists(photo_path)) { Log.Debug("Not found, trying the mappings..."); foreach (string key in PathMap.Keys) { string path = photo_path; path = path.Replace(key, PathMap [key]); Log.DebugFormat("Replaced path {0}", path); if (System.IO.File.Exists(path)) { photo_path = path; break;; } } if (System.IO.File.Exists(photo_path)) { Log.Debug("Exists!!!"); continue; } string [] parts = photo_path.Split(new char[] { '/' }); if (parts.Length > 6) { string folder = String.Join("/", parts, 0, parts.Length - 4); PickFolderDialog pfd = new PickFolderDialog(mdd.Dialog, folder); string new_folder = pfd.Run(); pfd.Dialog.Destroy(); if (new_folder == null) //Skip { return; } Log.DebugFormat("{0} maps to {1}", folder, new_folder); PathMap[folder] = new_folder; } else { Console.WriteLine("point me to the file"); } Console.WriteLine("FNF: {0}", photo_path); } string destination; Gdk.Pixbuf pixbuf; Photo newp; if (copy) { destination = FileImportBackend.ChooseLocation(photo_path, null); } else { destination = photo_path; } // Don't copy if we are already home if (photo_path == destination) { newp = to_store.Create(destination, roll_map [photo.RollId], out pixbuf); } else { System.IO.File.Copy(photo_path, destination); newp = to_store.Create(destination, photo_path, roll_map [photo.RollId], out pixbuf); try { File.SetAttributes(destination, File.GetAttributes(destination) & ~FileAttributes.ReadOnly); DateTime create = File.GetCreationTime(photo_path); File.SetCreationTime(destination, create); DateTime mod = File.GetLastWriteTime(photo_path); File.SetLastWriteTime(destination, mod); } catch (IOException) { // we don't want an exception here to be fatal. } } if (newp == null) { return; } foreach (Tag t in photo.Tags) { Log.WarningFormat("Tagging with {0}", t.Name); newp.AddTag(tag_map [t.Id]); } foreach (uint version_id in photo.VersionIds) { if (version_id != Photo.OriginalVersionId) { PhotoVersion version = photo.GetVersion(version_id) as PhotoVersion; uint newv = newp.AddVersion(version.Uri, version.Name, version.IsProtected); if (version_id == photo.DefaultVersionId) { newp.DefaultVersionId = newv; } } } //FIXME Import extra info (time, description, rating) newp.Time = photo.Time; newp.Description = photo.Description; newp.Rating = photo.Rating; to_store.Commit(newp); }
public override bool Step(out StepStatusInfo status_info) { Photo photo = null; Pixbuf thumbnail = null; bool is_duplicate = false; if (import_info == null) { throw new ImportException("Prepare() was not called"); } if (this.count == import_info.Count) { throw new ImportException("Already finished"); } // FIXME Need to get the EXIF info etc. ImportInfo info = (ImportInfo)import_info [this.count]; bool needs_commit = false; bool abort = false; try { string destination = info.OriginalPath; if (copy) { destination = ChooseLocation(info.OriginalPath, directories); } // Don't copy if we are already home if (info.OriginalPath == destination) { info.DestinationPath = destination; if (detect_duplicates) { photo = store.CheckForDuplicate(UriUtils.PathToFileUri(destination)); } if (photo == null) { photo = store.Create(info.DestinationPath, roll.Id, out thumbnail); } else { is_duplicate = true; } } else { System.IO.File.Copy(info.OriginalPath, destination); info.DestinationPath = destination; if (detect_duplicates) { photo = store.CheckForDuplicate(UriUtils.PathToFileUri(destination)); } if (photo == null) { photo = store.Create(info.DestinationPath, info.OriginalPath, roll.Id, out thumbnail); try { File.SetAttributes(destination, File.GetAttributes(info.DestinationPath) & ~FileAttributes.ReadOnly); DateTime create = File.GetCreationTime(info.OriginalPath); File.SetCreationTime(info.DestinationPath, create); DateTime mod = File.GetLastWriteTime(info.OriginalPath); File.SetLastWriteTime(info.DestinationPath, mod); } catch (IOException) { // we don't want an exception here to be fatal. } } else { is_duplicate = true; System.IO.File.Delete(destination); } } if (!is_duplicate) { if (tags != null) { foreach (Tag t in tags) { photo.AddTag(t); } needs_commit = true; } needs_commit |= xmptags.Import(photo, info.DestinationPath, info.OriginalPath); if (needs_commit) { store.Commit(photo); } info.Photo = photo; } } catch (System.Exception e) { System.Console.WriteLine("Error importing {0}{2}{1}", info.OriginalPath, e.ToString(), Environment.NewLine); if (thumbnail != null) { thumbnail.Dispose(); } thumbnail = null; photo = null; HigMessageDialog errordialog = new HigMessageDialog(parent, Gtk.DialogFlags.Modal | Gtk.DialogFlags.DestroyWithParent, Gtk.MessageType.Error, Gtk.ButtonsType.Cancel, Catalog.GetString("Import error"), String.Format(Catalog.GetString("Error importing {0}{2}{2}{1}"), info.OriginalPath, e.Message, Environment.NewLine)); errordialog.AddButton(Catalog.GetString("Skip"), Gtk.ResponseType.Reject, false); ResponseType response = (ResponseType)errordialog.Run(); errordialog.Destroy(); if (response == ResponseType.Cancel) { abort = true; } } this.count++; if (is_duplicate) { this.duplicate_count++; } status_info = new StepStatusInfo(photo, thumbnail, this.count, is_duplicate); return(!abort && count != import_info.Count); }