Replace %c with nothing in KDM filenames if the cinema is not known.
[dcpomatic.git] / src / lib / screen.cc
index 6323708101b6b0ff9f20748d18fc651593c68ba1..21d7ebf2566bccad3185601eb5325aed8c439a74 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2013-2020 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2013-2021 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
 
 */
 
+
 #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::list;
+using std::make_shared;
+using std::shared_ptr;
 using std::string;
 using std::vector;
-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")) {
+       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 {
@@ -52,63 +49,27 @@ 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)
-{
-
-}
-
-string
-TrustedDevice::as_string () const
-{
-       if (_certificate) {
-               return _certificate->certificate(true);
-       }
-
-       return *_thumbprint;
-}
-
-string
-TrustedDevice::thumbprint () const
-{
-       if (_certificate) {
-               return _certificate->thumbprint ();
-       }
-
-       return *_thumbprint;
-}
-
 
 KDMWithMetadataPtr
 kdm_for_screen (
@@ -123,14 +84,14 @@ kdm_for_screen (
        )
 {
        if (!screen->recipient) {
-               return KDMWithMetadataPtr();
+               return {};
        }
 
-       shared_ptr<const Cinema> cinema = screen->cinema;
+       auto 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 (
+       auto const kdm = film->make_kdm (
                        screen->recipient.get(),
                        screen->trusted_device_thumbprints(),
                        cpl,
@@ -144,6 +105,8 @@ kdm_for_screen (
        dcp::NameFormat::Map name_values;
        if (cinema) {
                name_values['c'] = cinema->name;
+       } else {
+               name_values['c'] = "";
        }
        name_values['s'] = screen->name;
        name_values['f'] = film->name();
@@ -151,6 +114,6 @@ kdm_for_screen (
        name_values['e'] = end.date() + " " + end.time_of_day(true, false);
        name_values['i'] = kdm.cpl_id();
 
-       return KDMWithMetadataPtr(new DCPKDMWithMetadata(name_values, cinema, kdm));
+       return make_shared<KDMWithMetadata>(name_values, cinema.get(), cinema ? cinema->emails : list<string>(), kdm);
 }