summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2020-03-11 20:23:11 +0000
committerCarl Hetherington <cth@carlh.net>2020-03-11 20:23:11 +0000
commit4fc16ea5fbe1db26d5c50415374a71c0dbf68b0d (patch)
tree4b42ade518e8fe2d003d2d85f0b124664d91609e
parent00596df5d47d306b3550ab33e0691bf3fb68567a (diff)
Give a better error when opening a DCP with File -> Open by mistake (#1723).v2.14.32
-rw-r--r--src/lib/exceptions.cc7
-rw-r--r--src/lib/exceptions.h16
-rw-r--r--src/lib/film.cc4
-rw-r--r--src/tools/dcpomatic.cc19
4 files changed, 42 insertions, 4 deletions
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<boost::filesystem::path> 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<Job>(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> film)