From b55c6c5496f6c8248dd51bbcaecb80ef0efcbadb Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Tue, 11 Oct 2016 19:57:22 +0100 Subject: [PATCH] Fix crash on opening content menu for DCPs that have had incorrect KDMs added. --- src/lib/dcp_examiner.cc | 4 ---- src/lib/film.cc | 7 ------- src/lib/film.h | 1 - src/wx/content_menu.cc | 45 +++++++++++++++++++++++++++++++---------- src/wx/content_menu.h | 4 +++- 5 files changed, 37 insertions(+), 24 deletions(-) diff --git a/src/lib/dcp_examiner.cc b/src/lib/dcp_examiner.cc index e25583cb6..74640ff00 100644 --- a/src/lib/dcp_examiner.cc +++ b/src/lib/dcp_examiner.cc @@ -192,10 +192,6 @@ DCPExaminer::DCPExaminer (shared_ptr content) } } catch (dcp::DCPReadError& e) { _kdm_valid = false; - if (_encrypted && content->kdm ()) { - /* XXX: maybe don't use an exception for this */ - throw runtime_error (_("The KDM does not decrypt the DCP. Perhaps it is targeted at the wrong CPL.")); - } } DCPOMATIC_ASSERT (cpl->standard ()); diff --git a/src/lib/film.cc b/src/lib/film.cc index 13a03d929..1a1957d33 100644 --- a/src/lib/film.cc +++ b/src/lib/film.cc @@ -1027,13 +1027,6 @@ Film::content () const return _playlist->content (); } -void -Film::examine_content (shared_ptr c) -{ - shared_ptr j (new ExamineContentJob (shared_from_this(), c)); - JobManager::instance()->add (j); -} - void Film::examine_and_add_content (shared_ptr c) { diff --git a/src/lib/film.h b/src/lib/film.h index 5fa35b065..ad94852a2 100644 --- a/src/lib/film.h +++ b/src/lib/film.h @@ -289,7 +289,6 @@ public: void set_directory (boost::filesystem::path); void set_name (std::string); void set_use_isdcf_name (bool); - void examine_content (boost::shared_ptr); void examine_and_add_content (boost::shared_ptr); void add_content (boost::shared_ptr); void remove_content (boost::shared_ptr); diff --git a/src/wx/content_menu.cc b/src/wx/content_menu.cc index a96461c30..ad6d6fc65 100644 --- a/src/wx/content_menu.cc +++ b/src/wx/content_menu.cc @@ -94,6 +94,10 @@ ContentMenu::ContentMenu (wxWindow* p) ContentMenu::~ContentMenu () { delete _menu; + + BOOST_FOREACH (boost::signals2::connection& i, _job_connections) { + i.disconnect (); + } } void @@ -306,13 +310,15 @@ ContentMenu::find_missing () shared_ptr j (new ExamineContentJob (film, content)); - _job_connection = j->Finished.connect ( - bind ( - &ContentMenu::maybe_found_missing, - this, - boost::weak_ptr (j), - boost::weak_ptr (_content.front ()), - boost::weak_ptr (content) + _job_connections.push_back ( + j->Finished.connect ( + bind ( + &ContentMenu::maybe_found_missing, + this, + boost::weak_ptr (j), + boost::weak_ptr (_content.front ()), + boost::weak_ptr (content) + ) ) ); @@ -328,7 +334,7 @@ ContentMenu::re_examine () } BOOST_FOREACH (shared_ptr i, _content) { - film->examine_content (i); + JobManager::instance()->add (shared_ptr (new ExamineContentJob (film, i))); } } @@ -373,12 +379,29 @@ ContentMenu::kdm () shared_ptr film = _film.lock (); DCPOMATIC_ASSERT (film); - film->examine_content (dcp); + shared_ptr j (new ExamineContentJob (film, dcp)); + _job_connections.push_back ( + j->Finished.connect (bind (&ContentMenu::check_kdm_validity, this, weak_ptr (dcp))) + ); + JobManager::instance()->add (j); } d->Destroy (); } +void +ContentMenu::check_kdm_validity (weak_ptr wp) +{ + shared_ptr dcp = wp.lock (); + if (!dcp) { + return; + } + + if (dcp->needs_kdm ()) { + error_dialog (0, _("The KDM does not decrypt the DCP. Perhaps it is targeted at the wrong CPL.")); + } +} + void ContentMenu::ov () { @@ -392,7 +415,7 @@ ContentMenu::ov () dcp->add_ov (wx_to_std (d->GetPath ())); shared_ptr film = _film.lock (); DCPOMATIC_ASSERT (film); - film->examine_content (dcp); + JobManager::instance()->add (shared_ptr (new ExamineContentJob (film, dcp))); } d->Destroy (); @@ -425,5 +448,5 @@ ContentMenu::cpl_selected (wxCommandEvent& ev) dcp->set_cpl ((*i)->id ()); shared_ptr film = _film.lock (); DCPOMATIC_ASSERT (film); - film->examine_content (dcp); + JobManager::instance()->add (shared_ptr (new ExamineContentJob (film, dcp))); } diff --git a/src/wx/content_menu.h b/src/wx/content_menu.h index 43480888a..7b1e663fa 100644 --- a/src/wx/content_menu.h +++ b/src/wx/content_menu.h @@ -29,6 +29,7 @@ class Film; class Job; +class DCPContent; class ContentMenu : public boost::noncopyable { @@ -49,6 +50,7 @@ private: void remove (); void maybe_found_missing (boost::weak_ptr, boost::weak_ptr, boost::weak_ptr); void cpl_selected (wxCommandEvent& ev); + void check_kdm_validity (boost::weak_ptr wp); wxMenu* _menu; wxMenu* _cpl_menu; @@ -67,7 +69,7 @@ private: wxMenuItem* _choose_cpl; wxMenuItem* _remove; - boost::signals2::scoped_connection _job_connection; + std::list _job_connections; }; #endif -- 2.30.2