Stop using XMLMetadata in CPL. It's always felt a bit clumsy, and
authorCarl Hetherington <cth@carlh.net>
Wed, 19 Aug 2020 14:36:09 +0000 (16:36 +0200)
committerCarl Hetherington <cth@carlh.net>
Sun, 20 Sep 2020 17:27:16 +0000 (19:27 +0200)
with the CPL metadata extension having a method like set_metadata()
in CPL will be confusing.

src/cpl.cc
src/cpl.h
test/dcp_test.cc
test/encryption_test.cc
test/write_subtitle_test.cc

index fe032f214defd9ac00047e8614624de61556b21e..4e6bacc94a69c97cbfb22e1569cf89202eb33bb9 100644 (file)
@@ -64,10 +64,13 @@ static string const cpl_smpte_ns   = "http://www.smpte-ra.org/schemas/429-7/2006
 
 CPL::CPL (string annotation_text, ContentKind content_kind)
        /* default _content_title_text to annotation_text */
-       : _content_title_text (annotation_text)
+       : _issuer ("libdcp" LIBDCP_VERSION)
+       , _creator ("libdcp" LIBDCP_VERSION)
+       , _issue_date (LocalTime().as_string())
+       , _annotation_text (annotation_text)
+       , _content_title_text (annotation_text)
        , _content_kind (content_kind)
 {
-       _metadata.annotation_text = annotation_text;
        /* default _content_version_id to a random ID and _content_version_label to
           a random ID and the current time.
        */
@@ -93,10 +96,10 @@ CPL::CPL (boost::filesystem::path file)
        }
 
        _id = remove_urn_uuid (f.string_child ("Id"));
-       _metadata.annotation_text = f.optional_string_child ("AnnotationText").get_value_or ("");
-       _metadata.issuer = f.optional_string_child ("Issuer").get_value_or ("");
-       _metadata.creator = f.optional_string_child ("Creator").get_value_or ("");
-       _metadata.issue_date = f.string_child ("IssueDate");
+       _annotation_text = f.optional_string_child("AnnotationText").get_value_or("");
+       _issuer = f.optional_string_child("Issuer").get_value_or("");
+       _creator = f.optional_string_child("Creator").get_value_or("");
+       _issue_date = f.string_child ("IssueDate");
        _content_title_text = f.string_child ("ContentTitleText");
        _content_kind = content_kind_from_string (f.string_child ("ContentKind"));
        shared_ptr<cxml::Node> content_version = f.optional_node_child ("ContentVersion");
@@ -149,10 +152,10 @@ CPL::write_xml (boost::filesystem::path file, Standard standard, shared_ptr<cons
        }
 
        root->add_child("Id")->add_child_text ("urn:uuid:" + _id);
-       root->add_child("AnnotationText")->add_child_text (_metadata.annotation_text);
-       root->add_child("IssueDate")->add_child_text (_metadata.issue_date);
-       root->add_child("Issuer")->add_child_text (_metadata.issuer);
-       root->add_child("Creator")->add_child_text (_metadata.creator);
+       root->add_child("AnnotationText")->add_child_text (_annotation_text);
+       root->add_child("IssueDate")->add_child_text (_issue_date);
+       root->add_child("Issuer")->add_child_text (_issuer);
+       root->add_child("Creator")->add_child_text (_creator);
        root->add_child("ContentTitleText")->add_child_text (_content_title_text);
        root->add_child("ContentKind")->add_child_text (content_kind_to_string (_content_kind));
        {
@@ -242,8 +245,8 @@ CPL::equals (shared_ptr<const Asset> other, EqualityOptions opt, NoteHandler not
                return false;
        }
 
-       if (_metadata.annotation_text != other_cpl->_metadata.annotation_text && !opt.cpl_annotation_texts_can_differ) {
-               string const s = "CPL: annotation texts differ: " + _metadata.annotation_text + " vs " + other_cpl->_metadata.annotation_text + "\n";
+       if (_annotation_text != other_cpl->_annotation_text && !opt.cpl_annotation_texts_can_differ) {
+               string const s = "CPL: annotation texts differ: " + _annotation_text + " vs " + other_cpl->_annotation_text + "\n";
                note (DCP_ERROR, s);
                return false;
        }
index 8095108860847d29592d0d915d19a82e94078239..eebb3aaf06d99fe5e3f13dbc1128c3057110e6dd 100644 (file)
--- a/src/cpl.h
+++ b/src/cpl.h
@@ -42,7 +42,6 @@
 #include "certificate.h"
 #include "key.h"
 #include "asset.h"
-#include "metadata.h"
 #include <boost/shared_ptr.hpp>
 #include <boost/function.hpp>
 #include <boost/optional.hpp>
@@ -53,7 +52,6 @@ namespace dcp {
 
 class ReelMXF;
 class Reel;
-class XMLMetadata;
 class MXFMetadata;
 class CertificateChain;
 class DecryptedKDM;
@@ -78,11 +76,23 @@ public:
 
        /** @return contents of the &lt;AnnotationText&gt; node */
        std::string annotation_text () const {
-               return _metadata.annotation_text;
+               return _annotation_text;
+       }
+
+       void set_issuer (std::string issuer) {
+               _issuer = issuer;
+       }
+
+       void set_creator (std::string creator) {
+               _creator = creator;
+       }
+
+       void set_issue_date (std::string issue_date) {
+               _issue_date = issue_date;
        }
 
        void set_annotation_text (std::string at) {
-               _metadata.annotation_text = at;
+               _annotation_text = at;
        }
 
        /** @return contents of the &lt;ContentTitleText&gt; node */
@@ -123,10 +133,6 @@ public:
 
        bool encrypted () const;
 
-       void set_metadata (XMLMetadata m) {
-               _metadata = m;
-       }
-
        void write_xml (
                boost::filesystem::path file,
                Standard standard,
@@ -160,10 +166,10 @@ protected:
        std::string pkl_type (Standard standard) const;
 
 private:
-       /** &lt;Issuer&gt;, &lt;Creator&gt;, &lt;IssueDate&gt; and &lt;AnnotationText&gt.
-        *  These are grouped because they occur together in a few places.
-        */
-       XMLMetadata _metadata;
+       std::string _issuer;
+       std::string _creator;
+       std::string _issue_date;
+       std::string _annotation_text;
        std::string _content_title_text;            ///< &lt;ContentTitleText&gt;
        ContentKind _content_kind;                  ///< &lt;ContentKind&gt;
        std::string _content_version_id;            ///< &lt;Id&gt; in &lt;ContentVersion&gt;
index 4ac924e086bf3af1c017124eecbe15e00ca75721..30c5ca3043bee7adec913ce6ddec826a6fcc2421 100644 (file)
@@ -92,7 +92,10 @@ BOOST_AUTO_TEST_CASE (dcp_test2)
        shared_ptr<dcp::CPL> cpl (new dcp::CPL ("A Test DCP", dcp::FEATURE));
        cpl->set_content_version_id ("urn:uri:81fb54df-e1bf-4647-8788-ea7ba154375b_2012-07-17T04:45:18+00:00");
        cpl->set_content_version_label_text ("81fb54df-e1bf-4647-8788-ea7ba154375b_2012-07-17T04:45:18+00:00");
-       cpl->set_metadata (xml_meta);
+       cpl->set_issuer (xml_meta.issuer);
+       cpl->set_creator (xml_meta.creator);
+       cpl->set_issue_date (xml_meta.issue_date);
+       cpl->set_annotation_text (xml_meta.annotation_text);
 
        shared_ptr<dcp::StereoPictureAsset> mp (new dcp::StereoPictureAsset (dcp::Fraction (24, 1), dcp::SMPTE));
        mp->set_metadata (mxf_meta);
@@ -193,7 +196,10 @@ BOOST_AUTO_TEST_CASE (dcp_test5)
        shared_ptr<dcp::CPL> cpl (new dcp::CPL ("A Test DCP", dcp::FEATURE));
        cpl->set_content_version_id ("urn:uri:81fb54df-e1bf-4647-8788-ea7ba154375b_2012-07-17T04:45:18+00:00");
        cpl->set_content_version_label_text ("81fb54df-e1bf-4647-8788-ea7ba154375b_2012-07-17T04:45:18+00:00");
-       cpl->set_metadata (xml_meta);
+       cpl->set_issuer (xml_meta.issuer);
+       cpl->set_creator (xml_meta.creator);
+       cpl->set_issue_date (xml_meta.issue_date);
+       cpl->set_annotation_text (xml_meta.annotation_text);
 
        shared_ptr<dcp::MonoPictureAsset> mp (new dcp::MonoPictureAsset (dcp::Fraction (24, 1), dcp::SMPTE));
        mp->set_metadata (mxf_meta);
index 2af802704c6e542a9b1be079102c8329e0643333..4b9e525e44fd285982d276ad1e98091b007bc3d4 100644 (file)
@@ -133,7 +133,10 @@ BOOST_AUTO_TEST_CASE (encryption_test)
                                                 )));
        cpl->set_content_version_id ("urn:uri:81fb54df-e1bf-4647-8788-ea7ba154375b_2012-07-17T04:45:18+00:00");
        cpl->set_content_version_label_text ("81fb54df-e1bf-4647-8788-ea7ba154375b_2012-07-17T04:45:18+00:00");
-       cpl->set_metadata (xml_metadata);
+       cpl->set_issuer (xml_metadata.issuer);
+       cpl->set_creator (xml_metadata.creator);
+       cpl->set_issue_date (xml_metadata.issue_date);
+       cpl->set_annotation_text (xml_metadata.annotation_text);
 
        d.add (cpl);
 
index dd51d91928d3c99bb43d5886f1fc08c346eab07b..266a1039ca3848d5e8eddd4c950813185b3dc8d5 100644 (file)
@@ -369,7 +369,10 @@ BOOST_AUTO_TEST_CASE (write_interop_subtitle_test3)
 
        shared_ptr<dcp::CPL> cpl (new dcp::CPL ("My film", dcp::FEATURE));
        cpl->add (reel);
-       cpl->set_metadata (xml_meta);
+       cpl->set_issuer (xml_meta.issuer);
+       cpl->set_creator (xml_meta.creator);
+       cpl->set_issue_date (xml_meta.issue_date);
+       cpl->set_annotation_text (xml_meta.annotation_text);
        cpl->set_content_version_label_text ("foo");
 
        dcp::DCP dcp ("build/test/write_interop_subtitle_test3");