From: Carl Hetherington Date: Mon, 13 May 2019 20:52:27 +0000 (+0100) Subject: swaroop: allow ScreenKDM subclasses for different KDM types. X-Git-Tag: v2.15.4~3 X-Git-Url: https://git.carlh.net/gitweb/?p=dcpomatic.git;a=commitdiff_plain;h=006e38346a8bcdcc889979b7c00802d9bb8fc6f8 swaroop: allow ScreenKDM subclasses for different KDM types. --- diff --git a/src/lib/cinema_kdms.cc b/src/lib/cinema_kdms.cc index 7952b7ab2..32879cf6b 100644 --- a/src/lib/cinema_kdms.cc +++ b/src/lib/cinema_kdms.cc @@ -56,8 +56,8 @@ CinemaKDMs::make_zip_file (boost::filesystem::path zip_file, dcp::NameFormat nam name_values['c'] = cinema->name; - BOOST_FOREACH (ScreenKDM const & i, screen_kdms) { - shared_ptr kdm (new string (i.kdm.as_xml ())); + BOOST_FOREACH (shared_ptr i, screen_kdms) { + shared_ptr kdm (new string(i->kdm_as_xml())); kdm_strings.push_back (kdm); struct zip_source* source = zip_source_buffer (zip, kdm->c_str(), kdm->length(), 0); @@ -65,8 +65,8 @@ CinemaKDMs::make_zip_file (boost::filesystem::path zip_file, dcp::NameFormat nam throw runtime_error ("could not create ZIP source"); } - name_values['s'] = i.screen->name; - name_values['i'] = i.kdm.id (); + name_values['s'] = i->screen->name; + name_values['i'] = i->kdm_id (); string const name = careful_string_filter(name_format.get(name_values, ".xml")); if (zip_add (zip, name.c_str(), source) == -1) { throw runtime_error ("failed to add KDM to ZIP archive"); @@ -82,7 +82,7 @@ CinemaKDMs::make_zip_file (boost::filesystem::path zip_file, dcp::NameFormat nam * CinemaKDM contains the KDMs for its cinema. */ list -CinemaKDMs::collect (list screen_kdms) +CinemaKDMs::collect (list > screen_kdms) { list cinema_kdms; @@ -92,17 +92,17 @@ CinemaKDMs::collect (list screen_kdms) CinemaKDMs ck; - list::iterator i = screen_kdms.begin (); - ck.cinema = i->screen->cinema; + list >::iterator i = screen_kdms.begin (); + ck.cinema = (*i)->screen->cinema; ck.screen_kdms.push_back (*i); - list::iterator j = i; + list >::iterator j = i; ++i; screen_kdms.remove (*j); while (i != screen_kdms.end ()) { - if (i->screen->cinema == ck.cinema) { + if ((*i)->screen->cinema == ck.cinema) { ck.screen_kdms.push_back (*i); - list::iterator j = i; + list >::iterator j = i; ++i; screen_kdms.remove (*j); } else { @@ -230,8 +230,8 @@ CinemaKDMs::email ( boost::algorithm::replace_all (body, "$CINEMA_NAME", i.cinema->name); string screens; - BOOST_FOREACH (ScreenKDM const & j, i.screen_kdms) { - screens += j.screen->name + ", "; + BOOST_FOREACH (shared_ptr j, i.screen_kdms) { + screens += j->screen->name + ", "; } boost::algorithm::replace_all (body, "$SCREENS", screens.substr (0, screens.length() - 2)); diff --git a/src/lib/cinema_kdms.h b/src/lib/cinema_kdms.h index 566b947a2..2b82cdab6 100644 --- a/src/lib/cinema_kdms.h +++ b/src/lib/cinema_kdms.h @@ -29,7 +29,7 @@ class CinemaKDMs public: void make_zip_file (boost::filesystem::path zip_file, dcp::NameFormat name_format, dcp::NameFormat::Map name_values) const; - static std::list collect (std::list kdms); + static std::list collect (std::list > kdms); static int write_directories ( std::list cinema_kdms, @@ -58,5 +58,5 @@ public: ); boost::shared_ptr cinema; - std::list screen_kdms; + std::list > screen_kdms; }; diff --git a/src/lib/encrypted_ecinema_kdm.cc b/src/lib/encrypted_ecinema_kdm.cc index e4e19d7fb..f0502ab31 100644 --- a/src/lib/encrypted_ecinema_kdm.cc +++ b/src/lib/encrypted_ecinema_kdm.cc @@ -22,6 +22,7 @@ #include "encrypted_ecinema_kdm.h" #include "exceptions.h" +#include "cross.h" #include #include #include @@ -85,4 +86,13 @@ EncryptedECinemaKDM::as_xml () const return document.write_to_string ("UTF-8"); } +void +EncryptedECinemaKDM::as_xml (boost::filesystem::path path) const +{ + FILE* f = fopen_boost (path, "w"); + string const x = as_xml (); + fwrite (x.c_str(), 1, x.length(), f); + fclose (f); +} + #endif diff --git a/src/lib/encrypted_ecinema_kdm.h b/src/lib/encrypted_ecinema_kdm.h index 0bcbc4117..c65620c8b 100644 --- a/src/lib/encrypted_ecinema_kdm.h +++ b/src/lib/encrypted_ecinema_kdm.h @@ -35,6 +35,7 @@ public: explicit EncryptedECinemaKDM (std::string xml); std::string as_xml () const; + void as_xml (boost::filesystem::path out) const; std::string id () const { return _id; diff --git a/src/lib/film.cc b/src/lib/film.cc index efc89e0eb..e54268805 100644 --- a/src/lib/film.cc +++ b/src/lib/film.cc @@ -1420,7 +1420,7 @@ Film::make_kdm ( * @param disable_forensic_marking_audio if not set, don't disable forensic marking of audio. If set to 0, * disable all forensic marking; if set above 0, disable forensic marking above that channel. */ -list +list > Film::make_kdms ( list > screens, boost::filesystem::path cpl_file, @@ -1431,7 +1431,7 @@ Film::make_kdms ( optional disable_forensic_marking_audio ) const { - list kdms; + list > kdms; BOOST_FOREACH (shared_ptr i, screens) { if (i->recipient) { @@ -1446,7 +1446,7 @@ Film::make_kdms ( disable_forensic_marking_audio ); - kdms.push_back (ScreenKDM (i, kdm)); + kdms.push_back (shared_ptr(new DCPScreenKDM(i, kdm))); } } diff --git a/src/lib/film.h b/src/lib/film.h index 87ea700b7..876d312ae 100644 --- a/src/lib/film.h +++ b/src/lib/film.h @@ -142,7 +142,7 @@ public: boost::optional disable_forensic_marking_audio ) const; - std::list make_kdms ( + std::list > make_kdms ( std::list > screens, boost::filesystem::path cpl_file, boost::posix_time::ptime from, diff --git a/src/lib/screen_kdm.cc b/src/lib/screen_kdm.cc index 5b7692469..f9a3fa36e 100644 --- a/src/lib/screen_kdm.cc +++ b/src/lib/screen_kdm.cc @@ -29,15 +29,9 @@ using std::cout; using std::list; using boost::shared_ptr; -bool -operator== (ScreenKDM const & a, ScreenKDM const & b) -{ - return a.screen == b.screen && a.kdm == b.kdm; -} - int ScreenKDM::write_files ( - list screen_kdms, + list > screen_kdms, boost::filesystem::path directory, dcp::NameFormat name_format, dcp::NameFormat::Map name_values, @@ -48,8 +42,8 @@ ScreenKDM::write_files ( if (directory == "-") { /* Write KDMs to the stdout */ - BOOST_FOREACH (ScreenKDM const & i, screen_kdms) { - cout << i.kdm.as_xml (); + BOOST_FOREACH (shared_ptr i, screen_kdms) { + cout << i->kdm_as_xml (); ++written; } @@ -61,13 +55,13 @@ ScreenKDM::write_files ( } /* Write KDMs to the specified directory */ - BOOST_FOREACH (ScreenKDM const & i, screen_kdms) { - name_values['c'] = i.screen->cinema ? i.screen->cinema->name : ""; - name_values['s'] = i.screen->name; - name_values['i'] = i.kdm.id (); + BOOST_FOREACH (shared_ptr i, screen_kdms) { + name_values['c'] = i->screen->cinema ? i->screen->cinema->name : ""; + name_values['s'] = i->screen->name; + name_values['i'] = i->kdm_id (); boost::filesystem::path out = directory / careful_string_filter(name_format.get(name_values, ".xml")); if (!boost::filesystem::exists (out) || confirm_overwrite (out)) { - i.kdm.as_xml (out); + i->kdm_as_xml (out); ++written; } } diff --git a/src/lib/screen_kdm.h b/src/lib/screen_kdm.h index 351c2f1c2..6a102557f 100644 --- a/src/lib/screen_kdm.h +++ b/src/lib/screen_kdm.h @@ -21,6 +21,9 @@ #ifndef DCPOMATIC_SCREEN_KDM_H #define DCPOMATIC_SCREEN_KDM_H +#ifdef DCPOMATIC_VARIANT_SWAROOP +#include "encrypted_ecinema_kdm.h" +#endif #include #include #include @@ -33,21 +36,69 @@ namespace dcpomatic { class ScreenKDM { public: - ScreenKDM (boost::shared_ptr s, dcp::EncryptedKDM k) + ScreenKDM (boost::shared_ptr s) : screen (s) - , kdm (k) {} + virtual std::string kdm_as_xml () const = 0; + virtual void kdm_as_xml (boost::filesystem::path out) const = 0; + virtual std::string kdm_id () const = 0; + static int write_files ( - std::list screen_kdms, boost::filesystem::path directory, + std::list > screen_kdms, boost::filesystem::path directory, dcp::NameFormat name_format, dcp::NameFormat::Map name_values, boost::function confirm_overwrite ); boost::shared_ptr screen; +}; + +class DCPScreenKDM : public ScreenKDM +{ +public: + DCPScreenKDM (boost::shared_ptr s, dcp::EncryptedKDM k) + : ScreenKDM (s) + , kdm (k) + {} + + std::string kdm_as_xml () const { + return kdm.as_xml (); + } + + void kdm_as_xml (boost::filesystem::path out) const { + return kdm.as_xml (out); + } + + std::string kdm_id () const { + return kdm.cpl_id (); + } + dcp::EncryptedKDM kdm; }; -extern bool operator== (ScreenKDM const & a, ScreenKDM const & b); +#ifdef DCPOMATIC_VARIANT_SWAROOP +class ECinemaScreenKDM : public ScreenKDM +{ +public: + ECinemaScreenKDM (boost::shared_ptr s, EncryptedECinemaKDM k) + : ScreenKDM (s) + , kdm (k) + {} + + std::string kdm_as_xml () const { + return kdm.as_xml (); + } + + void kdm_as_xml (boost::filesystem::path out) const { + return kdm.as_xml (out); + } + + std::string kdm_id () const { + return kdm.id (); + } + + EncryptedECinemaKDM kdm; +}; +#endif #endif diff --git a/src/lib/wscript b/src/lib/wscript index 37b942400..c5a270f65 100644 --- a/src/lib/wscript +++ b/src/lib/wscript @@ -77,7 +77,6 @@ sources = """ digester.cc dkdm_wrapper.cc dolby_cp750.cc - ecinema_screen_kdm.cc edid.cc emailer.cc empty.cc diff --git a/src/tools/dcpomatic_kdm.cc b/src/tools/dcpomatic_kdm.cc index 60bb54f59..fc4282535 100644 --- a/src/tools/dcpomatic_kdm.cc +++ b/src/tools/dcpomatic_kdm.cc @@ -313,7 +313,7 @@ private: throw InvalidSignerError (); } - list screen_kdms; + list > screen_kdms; BOOST_FOREACH (shared_ptr i, _screens->screens()) { if (!i->recipient) { @@ -336,11 +336,13 @@ private: /* Encrypt */ screen_kdms.push_back ( - ScreenKDM ( - i, - kdm.encrypt ( - signer, i->recipient.get(), i->trusted_device_thumbprints(), _output->formulation(), - !_output->forensic_mark_video(), _output->forensic_mark_audio() ? boost::optional() : 0 + shared_ptr( + new DCPScreenKDM( + i, + kdm.encrypt( + signer, i->recipient.get(), i->trusted_device_thumbprints(), _output->formulation(), + !_output->forensic_mark_video(), _output->forensic_mark_audio() ? boost::optional() : 0 + ) ) ) ); diff --git a/src/wx/kdm_dialog.cc b/src/wx/kdm_dialog.cc index 920f54a3e..55b89a371 100644 --- a/src/wx/kdm_dialog.cc +++ b/src/wx/kdm_dialog.cc @@ -149,7 +149,7 @@ KDMDialog::make_clicked () shared_ptr film = _film.lock (); DCPOMATIC_ASSERT (film); - list screen_kdms; + list > screen_kdms; try { screen_kdms = film->make_kdms ( diff --git a/src/wx/kdm_output_panel.cc b/src/wx/kdm_output_panel.cc index 876329123..181ca74f4 100644 --- a/src/wx/kdm_output_panel.cc +++ b/src/wx/kdm_output_panel.cc @@ -181,7 +181,7 @@ KDMOutputPanel::kdm_write_type_changed () pair, int> KDMOutputPanel::make ( - list screen_kdms, string name, KDMTimingPanel* timing, function confirm_overwrite + list > screen_kdms, string name, KDMTimingPanel* timing, function confirm_overwrite ) { list const cinema_kdms = CinemaKDMs::collect (screen_kdms); diff --git a/src/wx/kdm_output_panel.h b/src/wx/kdm_output_panel.h index ed162e053..c52fa7a15 100644 --- a/src/wx/kdm_output_panel.h +++ b/src/wx/kdm_output_panel.h @@ -49,7 +49,7 @@ public: } std::pair, int> make ( - std::list screen_kdms, + std::list > screen_kdms, std::string name, KDMTimingPanel* timing, boost::function confirm_overwrite