Cleanup: replace some list with vector.
[dcpomatic.git] / src / lib / screen.cc
index fe62a5e6cdd9841394e03760601aea466f80065c..097ff80b8bfbc77cf6358ffdc081e66213b7332b 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2013-2016 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2013-2021 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
 
 */
 
+
+#include "cinema.h"
+#include "config.h"
+#include "film.h"
+#include "kdm_util.h"
+#include "kdm_with_metadata.h"
 #include "screen.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::list;
+using std::make_shared;
+using std::shared_ptr;
 using std::string;
 using std::vector;
+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")) {
+       for (auto i: node->node_children ("TrustedDevice")) {
                if (boost::algorithm::starts_with(i->content(), "-----BEGIN CERTIFICATE-----")) {
                        trusted_devices.push_back (TrustedDevice(dcp::Certificate(i->content())));
                } else {
@@ -46,59 +51,71 @@ 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);
-
-       BOOST_FOREACH (TrustedDevice i, trusted_devices) {
+       KDMRecipient::as_xml (parent);
+       for (auto i: trusted_devices) {
                parent->add_child("TrustedDevice")->add_child_text(i.as_string());
        }
 }
 
+
 vector<string>
 Screen::trusted_device_thumbprints () const
 {
        vector<string> t;
-       BOOST_FOREACH (TrustedDevice i, trusted_devices) {
+       for (auto i: trusted_devices) {
                t.push_back (i.thumbprint());
        }
        return t;
 }
 
-TrustedDevice::TrustedDevice (string thumbprint)
-       : _thumbprint (thumbprint)
-{
-
-}
 
-TrustedDevice::TrustedDevice (dcp::Certificate certificate)
-       : _certificate (certificate)
+KDMWithMetadataPtr
+kdm_for_screen (
+       std::function<dcp::DecryptedKDM (dcp::LocalTime, dcp::LocalTime)> make_kdm,
+       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,
+       vector<KDMCertificatePeriod>& period_checks
+       )
 {
+       if (!screen->recipient) {
+               return {};
+       }
 
-}
+       auto cinema = screen->cinema;
+       dcp::LocalTime const begin(valid_from, dcp::UTCOffset(cinema ? cinema->utc_offset_hour() : 0, cinema ? cinema->utc_offset_minute() : 0));
+       dcp::LocalTime const end  (valid_to,   dcp::UTCOffset(cinema ? cinema->utc_offset_hour() : 0, cinema ? cinema->utc_offset_minute() : 0));
 
-string
-TrustedDevice::as_string () const
-{
-       if (_certificate) {
-               return _certificate->certificate(true);
+       period_checks.push_back(check_kdm_and_certificate_validity_periods(screen->recipient.get(), begin, end));
+
+       auto signer = Config::instance()->signer_chain();
+       if (!signer->valid()) {
+               throw InvalidSignerError();
        }
 
-       return *_thumbprint;
-}
+       auto kdm = make_kdm(begin, end).encrypt(
+               signer, screen->recipient.get(), screen->trusted_device_thumbprints(), formulation, disable_forensic_marking_picture, disable_forensic_marking_audio
+               );
 
-string
-TrustedDevice::thumbprint () const
-{
-       if (_certificate) {
-               return _certificate->thumbprint ();
+       dcp::NameFormat::Map name_values;
+       if (cinema) {
+               name_values['c'] = cinema->name;
+       } else {
+               name_values['c'] = "";
        }
+       name_values['s'] = screen->name;
+       name_values['f'] = kdm.content_title_text();
+       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 make_shared<KDMWithMetadata>(name_values, cinema.get(), cinema ? cinema->emails : vector<string>(), kdm);
 }
+