summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2020-05-07 00:02:26 +0200
committerCarl Hetherington <cth@carlh.net>2020-05-07 00:02:26 +0200
commit47e29203daec51d313ed8ab8ef759752bce18d45 (patch)
tree2b34f05ffe9ad73c49225e82d91a8dede9f3d6de /src/lib
parente81c5eb9e8ff875240dde9fdaaab0a46f99af615 (diff)
parent581797d640af1572f884ddf4395924894b745b3a (diff)
Add a new "Add DKDM" dialogue (#1637).
The basic motivation here is to avoid having to tell people to "just" create a cinema with a screen in it just to be able to make a DKDM. Here you can just have a recipient, with emails etc. and make DKDMs for them. I hope this makes things clearer from the user POV even if it does muddy the waters a bit with respect to DKDMs just being KDMs (really).
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/cinema_kdms.h62
-rw-r--r--src/lib/config.cc90
-rw-r--r--src/lib/config.h35
-rw-r--r--src/lib/film.cc43
-rw-r--r--src/lib/film.h13
-rw-r--r--src/lib/kdm_recipient.cc45
-rw-r--r--src/lib/kdm_recipient.h48
-rw-r--r--src/lib/kdm_with_metadata.cc (renamed from src/lib/cinema_kdms.cc)204
-rw-r--r--src/lib/kdm_with_metadata.h135
-rw-r--r--src/lib/screen.cc88
-rw-r--r--src/lib/screen.h48
-rw-r--r--src/lib/screen_kdm.cc70
-rw-r--r--src/lib/screen_kdm.h106
-rw-r--r--src/lib/send_kdm_email_job.cc39
-rw-r--r--src/lib/send_kdm_email_job.h16
-rw-r--r--src/lib/trusted_device.cc56
-rw-r--r--src/lib/trusted_device.h46
-rw-r--r--src/lib/wscript6
18 files changed, 672 insertions, 478 deletions
diff --git a/src/lib/cinema_kdms.h b/src/lib/cinema_kdms.h
deleted file mode 100644
index 2b82cdab6..000000000
--- a/src/lib/cinema_kdms.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- Copyright (C) 2013-2015 Carl Hetherington <cth@carlh.net>
-
- This file is part of DCP-o-matic.
-
- DCP-o-matic is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- DCP-o-matic is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with DCP-o-matic. If not, see <http://www.gnu.org/licenses/>.
-
-*/
-
-#include "screen_kdm.h"
-
-class Cinema;
-class Job;
-class Log;
-
-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<boost::shared_ptr<ScreenKDM> > kdms);
-
- static int write_directories (
- std::list<CinemaKDMs> cinema_kdms,
- boost::filesystem::path directory,
- dcp::NameFormat container_name_format,
- dcp::NameFormat filename_format,
- dcp::NameFormat::Map name_values,
- boost::function<bool (boost::filesystem::path)> confirm_overwrite
- );
-
- static int write_zip_files (
- std::list<CinemaKDMs> cinema_kdms,
- boost::filesystem::path directory,
- dcp::NameFormat container_name_format,
- dcp::NameFormat filename_format,
- dcp::NameFormat::Map name_values,
- boost::function<bool (boost::filesystem::path)> confirm_overwrite
- );
-
- static void email (
- std::list<CinemaKDMs> cinema_kdms,
- dcp::NameFormat container_name_format,
- dcp::NameFormat filename_format,
- dcp::NameFormat::Map name_values,
- std::string cpl_name
- );
-
- boost::shared_ptr<Cinema> cinema;
- std::list<boost::shared_ptr<ScreenKDM> > screen_kdms;
-};
diff --git a/src/lib/config.cc b/src/lib/config.cc
index 7364a122c..ebb6ece93 100644
--- a/src/lib/config.cc
+++ b/src/lib/config.cc
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2012-2019 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2012-2020 Carl Hetherington <cth@carlh.net>
This file is part of DCP-o-matic.
@@ -32,6 +32,7 @@
#include "dkdm_wrapper.h"
#include "compose.hpp"
#include "crypto.h"
+#include "dkdm_recipient.h"
#include <dcp/raw_convert.h>
#include <dcp/name_format.h>
#include <dcp/certificate_chain.h>
@@ -127,10 +128,12 @@ Config::set_defaults ()
_win32_console = false;
#endif
_cinemas_file = path ("cinemas.xml");
+ _dkdm_recipients_file = path ("dkdm_recipients.xml");
_show_hints_before_make_dcp = true;
_confirm_kdm_email = true;
_kdm_container_name_format = dcp::NameFormat ("KDM %f %c");
_kdm_filename_format = dcp::NameFormat ("KDM %f %c %s");
+ _dkdm_filename_format = dcp::NameFormat ("DKDM %f %c %s");
_dcp_metadata_filename_format = dcp::NameFormat ("%t");
_dcp_asset_filename_format = dcp::NameFormat ("%t");
_jump_to_selected = true;
@@ -232,6 +235,7 @@ Config::backup ()
boost::filesystem::copy_file(path("config.xml", false), path(String::compose("config.xml.%1", n), false));
boost::filesystem::copy_file(path("cinemas.xml", false), path(String::compose("cinemas.xml.%1", n), false));
+ boost::filesystem::copy_file(path("dkdm_recipients.xml", false), path(String::compose("dkdm_recipients.xml.%1", n), false));
} catch (...) {}
}
@@ -334,7 +338,9 @@ try
_default_interop = f.optional_bool_child("DefaultInterop").get_value_or (false);
_default_kdm_directory = f.optional_string_child("DefaultKDMDirectory");
- /* Load any cinemas from config.xml */
+ /* Read any cinemas that are still lying around in the config file
+ * from an old version.
+ */
read_cinemas (f);
_mail_server = f.string_child ("MailServer");
@@ -513,10 +519,12 @@ try
}
}
_cinemas_file = f.optional_string_child("CinemasFile").get_value_or (path ("cinemas.xml").string ());
+ _dkdm_recipients_file = f.optional_string_child("DKDMRecipientsFile").get_value_or (path("dkdm_recipients.xml").string());
_show_hints_before_make_dcp = f.optional_bool_child("ShowHintsBeforeMakeDCP").get_value_or (true);
_confirm_kdm_email = f.optional_bool_child("ConfirmKDMEmail").get_value_or (true);
_kdm_container_name_format = dcp::NameFormat (f.optional_string_child("KDMContainerNameFormat").get_value_or ("KDM %f %c"));
_kdm_filename_format = dcp::NameFormat (f.optional_string_child("KDMFilenameFormat").get_value_or ("KDM %f %c %s"));
+ _dkdm_filename_format = dcp::NameFormat (f.optional_string_child("DKDMFilenameFormat").get_value_or("DKDM %f %c %s"));
_dcp_metadata_filename_format = dcp::NameFormat (f.optional_string_child("DCPMetadataFilenameFormat").get_value_or ("%t"));
_dcp_asset_filename_format = dcp::NameFormat (f.optional_string_child("DCPAssetFilenameFormat").get_value_or ("%t"));
_jump_to_selected = f.optional_bool_child("JumpToSelected").get_value_or (true);
@@ -608,12 +616,17 @@ try
_player_lock_file = f.optional_string_child("PlayerLockFile");
#endif
- /* Replace any cinemas from config.xml with those from the configured file */
if (boost::filesystem::exists (_cinemas_file)) {
cxml::Document f ("Cinemas");
f.read_file (_cinemas_file);
read_cinemas (f);
}
+
+ if (boost::filesystem::exists (_dkdm_recipients_file)) {
+ cxml::Document f ("DKDMRecipients");
+ f.read_file (_dkdm_recipients_file);
+ read_dkdm_recipients (f);
+ }
}
catch (...) {
if (have_existing ("config.xml")) {
@@ -647,6 +660,7 @@ Config::write () const
{
write_config ();
write_cinemas ();
+ write_dkdm_recipients ();
}
void
@@ -883,12 +897,16 @@ Config::write_config () const
/* [XML] CinemasFile Filename of cinemas list file. */
root->add_child("CinemasFile")->add_child_text (_cinemas_file.string());
+ /* [XML] DKDMRecipientsFile Filename of DKDM recipients list file. */
+ root->add_child("DKDMRecipientsFile")->add_child_text (_dkdm_recipients_file.string());
/* [XML] ShowHintsBeforeMakeDCP 1 to show hints in the GUI before making a DCP, otherwise 0. */
root->add_child("ShowHintsBeforeMakeDCP")->add_child_text (_show_hints_before_make_dcp ? "1" : "0");
/* [XML] ConfirmKDMEmail 1 to confirm before sending KDM emails in the GUI, otherwise 0. */
root->add_child("ConfirmKDMEmail")->add_child_text (_confirm_kdm_email ? "1" : "0");
/* [XML] KDMFilenameFormat Format for KDM filenames. */
root->add_child("KDMFilenameFormat")->add_child_text (_kdm_filename_format.specification ());
+ /* [XML] KDMFilenameFormat Format for DKDM filenames. */
+ root->add_child("DKDMFilenameFormat")->add_child_text(_dkdm_filename_format.specification());
/* [XML] KDMContainerNameFormat Format for KDM containers (directories or ZIP files). */
root->add_child("KDMContainerNameFormat")->add_child_text (_kdm_container_name_format.specification ());
/* [XML] DCPMetadataFilenameFormat Format for DCP metadata filenames. */
@@ -1080,28 +1098,45 @@ Config::write_config () const
}
}
+
+template <class T>
void
-Config::write_cinemas () const
+write_file (string root_node, string node, string version, list<shared_ptr<T> > things, boost::filesystem::path file)
{
xmlpp::Document doc;
- xmlpp::Element* root = doc.create_root_node ("Cinemas");
- root->add_child("Version")->add_child_text ("1");
+ xmlpp::Element* root = doc.create_root_node (root_node);
+ root->add_child("Version")->add_child_text(version);
- BOOST_FOREACH (shared_ptr<Cinema> i, _cinemas) {
- i->as_xml (root->add_child ("Cinema"));
+ BOOST_FOREACH (shared_ptr<T> i, things) {
+ i->as_xml (root->add_child(node));
}
try {
- doc.write_to_file_formatted (_cinemas_file.string() + ".tmp");
- boost::filesystem::remove (_cinemas_file);
- boost::filesystem::rename (_cinemas_file.string() + ".tmp", _cinemas_file);
+ doc.write_to_file_formatted (file.string() + ".tmp");
+ boost::filesystem::remove (file);
+ boost::filesystem::rename (file.string() + ".tmp", file);
} catch (xmlpp::exception& e) {
string s = e.what ();
trim (s);
- throw FileError (s, _cinemas_file);
+ throw FileError (s, file);
}
}
+
+void
+Config::write_cinemas () const
+{
+ write_file ("Cinemas", "Cinema", "1", _cinemas, _cinemas_file);
+}
+
+
+void
+Config::write_dkdm_recipients () const
+{
+ write_file ("DKDMRecipients", "DKDMRecipient", "1", _dkdm_recipients, _dkdm_recipients_file);
+}
+
+
boost::filesystem::path
Config::default_directory_or (boost::filesystem::path a) const
{
@@ -1293,6 +1328,37 @@ Config::set_cinemas_file (boost::filesystem::path file)
changed (OTHER);
}
+
+void
+Config::read_dkdm_recipients (cxml::Document const & f)
+{
+ _dkdm_recipients.clear ();
+ list<cxml::NodePtr> cin = f.node_children ("DKDMRecipient");
+ BOOST_FOREACH (cxml::ConstNodePtr i, f.node_children("DKDMRecipient")) {
+ _dkdm_recipients.push_back (shared_ptr<DKDMRecipient>(new DKDMRecipient(i)));
+ }
+}
+
+void
+Config::set_dkdm_recipients_file (boost::filesystem::path file)
+{
+ if (file == _dkdm_recipients_file) {
+ return;
+ }
+
+ _dkdm_recipients_file = file;
+
+ if (boost::filesystem::exists (_dkdm_recipients_file)) {
+ /* Existing file; read it in */
+ cxml::Document f ("DKDMRecipients");
+ f.read_file (_dkdm_recipients_file);
+ read_dkdm_recipients (f);
+ }
+
+ changed (OTHER);
+}
+
+
void
Config::save_template (shared_ptr<const Film> film, string name) const
{
diff --git a/src/lib/config.h b/src/lib/config.h
index 749407403..f54ca3814 100644
--- a/src/lib/config.h
+++ b/src/lib/config.h
@@ -44,6 +44,7 @@ class Ratio;
class Cinema;
class Film;
class DKDMGroup;
+class DKDMRecipient;
/** @class Config
* @brief A singleton class holding configuration.
@@ -76,6 +77,7 @@ public:
USE_ANY_SERVERS,
SERVERS,
CINEMAS,
+ DKDM_RECIPIENTS,
SOUND,
SOUND_OUTPUT,
INTERFACE_COMPLEXITY,
@@ -148,6 +150,10 @@ public:
return _cinemas;
}
+ std::list<boost::shared_ptr<DKDMRecipient> > dkdm_recipients () const {
+ return _dkdm_recipients;
+ }
+
std::list<int> allowed_dcp_frame_rates () const {
return _allowed_dcp_frame_rates;
}
@@ -342,6 +348,10 @@ public:
return _cinemas_file;
}
+ boost::filesystem::path dkdm_recipients_file () const {
+ return _dkdm_recipients_file;
+ }
+
bool show_hints_before_make_dcp () const {
return _show_hints_before_make_dcp;
}
@@ -358,6 +368,10 @@ public:
return _kdm_filename_format;
}
+ dcp::NameFormat dkdm_filename_format () const {
+ return _dkdm_filename_format;
+ }
+
dcp::NameFormat dcp_metadata_filename_format () const {
return _dcp_metadata_filename_format;
}
@@ -617,6 +631,16 @@ public:
changed (CINEMAS);
}
+ void add_dkdm_recipient (boost::shared_ptr<DKDMRecipient> c) {
+ _dkdm_recipients.push_back (c);
+ changed (DKDM_RECIPIENTS);
+ }
+
+ void remove_dkdm_recipient (boost::shared_ptr<DKDMRecipient> c) {
+ _dkdm_recipients.remove (c);
+ changed (DKDM_RECIPIENTS);
+ }
+
void set_allowed_dcp_frame_rates (std::list<int> const & r) {
maybe_set (_allowed_dcp_frame_rates, r);
}
@@ -814,6 +838,8 @@ public:
void set_cinemas_file (boost::filesystem::path file);
+ void set_dkdm_recipients_file (boost::filesystem::path file);
+
void set_show_hints_before_make_dcp (bool s) {
maybe_set (_show_hints_before_make_dcp, s);
}
@@ -859,6 +885,10 @@ public:
maybe_set (_kdm_filename_format, n);
}
+ void set_dkdm_filename_format (dcp::NameFormat n) {
+ maybe_set (_dkdm_filename_format, n);
+ }
+
void set_dcp_metadata_filename_format (dcp::NameFormat n) {
maybe_set (_dcp_metadata_filename_format, n);
}
@@ -1111,6 +1141,7 @@ public:
void write () const;
void write_config () const;
void write_cinemas () const;
+ void write_dkdm_recipients () const;
void link (boost::filesystem::path new_file) const;
void copy_and_link (boost::filesystem::path new_file) const;
bool have_write_permission () const;
@@ -1136,6 +1167,7 @@ private:
void set_notification_email_to_default ();
void set_cover_sheet_to_default ();
void read_cinemas (cxml::Document const & f);
+ void read_dkdm_recipients (cxml::Document const & f);
boost::shared_ptr<dcp::CertificateChain> create_certificate_chain ();
boost::filesystem::path directory_or (boost::optional<boost::filesystem::path> dir, boost::filesystem::path a) const;
void add_to_history_internal (std::vector<boost::filesystem::path>& h, boost::filesystem::path p);
@@ -1215,6 +1247,7 @@ private:
boost::optional<boost::filesystem::path> _default_kdm_directory;
bool _default_upload_after_make_dcp;
std::list<boost::shared_ptr<Cinema> > _cinemas;
+ std::list<boost::shared_ptr<DKDMRecipient> > _dkdm_recipients;
std::string _mail_server;
int _mail_port;
EmailProtocol _mail_protocol;
@@ -1257,9 +1290,11 @@ private:
std::vector<boost::filesystem::path> _player_history;
boost::shared_ptr<DKDMGroup> _dkdms;
boost::filesystem::path _cinemas_file;
+ boost::filesystem::path _dkdm_recipients_file;
bool _show_hints_before_make_dcp;
bool _confirm_kdm_email;
dcp::NameFormat _kdm_filename_format;
+ dcp::NameFormat _dkdm_filename_format;
dcp::NameFormat _kdm_container_name_format;
dcp::NameFormat _dcp_metadata_filename_format;
dcp::NameFormat _dcp_asset_filename_format;
diff --git a/src/lib/film.cc b/src/lib/film.cc
index a24e9aa30..b233e5ee6 100644
--- a/src/lib/film.cc
+++ b/src/lib/film.cc
@@ -50,7 +50,7 @@
#include "text_content.h"
#include "ffmpeg_content.h"
#include "dcp_content.h"
-#include "screen_kdm.h"
+#include "kdm_with_metadata.h"
#include "cinema.h"
#include "change_signaller.h"
#include "check_content_change_job.h"
@@ -1502,47 +1502,6 @@ Film::make_kdm (
).encrypt (signer, recipient, trusted_devices, formulation, disable_forensic_marking_picture, disable_forensic_marking_audio);
}
-/** @param screens Screens to make KDMs for.
- * @param cpl_file Path to CPL to make KDMs for.
- * @param from KDM from time expressed as a local time in the time zone of the Screen's Cinema.
- * @param until KDM to time expressed as a local time in the time zone of the Screen's Cinema.
- * @param formulation KDM formulation to use.
- * @param disable_forensic_marking_picture true to disable forensic marking of picture.
- * @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<shared_ptr<ScreenKDM> >
-Film::make_kdms (
- list<shared_ptr<Screen> > screens,
- boost::filesystem::path cpl_file,
- boost::posix_time::ptime from,
- boost::posix_time::ptime until,
- dcp::Formulation formulation,
- bool disable_forensic_marking_picture,
- optional<int> disable_forensic_marking_audio
- ) const
-{
- list<shared_ptr<ScreenKDM> > kdms;
-
- BOOST_FOREACH (shared_ptr<Screen> i, screens) {
- if (i->recipient) {
- dcp::EncryptedKDM const kdm = make_kdm (
- i->recipient.get(),
- i->trusted_device_thumbprints(),
- cpl_file,
- dcp::LocalTime (from, i->cinema ? i->cinema->utc_offset_hour() : 0, i->cinema ? i->cinema->utc_offset_minute() : 0),
- dcp::LocalTime (until, i->cinema ? i->cinema->utc_offset_hour() : 0, i->cinema ? i->cinema->utc_offset_minute() : 0),
- formulation,
- disable_forensic_marking_picture,
- disable_forensic_marking_audio
- );
-
- kdms.push_back (shared_ptr<ScreenKDM>(new DCPScreenKDM(i, kdm)));
- }
- }
-
- return kdms;
-}
/** @return The approximate disk space required to encode a DCP of this film with the
* current settings, in bytes.
diff --git a/src/lib/film.h b/src/lib/film.h
index 6cce07c17..40d366f8f 100644
--- a/src/lib/film.h
+++ b/src/lib/film.h
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2012-2019 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2012-2020 Carl Hetherington <cth@carlh.net>
This file is part of DCP-o-matic.
@@ -60,7 +60,6 @@ class AudioProcessor;
class AudioMapping;
class Ratio;
class Job;
-class ScreenKDM;
class Film;
struct isdcf_name_test;
@@ -169,16 +168,6 @@ public:
boost::optional<int> disable_forensic_marking_audio
) const;
- 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,
- boost::posix_time::ptime until,
- dcp::Formulation formulation,
- bool disable_forensic_marking_picture,
- boost::optional<int> disable_forensic_marking_audio
- ) const;
-
int state_version () const {
return _state_version;
}
diff --git a/src/lib/kdm_recipient.cc b/src/lib/kdm_recipient.cc
new file mode 100644
index 000000000..d05192ac6
--- /dev/null
+++ b/src/lib/kdm_recipient.cc
@@ -0,0 +1,45 @@
+/*
+ Copyright (C) 2020 Carl Hetherington <cth@carlh.net>
+
+ This file is part of DCP-o-matic.
+
+ DCP-o-matic is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ DCP-o-matic is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with DCP-o-matic. If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+#include "kdm_recipient.h"
+
+KDMRecipient::KDMRecipient (cxml::ConstNodePtr node)
+ : name (node->string_child("Name"))
+ , notes (node->optional_string_child("Notes").get_value_or (""))
+{
+ if (node->optional_string_child("Certificate")) {
+ recipient = dcp::Certificate (node->string_child("Certificate"));
+ } else if (node->optional_string_child("Recipient")) {
+ recipient = dcp::Certificate (node->string_child("Recipient"));
+ }
+}
+
+
+void
+KDMRecipient::as_xml (xmlpp::Element* parent) const
+{
+ parent->add_child("Name")->add_child_text(name);
+ if (recipient) {
+ parent->add_child("Recipient")->add_child_text(recipient->certificate(true));
+ }
+
+ parent->add_child("Notes")->add_child_text(notes);
+}
+
diff --git a/src/lib/kdm_recipient.h b/src/lib/kdm_recipient.h
new file mode 100644
index 000000000..c0533daeb
--- /dev/null
+++ b/src/lib/kdm_recipient.h
@@ -0,0 +1,48 @@
+/*
+ Copyright (C) 2020 Carl Hetherington <cth@carlh.net>
+
+ This file is part of DCP-o-matic.
+
+ DCP-o-matic is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ DCP-o-matic is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with DCP-o-matic. If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+#ifndef DCPOMATIC_KDM_RECIPIENT_H
+#define DCPOMATIC_KDM_RECIPIENT_H
+
+#include <dcp/certificate.h>
+#include <libcxml/cxml.h>
+#include <libxml++/libxml++.h>
+#include <boost/optional.hpp>
+#include <string>
+
+class KDMRecipient
+{
+public:
+ KDMRecipient (std::string const& name_, std::string const& notes_, boost::optional<dcp::Certificate> recipient_)
+ : name (name_)
+ , notes (notes_)
+ , recipient (recipient_)
+ {}
+
+ explicit KDMRecipient (cxml::ConstNodePtr);
+
+ virtual void as_xml (xmlpp::Element *) const;
+
+ std::string name;
+ std::string notes;
+ boost::optional<dcp::Certificate> recipient;
+};
+
+#endif
diff --git a/src/lib/cinema_kdms.cc b/src/lib/kdm_with_metadata.cc
index 3af1e0d84..0ef1b8f38 100644
--- a/src/lib/cinema_kdms.cc
+++ b/src/lib/kdm_with_metadata.cc
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2013-2015 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2013-2016 Carl Hetherington <cth@carlh.net>
This file is part of DCP-o-matic.
@@ -18,159 +18,187 @@
*/
-#include "exceptions.h"
-#include "cinema_kdms.h"
+#include "kdm_with_metadata.h"
#include "cinema.h"
#include "screen.h"
-#include "config.h"
#include "util.h"
-#include "emailer.h"
-#include "compose.hpp"
-#include "log.h"
#include "zipper.h"
+#include "config.h"
#include "dcpomatic_log.h"
+#include "emailer.h"
#include <boost/foreach.hpp>
+#include <boost/function.hpp>
+#include <boost/function.hpp>
#include "i18n.h"
-using std::list;
-using std::cout;
using std::string;
-using std::runtime_error;
+using std::cout;
+using std::list;
using boost::shared_ptr;
+using boost::optional;
using boost::function;
+int
+write_files (
+ list<KDMWithMetadataPtr> kdms,
+ boost::filesystem::path directory,
+ dcp::NameFormat name_format,
+ boost::function<bool (boost::filesystem::path)> confirm_overwrite
+ )
+{
+ int written = 0;
+
+ if (directory == "-") {
+ /* Write KDMs to the stdout */
+ BOOST_FOREACH (KDMWithMetadataPtr i, kdms) {
+ cout << i->kdm_as_xml ();
+ ++written;
+ }
+
+ return written;
+ }
+
+ if (!boost::filesystem::exists (directory)) {
+ boost::filesystem::create_directories (directory);
+ }
+
+ /* Write KDMs to the specified directory */
+ BOOST_FOREACH (KDMWithMetadataPtr i, kdms) {
+ boost::filesystem::path out = directory / careful_string_filter(name_format.get(i->name_values(), ".xml"));
+ if (!boost::filesystem::exists (out) || confirm_overwrite (out)) {
+ i->kdm_as_xml (out);
+ ++written;
+ }
+ }
+
+ return written;
+}
+
+
+optional<string>
+KDMWithMetadata::get (char k) const
+{
+ dcp::NameFormat::Map::const_iterator i = _name_values.find (k);
+ if (i == _name_values.end()) {
+ return optional<string>();
+ }
+
+ return i->second;
+}
+
+
void
-CinemaKDMs::make_zip_file (boost::filesystem::path zip_file, dcp::NameFormat name_format, dcp::NameFormat::Map name_values) const
+make_zip_file (list<KDMWithMetadataPtr> kdms, boost::filesystem::path zip_file, dcp::NameFormat name_format)
{
Zipper zipper (zip_file);
- name_values['c'] = cinema->name;
-
- BOOST_FOREACH (shared_ptr<ScreenKDM> i, screen_kdms) {
- name_values['s'] = i->screen->name;
- name_values['i'] = i->kdm_id ();
- string const name = careful_string_filter(name_format.get(name_values, ".xml"));
+ BOOST_FOREACH (KDMWithMetadataPtr i, kdms) {
+ string const name = careful_string_filter(name_format.get(i->name_values(), ".xml"));
zipper.add (name, i->kdm_as_xml());
}
zipper.close ();
}
-/** Collect a list of ScreenKDMs into a list of CinemaKDMs so that each
- * CinemaKDM contains the KDMs for its cinema.
+
+/** Collect a list of KDMWithMetadatas into a list of lists so that
+ * each list contains the KDMs for one list.
*/
-list<CinemaKDMs>
-CinemaKDMs::collect (list<shared_ptr<ScreenKDM> > screen_kdms)
+list<list<KDMWithMetadataPtr> >
+collect (list<KDMWithMetadataPtr> kdms)
{
- list<CinemaKDMs> cinema_kdms;
+ list<list<KDMWithMetadataPtr> > grouped;
- while (!screen_kdms.empty ()) {
+ BOOST_FOREACH (KDMWithMetadataPtr i, kdms) {
- /* Get all the screens from a single cinema */
+ list<list<KDMWithMetadataPtr> >::iterator j = grouped.begin ();
- CinemaKDMs ck;
-
- list<shared_ptr<ScreenKDM> >::iterator i = screen_kdms.begin ();
- ck.cinema = (*i)->screen->cinema;
- ck.screen_kdms.push_back (*i);
- list<shared_ptr<ScreenKDM> >::iterator j = i;
- ++i;
- screen_kdms.remove (*j);
-
- while (i != screen_kdms.end ()) {
- if ((*i)->screen->cinema == ck.cinema) {
- ck.screen_kdms.push_back (*i);
- list<shared_ptr<ScreenKDM> >::iterator j = i;
- ++i;
- screen_kdms.remove (*j);
- } else {
- ++i;
+ while (j != grouped.end()) {
+ if (j->front()->group() == i->group()) {
+ j->push_back (i);
+ break;
}
+ ++j;
}
- cinema_kdms.push_back (ck);
+ if (j == grouped.end()) {
+ grouped.push_back (list<KDMWithMetadataPtr>());
+ grouped.back().push_back (i);
+ }
}
- return cinema_kdms;
+ return grouped;
}
-/** Write one directory per cinema into another directory */
+
+/** Write one directory per list into another directory */
int
-CinemaKDMs::write_directories (
- list<CinemaKDMs> cinema_kdms,
+write_directories (
+ list<list<KDMWithMetadataPtr> > kdms,
boost::filesystem::path directory,
dcp::NameFormat container_name_format,
dcp::NameFormat filename_format,
- dcp::NameFormat::Map name_values,
function<bool (boost::filesystem::path)> confirm_overwrite
)
{
- /* No specific screen */
- name_values['s'] = "";
-
int written = 0;
- BOOST_FOREACH (CinemaKDMs const & i, cinema_kdms) {
+ BOOST_FOREACH (list<KDMWithMetadataPtr> const & i, kdms) {
boost::filesystem::path path = directory;
- name_values['c'] = i.cinema->name;
- path /= container_name_format.get(name_values, "");
+ path /= container_name_format.get(i.front()->name_values(), "", "s");
if (!boost::filesystem::exists (path) || confirm_overwrite (path)) {
boost::filesystem::create_directories (path);
- ScreenKDM::write_files (i.screen_kdms, path, filename_format, name_values, confirm_overwrite);
+ write_files (i, path, filename_format, confirm_overwrite);
}
- written += i.screen_kdms.size();
+ written += i.size();
}
return written;
}
+
/** Write one ZIP file per cinema into a directory */
int
-CinemaKDMs::write_zip_files (
- list<CinemaKDMs> cinema_kdms,
+write_zip_files (
+ list<list<KDMWithMetadataPtr> > kdms,
boost::filesystem::path directory,
dcp::NameFormat container_name_format,
dcp::NameFormat filename_format,
- dcp::NameFormat::Map name_values,
function<bool (boost::filesystem::path)> confirm_overwrite
)
{
- /* No specific screen */
- name_values['s'] = "";
-
int written = 0;
- BOOST_FOREACH (CinemaKDMs const & i, cinema_kdms) {
+ BOOST_FOREACH (list<KDMWithMetadataPtr> const & i, kdms) {
boost::filesystem::path path = directory;
- name_values['c'] = i.cinema->name;
- path /= container_name_format.get(name_values, ".zip");
+ path /= container_name_format.get(i.front()->name_values(), ".zip", "s");
if (!boost::filesystem::exists (path) || confirm_overwrite (path)) {
if (boost::filesystem::exists (path)) {
/* Creating a new zip file over an existing one is an error */
boost::filesystem::remove (path);
}
- i.make_zip_file (path, filename_format, name_values);
- written += i.screen_kdms.size();
+ make_zip_file (i, path, filename_format);
+ written += i.size();
}
}
return written;
}
+
/** Email one ZIP file per cinema to the cinema.
- * @param cinema_kdms KDMS to email.
+ * @param kdms KDMs to email.
* @param container_name_format Format of folder / ZIP to use.
* @param filename_format Format of filenames to use.
* @param name_values Values to substitute into \p container_name_format and \p filename_format.
* @param cpl_name Name of the CPL that the KDMs are for.
*/
void
-CinemaKDMs::email (
- list<CinemaKDMs> cinema_kdms,
+email (
+ list<list<KDMWithMetadataPtr> > kdms,
dcp::NameFormat container_name_format,
dcp::NameFormat filename_format,
- dcp::NameFormat::Map name_values,
string cpl_name
)
{
@@ -180,41 +208,39 @@ CinemaKDMs::email (
throw NetworkError (_("No mail server configured in preferences"));
}
- /* No specific screen */
- name_values['s'] = "";
-
- BOOST_FOREACH (CinemaKDMs const & i, cinema_kdms) {
+ BOOST_FOREACH (list<KDMWithMetadataPtr> const & i, kdms) {
- if (i.cinema->emails.empty()) {
+ if (i.front()->emails().empty()) {
continue;
}
- name_values['c'] = i.cinema->name;
-
boost::filesystem::path zip_file = boost::filesystem::temp_directory_path() / boost::filesystem::unique_path();
boost::filesystem::create_directories (zip_file);
- zip_file /= container_name_format.get(name_values, ".zip");
- i.make_zip_file (zip_file, filename_format, name_values);
+ zip_file /= container_name_format.get(i.front()->name_values(), ".zip");
+ make_zip_file (i, zip_file, filename_format);
string subject = config->kdm_subject();
boost::algorithm::replace_all (subject, "$CPL_NAME", cpl_name);
- boost::algorithm::replace_all (subject, "$START_TIME", name_values['b']);
- boost::algorithm::replace_all (subject, "$END_TIME", name_values['e']);
- boost::algorithm::replace_all (subject, "$CINEMA_NAME", i.cinema->name);
+ boost::algorithm::replace_all (subject, "$START_TIME", i.front()->get('b').get_value_or(""));
+ boost::algorithm::replace_all (subject, "$END_TIME", i.front()->get('e').get_value_or(""));
+ boost::algorithm::replace_all (subject, "$CINEMA_NAME", i.front()->get('c').get_value_or(""));
string body = config->kdm_email().c_str();
boost::algorithm::replace_all (body, "$CPL_NAME", cpl_name);
- boost::algorithm::replace_all (body, "$START_TIME", name_values['b']);
- boost::algorithm::replace_all (body, "$END_TIME", name_values['e']);
- boost::algorithm::replace_all (body, "$CINEMA_NAME", i.cinema->name);
+ boost::algorithm::replace_all (body, "$START_TIME", i.front()->get('b').get_value_or(""));
+ boost::algorithm::replace_all (body, "$END_TIME", i.front()->get('e').get_value_or(""));
+ boost::algorithm::replace_all (body, "$CINEMA_NAME", i.front()->get('c').get_value_or(""));
string screens;
- BOOST_FOREACH (shared_ptr<ScreenKDM> j, i.screen_kdms) {
- screens += j->screen->name + ", ";
+ BOOST_FOREACH (KDMWithMetadataPtr j, i) {
+ optional<string> screen_name = j->get('n');
+ if (screen_name) {
+ screens += *screen_name + ", ";
+ }
}
boost::algorithm::replace_all (body, "$SCREENS", screens.substr (0, screens.length() - 2));
- Emailer email (config->kdm_from(), i.cinema->emails, subject, body);
+ Emailer email (config->kdm_from(), i.front()->emails(), subject, body);
BOOST_FOREACH (string i, config->kdm_cc()) {
email.add_cc (i);
@@ -223,7 +249,7 @@ CinemaKDMs::email (
email.add_bcc (config->kdm_bcc ());
}
- email.add_attachment (zip_file, container_name_format.get(name_values, ".zip"), "application/zip");
+ email.add_attachment (zip_file, container_name_format.get(i.front()->name_values(), ".zip"), "application/zip");
Config* c = Config::instance ();
diff --git a/src/lib/kdm_with_metadata.h b/src/lib/kdm_with_metadata.h
new file mode 100644
index 000000000..b6bec1c4c
--- /dev/null
+++ b/src/lib/kdm_with_metadata.h
@@ -0,0 +1,135 @@
+/*
+ Copyright (C) 2013-2019 Carl Hetherington <cth@carlh.net>
+
+ This file is part of DCP-o-matic.
+
+ DCP-o-matic is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ DCP-o-matic is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with DCP-o-matic. If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+#ifndef DCPOMATIC_KDM_WITH_METADATA_H
+#define DCPOMATIC_KDM_WITH_METADATA_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>
+
+class Cinema;
+
+class KDMWithMetadata
+{
+public:
+ KDMWithMetadata (dcp::NameFormat::Map const& name_values, void const* group, std::list<std::string> emails)
+ : _name_values (name_values)
+ , _group (group)
+ , _emails (emails)
+ {}
+
+ virtual ~KDMWithMetadata () {}
+
+ virtual std::string kdm_as_xml () const = 0;
+ virtual void kdm_as_xml (boost::filesystem::path out) const = 0;
+
+ dcp::NameFormat::Map const& name_values () const {
+ return _name_values;
+ }
+
+ boost::optional<std::string> get (char k) const;
+
+ void const* group () const {
+ return _group;
+ }
+
+ std::list<std::string> emails () const {
+ return _emails;
+ }
+
+private:
+ dcp::NameFormat::Map _name_values;
+ void const* _group;
+ std::list<std::string> _emails;
+};
+
+
+typedef boost::shared_ptr<KDMWithMetadata> KDMWithMetadataPtr;
+
+
+int write_files (
+ std::list<KDMWithMetadataPtr> screen_kdms, boost::filesystem::path directory,
+ dcp::NameFormat name_format, boost::function<bool (boost::filesystem::path)> confirm_overwrite
+ );
+
+
+void make_zip_file (std::list<KDMWithMetadataPtr> kdms, boost::filesystem::path zip_file, dcp::NameFormat name_format);
+
+
+std::list<std::list<KDMWithMetadataPtr> > collect (std::list<KDMWithMetadataPtr> kdms);
+
+
+int write_directories (
+ std::list<std::list<KDMWithMetadataPtr> > kdms,
+ boost::filesystem::path directory,
+ dcp::NameFormat container_name_format,
+ dcp::NameFormat filename_format,
+ boost::function<bool (boost::filesystem::path)> confirm_overwrite
+ );
+
+
+int write_zip_files (
+ std::list<std::list<KDMWithMetadataPtr> > kdms,
+ boost::filesystem::path directory,
+ dcp::NameFormat container_name_format,
+ dcp::NameFormat filename_format,
+ boost::function<bool (boost::filesystem::path)> confirm_overwrite
+ );
+
+
+void email (
+ std::list<std::list<KDMWithMetadataPtr> > kdms,
+ dcp::NameFormat container_name_format,
+ dcp::NameFormat filename_format,
+ std::string cpl_name
+ );
+
+
+template <class T>
+class SpecialKDMWithMetadata : public KDMWithMetadata
+{
+public:
+ SpecialKDMWithMetadata (dcp::NameFormat::Map const& name_values, void const* group, std::list<std::string> emails, T k)
+ : KDMWithMetadata (name_values, group, emails)
+ , 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);
+ }
+
+ T kdm;
+};
+
+typedef SpecialKDMWithMetadata<dcp::EncryptedKDM> DCPKDMWithMetadata;
+#ifdef DCPOMATIC_VARIANT_SWAROOP
+typedef SpecialKDMWithMetadata<EncryptedECinemaKDM> ECinemaKDMWithMetadata;
+#endif
+
+#endif
+
diff --git a/src/lib/screen.cc b/src/lib/screen.cc
index fe62a5e6c..61a27f2bc 100644
--- a/src/lib/screen.cc
+++ b/src/lib/screen.cc
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2013-2016 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2013-2020 Carl Hetherington <cth@carlh.net>
This file is part of DCP-o-matic.
@@ -19,24 +19,24 @@
*/
#include "screen.h"
+#include "kdm_with_metadata.h"
+#include "film.h"
+#include "cinema.h"
#include <libxml++/libxml++.h>
#include <boost/foreach.hpp>
#include <boost/algorithm/string.hpp>
+#include <boost/date_time/posix_time/posix_time.hpp>
using std::string;
using std::vector;
+using std::list;
+using boost::shared_ptr;
+using boost::optional;
using namespace dcpomatic;
Screen::Screen (cxml::ConstNodePtr node)
- : name (node->string_child("Name"))
- , notes (node->optional_string_child("Notes").get_value_or (""))
+ : KDMRecipient (node)
{
- if (node->optional_string_child ("Certificate")) {
- recipient = dcp::Certificate (node->string_child ("Certificate"));
- } else if (node->optional_string_child ("Recipient")) {
- recipient = dcp::Certificate (node->string_child ("Recipient"));
- }
-
BOOST_FOREACH (cxml::ConstNodePtr i, node->node_children ("TrustedDevice")) {
if (boost::algorithm::starts_with(i->content(), "-----BEGIN CERTIFICATE-----")) {
trusted_devices.push_back (TrustedDevice(dcp::Certificate(i->content())));
@@ -49,13 +49,7 @@ Screen::Screen (cxml::ConstNodePtr node)
void
Screen::as_xml (xmlpp::Element* parent) const
{
- parent->add_child("Name")->add_child_text (name);
- if (recipient) {
- parent->add_child("Recipient")->add_child_text (recipient->certificate (true));
- }
-
- parent->add_child("Notes")->add_child_text (notes);
-
+ KDMRecipient::as_xml (parent);
BOOST_FOREACH (TrustedDevice i, trusted_devices) {
parent->add_child("TrustedDevice")->add_child_text(i.as_string());
}
@@ -71,34 +65,48 @@ Screen::trusted_device_thumbprints () const
return t;
}
-TrustedDevice::TrustedDevice (string thumbprint)
- : _thumbprint (thumbprint)
-{
-
-}
-
-TrustedDevice::TrustedDevice (dcp::Certificate certificate)
- : _certificate (certificate)
-{
-
-}
-string
-TrustedDevice::as_string () const
+KDMWithMetadataPtr
+kdm_for_screen (
+ shared_ptr<const Film> film,
+ boost::filesystem::path cpl,
+ shared_ptr<const dcpomatic::Screen> screen,
+ boost::posix_time::ptime valid_from,
+ boost::posix_time::ptime valid_to,
+ dcp::Formulation formulation,
+ bool disable_forensic_marking_picture,
+ optional<int> disable_forensic_marking_audio
+ )
{
- if (_certificate) {
- return _certificate->certificate(true);
+ if (!screen->recipient) {
+ return KDMWithMetadataPtr();
}
- return *_thumbprint;
-}
-
-string
-TrustedDevice::thumbprint () const
-{
- if (_certificate) {
- return _certificate->thumbprint ();
+ shared_ptr<const Cinema> cinema = screen->cinema;
+ dcp::LocalTime const begin(valid_from, cinema ? cinema->utc_offset_hour() : 0, cinema ? cinema->utc_offset_minute() : 0);
+ dcp::LocalTime const end (valid_to, cinema ? cinema->utc_offset_hour() : 0, cinema ? cinema->utc_offset_minute() : 0);
+
+ dcp::EncryptedKDM const kdm = film->make_kdm (
+ screen->recipient.get(),
+ screen->trusted_device_thumbprints(),
+ cpl,
+ begin,
+ end,
+ formulation,
+ disable_forensic_marking_picture,
+ disable_forensic_marking_audio
+ );
+
+ dcp::NameFormat::Map name_values;
+ if (cinema) {
+ name_values['c'] = cinema->name;
}
+ name_values['s'] = screen->name;
+ name_values['f'] = film->name();
+ name_values['b'] = begin.date() + " " + begin.time_of_day(true, false);
+ name_values['e'] = end.date() + " " + end.time_of_day(true, false);
+ name_values['i'] = kdm.cpl_id();
- return *_thumbprint;
+ return KDMWithMetadataPtr(new DCPKDMWithMetadata(name_values, cinema.get(), cinema ? cinema->emails : list<string>(), kdm));
}
+
diff --git a/src/lib/screen.h b/src/lib/screen.h
index 40990b684..013afff85 100644
--- a/src/lib/screen.h
+++ b/src/lib/screen.h
@@ -21,30 +21,16 @@
#ifndef DCPOMATIC_SCREEN_H
#define DCPOMATIC_SCREEN_H
+#include "kdm_with_metadata.h"
+#include "kdm_recipient.h"
+#include "trusted_device.h"
#include <dcp/certificate.h>
#include <libcxml/cxml.h>
#include <boost/optional.hpp>
#include <string>
class Cinema;
-
-class TrustedDevice
-{
-public:
- explicit TrustedDevice (std::string);
- explicit TrustedDevice (dcp::Certificate);
-
- boost::optional<dcp::Certificate> certificate () const {
- return _certificate;
- }
-
- std::string thumbprint () const;
- std::string as_string () const;
-
-private:
- boost::optional<dcp::Certificate> _certificate;
- boost::optional<std::string> _thumbprint;
-};
+class Film;
namespace dcpomatic {
@@ -55,14 +41,12 @@ namespace dcpomatic {
* `recipient' (i.e. the mediablock) and the certificates/thumbprints
* of any trusted devices.
*/
-class Screen
+class Screen : public KDMRecipient
{
public:
- Screen (std::string const & na, std::string const & no, boost::optional<dcp::Certificate> rec, std::vector<TrustedDevice> td)
- : name (na)
- , notes (no)
- , recipient (rec)
- , trusted_devices (td)
+ Screen (std::string const & name_, std::string const & notes_, boost::optional<dcp::Certificate> recipient_, std::vector<TrustedDevice> trusted_devices_)
+ : KDMRecipient (name_, notes_, recipient_)
+ , trusted_devices (trusted_devices_)
{}
explicit Screen (cxml::ConstNodePtr);
@@ -71,12 +55,22 @@ public:
std::vector<std::string> trusted_device_thumbprints () const;
boost::shared_ptr<Cinema> cinema;
- std::string name;
- std::string notes;
- boost::optional<dcp::Certificate> recipient;
std::vector<TrustedDevice> trusted_devices;
};
}
+KDMWithMetadataPtr
+kdm_for_screen (
+ boost::shared_ptr<const Film> film,
+ boost::filesystem::path cpl,
+ boost::shared_ptr<const dcpomatic::Screen> screen,
+ boost::posix_time::ptime valid_from,
+ boost::posix_time::ptime valid_to,
+ dcp::Formulation formulation,
+ bool disable_forensic_marking_picture,
+ boost::optional<int> disable_forensic_marking_audio
+ );
+
+
#endif
diff --git a/src/lib/screen_kdm.cc b/src/lib/screen_kdm.cc
deleted file mode 100644
index f9a3fa36e..000000000
--- a/src/lib/screen_kdm.cc
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- Copyright (C) 2013-2016 Carl Hetherington <cth@carlh.net>
-
- This file is part of DCP-o-matic.
-
- DCP-o-matic is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- DCP-o-matic is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with DCP-o-matic. If not, see <http://www.gnu.org/licenses/>.
-
-*/
-
-#include "screen_kdm.h"
-#include "cinema.h"
-#include "screen.h"
-#include "util.h"
-#include <boost/foreach.hpp>
-
-using std::string;
-using std::cout;
-using std::list;
-using boost::shared_ptr;
-
-int
-ScreenKDM::write_files (
- list<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
- )
-{
- int written = 0;
-
- if (directory == "-") {
- /* Write KDMs to the stdout */
- BOOST_FOREACH (shared_ptr<ScreenKDM> i, screen_kdms) {
- cout << i->kdm_as_xml ();
- ++written;
- }
-
- return written;
- }
-
- if (!boost::filesystem::exists (directory)) {
- boost::filesystem::create_directories (directory);
- }
-
- /* Write KDMs to the specified directory */
- 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);
- ++written;
- }
- }
-
- return written;
-}
diff --git a/src/lib/screen_kdm.h b/src/lib/screen_kdm.h
deleted file mode 100644
index a1e36245c..000000000
--- a/src/lib/screen_kdm.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- Copyright (C) 2013-2019 Carl Hetherington <cth@carlh.net>
-
- This file is part of DCP-o-matic.
-
- DCP-o-matic is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- DCP-o-matic is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with DCP-o-matic. If not, see <http://www.gnu.org/licenses/>.
-
-*/
-
-#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>
-
-namespace dcpomatic {
- class Screen;
-}
-
-/** Simple class to collect a screen and an encrypted KDM */
-class ScreenKDM
-{
-public:
- ScreenKDM (boost::shared_ptr<dcpomatic::Screen> s)
- : screen (s)
- {}
-
- virtual ~ScreenKDM () {}
-
- 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<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;
-};
-
-#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/send_kdm_email_job.cc b/src/lib/send_kdm_email_job.cc
index 1b476fa63..55a171811 100644
--- a/src/lib/send_kdm_email_job.cc
+++ b/src/lib/send_kdm_email_job.cc
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2013 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2013-2020 Carl Hetherington <cth@carlh.net>
This file is part of DCP-o-matic.
@@ -20,8 +20,8 @@
#include "send_kdm_email_job.h"
#include "compose.hpp"
+#include "kdm_with_metadata.h"
#include "film.h"
-#include "cinema_kdms.h"
#include <list>
#include "i18n.h"
@@ -29,26 +29,43 @@
using std::string;
using std::list;
using boost::shared_ptr;
+using boost::optional;
-/** @param cinema_kdms KDMs to email.
+SendKDMEmailJob::SendKDMEmailJob (
+ list<KDMWithMetadataPtr> kdms,
+ dcp::NameFormat container_name_format,
+ dcp::NameFormat filename_format,
+ string cpl_name
+ )
+ : Job (shared_ptr<Film>())
+ , _container_name_format (container_name_format)
+ , _filename_format (filename_format)
+ , _cpl_name (cpl_name)
+{
+ BOOST_FOREACH (KDMWithMetadataPtr i, kdms) {
+ list<KDMWithMetadataPtr> s;
+ s.push_back (i);
+ _kdms.push_back (s);
+ }
+}
+
+/** @param kdms KDMs to email.
* @param container_name_format Format to ues for folders / ZIP files.
* @param filename_format Format to use for filenames.
* @param name_values Values to substitute into \p container_name_format and \p filename_format.
* @param cpl_name Name of the CPL that the KDMs are for.
*/
SendKDMEmailJob::SendKDMEmailJob (
- list<CinemaKDMs> cinema_kdms,
+ list<list<KDMWithMetadataPtr> > kdms,
dcp::NameFormat container_name_format,
dcp::NameFormat filename_format,
- dcp::NameFormat::Map name_values,
string cpl_name
)
: Job (shared_ptr<Film>())
, _container_name_format (container_name_format)
, _filename_format (filename_format)
- , _name_values (name_values)
, _cpl_name (cpl_name)
- , _cinema_kdms (cinema_kdms)
+ , _kdms (kdms)
{
}
@@ -61,12 +78,12 @@ SendKDMEmailJob::~SendKDMEmailJob ()
string
SendKDMEmailJob::name () const
{
- dcp::NameFormat::Map::const_iterator i = _name_values.find ('f');
- if (i == _name_values.end() || i->second.empty ()) {
+ optional<string> f = _kdms.front().front()->get('f');
+ if (!f || f->empty()) {
return _("Email KDMs");
}
- return String::compose (_("Email KDMs for %1"), i->second);
+ return String::compose (_("Email KDMs for %2"), *f);
}
string
@@ -79,7 +96,7 @@ void
SendKDMEmailJob::run ()
{
set_progress_unknown ();
- CinemaKDMs::email (_cinema_kdms, _container_name_format, _filename_format, _name_values, _cpl_name);
+ email (_kdms, _container_name_format, _filename_format, _cpl_name);
set_progress (1);
set_state (FINISHED_OK);
}
diff --git a/src/lib/send_kdm_email_job.h b/src/lib/send_kdm_email_job.h
index a7196fe15..fa409edaa 100644
--- a/src/lib/send_kdm_email_job.h
+++ b/src/lib/send_kdm_email_job.h
@@ -19,6 +19,7 @@
*/
#include "job.h"
+#include "kdm_with_metadata.h"
#include <dcp/types.h>
#include <dcp/name_format.h>
#include <boost/filesystem.hpp>
@@ -27,19 +28,25 @@ namespace dcpomatic {
class Screen;
}
-class CinemaKDMs;
class Log;
class SendKDMEmailJob : public Job
{
public:
SendKDMEmailJob (
- std::list<CinemaKDMs> cinema_kdms,
+ std::list<KDMWithMetadataPtr> kdms,
dcp::NameFormat container_name_format,
dcp::NameFormat filename_format,
- dcp::NameFormat::Map name_values,
std::string cpl_name
);
+
+ SendKDMEmailJob (
+ std::list<std::list<KDMWithMetadataPtr> > kdms,
+ dcp::NameFormat container_name_format,
+ dcp::NameFormat filename_format,
+ std::string cpl_name
+ );
+
~SendKDMEmailJob ();
std::string name () const;
@@ -49,7 +56,6 @@ public:
private:
dcp::NameFormat _container_name_format;
dcp::NameFormat _filename_format;
- dcp::NameFormat::Map _name_values;
std::string _cpl_name;
- std::list<CinemaKDMs> _cinema_kdms;
+ std::list<std::list<KDMWithMetadataPtr> > _kdms;
};
diff --git a/src/lib/trusted_device.cc b/src/lib/trusted_device.cc
new file mode 100644
index 000000000..5849b8fd2
--- /dev/null
+++ b/src/lib/trusted_device.cc
@@ -0,0 +1,56 @@
+/*
+ Copyright (C) 2013-2016 Carl Hetherington <cth@carlh.net>
+
+ This file is part of DCP-o-matic.
+
+ DCP-o-matic is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ DCP-o-matic is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with DCP-o-matic. If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+#include "trusted_device.h"
+
+using std::string;
+
+TrustedDevice::TrustedDevice (string thumbprint)
+ : _thumbprint (thumbprint)
+{
+
+}
+
+TrustedDevice::TrustedDevice (dcp::Certificate certificate)
+ : _certificate (certificate)
+{
+
+}
+
+string
+TrustedDevice::as_string () const
+{
+ if (_certificate) {
+ return _certificate->certificate(true);
+ }
+
+ return *_thumbprint;
+}
+
+string
+TrustedDevice::thumbprint () const
+{
+ if (_certificate) {
+ return _certificate->thumbprint ();
+ }
+
+ return *_thumbprint;
+}
+
diff --git a/src/lib/trusted_device.h b/src/lib/trusted_device.h
new file mode 100644
index 000000000..7c6af3ea8
--- /dev/null
+++ b/src/lib/trusted_device.h
@@ -0,0 +1,46 @@
+/*
+ Copyright (C) 2013-2019 Carl Hetherington <cth@carlh.net>
+
+ This file is part of DCP-o-matic.
+
+ DCP-o-matic is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ DCP-o-matic is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with DCP-o-matic. If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+#ifndef DCPOMATIC_TRUSTED_DEVICE_H
+#define DCPOMATIC_TRUSTED_DEVICE_H
+
+#include <dcp/certificate.h>
+#include <boost/optional.hpp>
+#include <string>
+
+class TrustedDevice
+{
+public:
+ explicit TrustedDevice (std::string);
+ explicit TrustedDevice (dcp::Certificate);
+
+ boost::optional<dcp::Certificate> certificate () const {
+ return _certificate;
+ }
+
+ std::string thumbprint () const;
+ std::string as_string () const;
+
+private:
+ boost::optional<dcp::Certificate> _certificate;
+ boost::optional<std::string> _thumbprint;
+};
+
+#endif
diff --git a/src/lib/wscript b/src/lib/wscript
index ea52079d0..0f2a5d197 100644
--- a/src/lib/wscript
+++ b/src/lib/wscript
@@ -47,7 +47,6 @@ sources = """
checker.cc
check_content_change_job.cc
cinema.cc
- cinema_kdms.cc
cinema_sound_processor.cc
colour_conversion.cc
config.cc
@@ -78,6 +77,7 @@ sources = """
decoder_part.cc
decrypted_ecinema_kdm.cc
digester.cc
+ dkdm_recipient.cc
dkdm_wrapper.cc
dolby_cp750.cc
edid.cc
@@ -125,6 +125,8 @@ sources = """
job_manager.cc
j2k_encoder.cc
json_server.cc
+ kdm_with_metadata.cc
+ kdm_recipient.cc
lock_file_checker.cc
log.cc
log_entry.cc
@@ -145,7 +147,6 @@ sources = """
scoped_temporary.cc
scp_uploader.cc
screen.cc
- screen_kdm.cc
send_kdm_email_job.cc
send_notification_email_job.cc
send_problem_report_job.cc
@@ -163,6 +164,7 @@ sources = """
text_ring_buffers.cc
timer.cc
transcode_job.cc
+ trusted_device.cc
types.cc
signal_manager.cc
stdout_log.cc