Fix crash on opening content menu for DCPs that have had incorrect KDMs added.
authorCarl Hetherington <cth@carlh.net>
Tue, 11 Oct 2016 18:57:22 +0000 (19:57 +0100)
committerCarl Hetherington <cth@carlh.net>
Tue, 11 Oct 2016 18:57:22 +0000 (19:57 +0100)
src/lib/dcp_examiner.cc
src/lib/film.cc
src/lib/film.h
src/wx/content_menu.cc
src/wx/content_menu.h

index e25583cb69064b9ac3dd2fdb7352ab17c13efece..74640ff00358146b8c3dc0f8307ea35aa7d3b9e1 100644 (file)
@@ -192,10 +192,6 @@ DCPExaminer::DCPExaminer (shared_ptr<const DCPContent> 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 ());
index 13a03d929602a1e05c5a1a558b1127e8e999aeec..1a1957d33a4ae97c76038398952e4d84d3480060 100644 (file)
@@ -1027,13 +1027,6 @@ Film::content () const
        return _playlist->content ();
 }
 
-void
-Film::examine_content (shared_ptr<Content> c)
-{
-       shared_ptr<Job> j (new ExamineContentJob (shared_from_this(), c));
-       JobManager::instance()->add (j);
-}
-
 void
 Film::examine_and_add_content (shared_ptr<Content> c)
 {
index 5fa35b0653d67b46d1bd9845eb86d33b61ad8b19..ad94852a2486e9757a888d205a70a33ee7e9f735 100644 (file)
@@ -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<Content>);
        void examine_and_add_content (boost::shared_ptr<Content>);
        void add_content (boost::shared_ptr<Content>);
        void remove_content (boost::shared_ptr<Content>);
index a96461c301643bda66464dff5b756b8b858c7e2b..ad6d6fc654403dbfda7fb8064152122097521bcb 100644 (file)
@@ -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<Job> j (new ExamineContentJob (film, content));
 
-       _job_connection = j->Finished.connect (
-               bind (
-                       &ContentMenu::maybe_found_missing,
-                       this,
-                       boost::weak_ptr<Job> (j),
-                       boost::weak_ptr<Content> (_content.front ()),
-                       boost::weak_ptr<Content> (content)
+       _job_connections.push_back (
+               j->Finished.connect (
+                       bind (
+                               &ContentMenu::maybe_found_missing,
+                               this,
+                               boost::weak_ptr<Job> (j),
+                               boost::weak_ptr<Content> (_content.front ()),
+                               boost::weak_ptr<Content> (content)
+                               )
                        )
                );
 
@@ -328,7 +334,7 @@ ContentMenu::re_examine ()
        }
 
        BOOST_FOREACH (shared_ptr<Content> i, _content) {
-               film->examine_content (i);
+               JobManager::instance()->add (shared_ptr<Job> (new ExamineContentJob (film, i)));
        }
 }
 
@@ -373,12 +379,29 @@ ContentMenu::kdm ()
 
                shared_ptr<Film> film = _film.lock ();
                DCPOMATIC_ASSERT (film);
-               film->examine_content (dcp);
+               shared_ptr<Job> j (new ExamineContentJob (film, dcp));
+               _job_connections.push_back (
+                       j->Finished.connect (bind (&ContentMenu::check_kdm_validity, this, weak_ptr<DCPContent> (dcp)))
+                       );
+               JobManager::instance()->add (j);
        }
 
        d->Destroy ();
 }
 
+void
+ContentMenu::check_kdm_validity (weak_ptr<DCPContent> wp)
+{
+       shared_ptr<DCPContent> 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 = _film.lock ();
                DCPOMATIC_ASSERT (film);
-               film->examine_content (dcp);
+               JobManager::instance()->add (shared_ptr<Job> (new ExamineContentJob (film, dcp)));
        }
 
        d->Destroy ();
@@ -425,5 +448,5 @@ ContentMenu::cpl_selected (wxCommandEvent& ev)
        dcp->set_cpl ((*i)->id ());
        shared_ptr<Film> film = _film.lock ();
        DCPOMATIC_ASSERT (film);
-       film->examine_content (dcp);
+       JobManager::instance()->add (shared_ptr<Job> (new ExamineContentJob (film, dcp)));
 }
index 43480888a5007ed306bc49f0468dd71fe1d01379..7b1e663fa8a86902746ca9c6e05d1b30b26a961a 100644 (file)
@@ -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<Job>, boost::weak_ptr<Content>, boost::weak_ptr<Content>);
        void cpl_selected (wxCommandEvent& ev);
+       void check_kdm_validity (boost::weak_ptr<DCPContent> wp);
 
        wxMenu* _menu;
        wxMenu* _cpl_menu;
@@ -67,7 +69,7 @@ private:
        wxMenuItem* _choose_cpl;
        wxMenuItem* _remove;
 
-       boost::signals2::scoped_connection _job_connection;
+       std::list<boost::signals2::connection> _job_connections;
 };
 
 #endif