summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2019-05-13 21:52:27 +0100
committerCarl Hetherington <cth@carlh.net>2019-05-13 21:52:27 +0100
commit006e38346a8bcdcc889979b7c00802d9bb8fc6f8 (patch)
tree352caad1d2863ef4385b0d91fa7de07f52ff5e27 /src
parent6cde6bcc0b604c1a157a4ccbdce29e91f4d45a91 (diff)
swaroop: allow ScreenKDM subclasses for different KDM types.
Diffstat (limited to 'src')
-rw-r--r--src/lib/cinema_kdms.cc24
-rw-r--r--src/lib/cinema_kdms.h4
-rw-r--r--src/lib/encrypted_ecinema_kdm.cc10
-rw-r--r--src/lib/encrypted_ecinema_kdm.h1
-rw-r--r--src/lib/film.cc6
-rw-r--r--src/lib/film.h2
-rw-r--r--src/lib/screen_kdm.cc22
-rw-r--r--src/lib/screen_kdm.h59
-rw-r--r--src/lib/wscript1
-rw-r--r--src/tools/dcpomatic_kdm.cc14
-rw-r--r--src/wx/kdm_dialog.cc2
-rw-r--r--src/wx/kdm_output_panel.cc2
-rw-r--r--src/wx/kdm_output_panel.h2
13 files changed, 103 insertions, 46 deletions
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<string> kdm (new string (i.kdm.as_xml ()));
+ BOOST_FOREACH (shared_ptr<ScreenKDM> i, screen_kdms) {
+ shared_ptr<string> 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>
-CinemaKDMs::collect (list<ScreenKDM> screen_kdms)
+CinemaKDMs::collect (list<shared_ptr<ScreenKDM> > screen_kdms)
{
list<CinemaKDMs> cinema_kdms;
@@ -92,17 +92,17 @@ CinemaKDMs::collect (list<ScreenKDM> screen_kdms)
CinemaKDMs ck;
- list<ScreenKDM>::iterator i = screen_kdms.begin ();
- ck.cinema = i->screen->cinema;
+ list<shared_ptr<ScreenKDM> >::iterator i = screen_kdms.begin ();
+ ck.cinema = (*i)->screen->cinema;
ck.screen_kdms.push_back (*i);
- list<ScreenKDM>::iterator j = i;
+ list<shared_ptr<ScreenKDM> >::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<ScreenKDM>::iterator j = i;
+ list<shared_ptr<ScreenKDM> >::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<ScreenKDM> 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<CinemaKDMs> collect (std::list<ScreenKDM> kdms);
+ static std::list<CinemaKDMs> collect (std::list<boost::shared_ptr<ScreenKDM> > kdms);
static int write_directories (
std::list<CinemaKDMs> cinema_kdms,
@@ -58,5 +58,5 @@ public:
);
boost::shared_ptr<Cinema> cinema;
- std::list<ScreenKDM> screen_kdms;
+ std::list<boost::shared_ptr<ScreenKDM> > 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 <dcp/key.h>
#include <dcp/certificate.h>
#include <dcp/util.h>
@@ -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<ScreenKDM>
+list<shared_ptr<ScreenKDM> >
Film::make_kdms (
list<shared_ptr<Screen> > screens,
boost::filesystem::path cpl_file,
@@ -1431,7 +1431,7 @@ Film::make_kdms (
optional<int> disable_forensic_marking_audio
) const
{
- list<ScreenKDM> kdms;
+ list<shared_ptr<ScreenKDM> > kdms;
BOOST_FOREACH (shared_ptr<Screen> 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<ScreenKDM>(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<int> disable_forensic_marking_audio
) const;
- std::list<ScreenKDM> make_kdms (
+ std::list<boost::shared_ptr<ScreenKDM> > make_kdms (
std::list<boost::shared_ptr<dcpomatic::Screen> > 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<ScreenKDM> screen_kdms,
+ list<shared_ptr<ScreenKDM> > 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<ScreenKDM> 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<ScreenKDM> 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 <dcp/encrypted_kdm.h>
#include <dcp/name_format.h>
#include <boost/shared_ptr.hpp>
@@ -33,21 +36,69 @@ namespace dcpomatic {
class ScreenKDM
{
public:
- ScreenKDM (boost::shared_ptr<dcpomatic::Screen> s, dcp::EncryptedKDM k)
+ ScreenKDM (boost::shared_ptr<dcpomatic::Screen> 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<ScreenKDM> screen_kdms, boost::filesystem::path directory,
+ std::list<boost::shared_ptr<ScreenKDM> > screen_kdms, boost::filesystem::path directory,
dcp::NameFormat name_format, dcp::NameFormat::Map name_values,
boost::function<bool (boost::filesystem::path)> confirm_overwrite
);
boost::shared_ptr<dcpomatic::Screen> screen;
+};
+
+class DCPScreenKDM : public ScreenKDM
+{
+public:
+ DCPScreenKDM (boost::shared_ptr<dcpomatic::Screen> 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<dcpomatic::Screen> 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<ScreenKDM> screen_kdms;
+ list<shared_ptr<ScreenKDM> > screen_kdms;
BOOST_FOREACH (shared_ptr<Screen> 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<int>() : 0
+ shared_ptr<ScreenKDM>(
+ 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<int>() : 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<const Film> film = _film.lock ();
DCPOMATIC_ASSERT (film);
- list<ScreenKDM> screen_kdms;
+ list<shared_ptr<ScreenKDM> > 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<shared_ptr<Job>, int>
KDMOutputPanel::make (
- list<ScreenKDM> screen_kdms, string name, KDMTimingPanel* timing, function<bool (boost::filesystem::path)> confirm_overwrite
+ list<shared_ptr<ScreenKDM> > screen_kdms, string name, KDMTimingPanel* timing, function<bool (boost::filesystem::path)> confirm_overwrite
)
{
list<CinemaKDMs> 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<boost::shared_ptr<Job>, int> make (
- std::list<ScreenKDM> screen_kdms,
+ std::list<boost::shared_ptr<ScreenKDM> > screen_kdms,
std::string name,
KDMTimingPanel* timing,
boost::function<bool (boost::filesystem::path)> confirm_overwrite