From: Carl Hetherington Date: Wed, 11 Mar 2020 20:23:11 +0000 (+0000) Subject: Give a better error when opening a DCP with File -> Open by mistake (#1723). X-Git-Tag: v2.14.32 X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=commitdiff_plain;h=4fc16ea5fbe1db26d5c50415374a71c0dbf68b0d Give a better error when opening a DCP with File -> Open by mistake (#1723). --- diff --git a/src/lib/exceptions.cc b/src/lib/exceptions.cc index bf474e3ea..4b518e73a 100644 --- a/src/lib/exceptions.cc +++ b/src/lib/exceptions.cc @@ -40,6 +40,13 @@ OpenFileError::OpenFileError (boost::filesystem::path f, int error, Mode mode) } +FileNotFoundError::FileNotFoundError (boost::filesystem::path f) + : runtime_error(String::compose("File %1 not found", f.string())) + , _file (f) +{ + +} + ReadFileError::ReadFileError (boost::filesystem::path f, int e) : FileError (String::compose (_("could not read from file %1 (%2)"), f.string(), strerror (e)), f) { diff --git a/src/lib/exceptions.h b/src/lib/exceptions.h index 99f0a5d87..bd94fb92b 100644 --- a/src/lib/exceptions.h +++ b/src/lib/exceptions.h @@ -117,6 +117,22 @@ public: OpenFileError (boost::filesystem::path f, int error, Mode mode); }; +class FileNotFoundError : public std::runtime_error +{ +public: + FileNotFoundError (boost::filesystem::path f); + virtual ~FileNotFoundError () throw () {} + + /** @return name of the file that this exception concerns */ + boost::filesystem::path file () const { + return _file; + } + +private: + /** name of the file that this exception concerns */ + boost::filesystem::path _file; +}; + /** @class ReadFileError. * @brief Indicates that some error occurred when trying to read from a file */ diff --git a/src/lib/film.cc b/src/lib/film.cc index ede367ded..70142dcf3 100644 --- a/src/lib/film.cc +++ b/src/lib/film.cc @@ -454,6 +454,10 @@ Film::read_metadata (optional path) path = file (metadata_file); } + if (!boost::filesystem::exists(*path)) { + throw FileNotFoundError(*path); + } + cxml::Document f ("Metadata"); f.read_file (path.get ()); diff --git a/src/tools/dcpomatic.cc b/src/tools/dcpomatic.cc index 4edfe4cd1..9d40ff3bd 100644 --- a/src/tools/dcpomatic.cc +++ b/src/tools/dcpomatic.cc @@ -439,10 +439,21 @@ public: JobManager::instance()->add(shared_ptr(new CheckContentChangeJob(film))); } - catch (std::exception& e) { - wxString p = std_to_wx (file.string ()); - wxCharBuffer b = p.ToUTF8 (); - error_dialog (this, wxString::Format (_("Could not open film at %s"), p.data()), std_to_wx (e.what())); + catch (FileNotFoundError& e) { + boost::filesystem::path const dir = e.file().parent_path(); + if (boost::filesystem::exists(dir / "ASSETMAP") || boost::filesystem::exists(dir / "ASSETMAP.xml")) { + error_dialog ( + this, _("Could not open this folder as a DCP-o-matic project."), + _("It looks like you are trying to open a DCP. File -> Open is for loading DCP-o-matic projects, not DCPs. To import a DCP, create a new project with File -> New and then click the \"Add DCP...\" button.") + ); + } else { + wxString const p = std_to_wx(file.string ()); + error_dialog (this, wxString::Format(_("Could not open film at %s"), p.data()), std_to_wx(e.what())); + } + + } catch (std::exception& e) { + wxString const p = std_to_wx (file.string()); + error_dialog (this, wxString::Format(_("Could not open film at %s"), p.data()), std_to_wx(e.what())); } void set_film (shared_ptr film)