summaryrefslogtreecommitdiff
path: root/src
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 21:24:28 +0100
commitbc36ddea65fda2088f7e8fa98390e3feac07df84 (patch)
treefb9b7f9ff44f256a2b740e5c5b97893ca5ece82e /src
parent755694dd44cf5a012825b8b822da3738461b81ad (diff)
Give a better error when opening a DCP with File -> Open by mistake (#1723).
Diffstat (limited to 'src')
-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 99d4c3979..ba3d4a05c 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 391258bd5..73b8cc85a 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 90b18ea70..691ef58da 100644
--- a/src/lib/film.cc
+++ b/src/lib/film.cc
@@ -475,6 +475,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 ea3cfbe32..aea058d80 100644
--- a/src/tools/dcpomatic.cc
+++ b/src/tools/dcpomatic.cc
@@ -447,10 +447,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)