Replace slightly weird add_font_assets() API.
[libdcp.git] / src / combine.cc
index 0e262fce064ef16131094f4561bd5fd8e9f74e3e..b728298ad2f3ba2c9f45cb587a6b2fc8f84b83bc 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2020 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2020-2021 Carl Hetherington <cth@carlh.net>
 
     This file is part of libdcp.
 
 */
 
 
+/** @file  src/combine.cc
+ *  @brief Method to combine DCPs
+ */
+
+
 #include "asset.h"
 #include "combine.h"
 #include "cpl.h"
 #include "interop_subtitle_asset.h"
 #include "raw_convert.h"
 #include <boost/filesystem.hpp>
-#include <boost/foreach.hpp>
 #include <set>
 #include <string>
 #include <vector>
 
 
-using std::list;
 using std::map;
 using std::set;
 using std::string;
 using std::vector;
-using boost::dynamic_pointer_cast;
+using std::dynamic_pointer_cast;
 using boost::optional;
-using boost::shared_ptr;
+using std::shared_ptr;
 
 
 boost::filesystem::path
@@ -94,7 +97,15 @@ create_hard_link_or_copy (boost::filesystem::path from, boost::filesystem::path
 
 
 void
-dcp::combine (vector<boost::filesystem::path> inputs, boost::filesystem::path output, shared_ptr<const CertificateChain> signer)
+dcp::combine (
+       vector<boost::filesystem::path> inputs,
+       boost::filesystem::path output,
+       string issuer,
+       string creator,
+       string issue_date,
+       string annotation_text,
+       shared_ptr<const CertificateChain> signer
+       )
 {
        using namespace boost::filesystem;
 
@@ -103,7 +114,7 @@ dcp::combine (vector<boost::filesystem::path> inputs, boost::filesystem::path ou
        DCP output_dcp (output);
        optional<dcp::Standard> standard;
 
-       BOOST_FOREACH (path i, inputs) {
+       for (auto i: inputs) {
                DCP dcp (i);
                dcp.read ();
                if (!standard) {
@@ -113,47 +124,38 @@ dcp::combine (vector<boost::filesystem::path> inputs, boost::filesystem::path ou
                }
        }
 
-       list<path> paths;
-       list<shared_ptr<dcp::Asset> > assets;
+       vector<path> paths;
+       vector<shared_ptr<dcp::Asset>> assets;
 
-       BOOST_FOREACH (path i, inputs) {
+       for (auto i: inputs) {
                DCP dcp (i);
                dcp.read ();
 
-               BOOST_FOREACH (shared_ptr<dcp::CPL> j, dcp.cpls()) {
+               for (auto j: dcp.cpls()) {
                        output_dcp.add (j);
                }
 
-               BOOST_FOREACH (shared_ptr<dcp::Asset> j, dcp.assets(true)) {
+               for (auto j: dcp.assets(true)) {
                        if (dynamic_pointer_cast<dcp::CPL>(j)) {
                                continue;
                        }
 
-                       optional<path> file = j->file();
-                       DCP_ASSERT (file);
-                       path new_path = make_unique(output / file->filename());
-
-                       shared_ptr<dcp::InteropSubtitleAsset> sub = dynamic_pointer_cast<dcp::InteropSubtitleAsset>(j);
+                       auto sub = dynamic_pointer_cast<dcp::InteropSubtitleAsset>(j);
                        if (sub) {
                                /* Interop fonts are really fiddly.  The font files are assets (in the ASSETMAP)
                                 * and also linked from the font XML by filename.  We have to fix both these things,
                                 * and re-write the font XML file since the font URI might have changed if it's a duplicate
                                 * with another DCP.
                                 */
-                               map<string, path> fonts = sub->font_filenames ();
-                               for (map<string, path>::const_iterator k = fonts.begin(); k != fonts.end(); ++k) {
-                                       sub->set_font_file (k->first, make_unique(output / k->second.filename()));
+                               auto fonts = sub->font_filenames ();
+                               for (auto const& k: fonts) {
+                                       sub->set_font_file (k.first, make_unique(output / k.second.filename()));
                                }
-                               sub->write (new_path);
-                       } else if (!dynamic_pointer_cast<dcp::FontAsset>(j)) {
-                               /* Take care of everything else that's not a Interop subtitle asset, Interop font file
-                                * or CPL.
-                                */
-                               optional<path> file = j->file();
+                               auto file = sub->file();
                                DCP_ASSERT (file);
                                path new_path = make_unique(output / file->filename());
-                               create_hard_link_or_copy (*file, new_path);
-                               j->set_file (new_path);
+                               sub->write (new_path);
+                               add_to_container(assets, sub->font_assets());
                        }
 
                        assets.push_back (j);
@@ -161,5 +163,21 @@ dcp::combine (vector<boost::filesystem::path> inputs, boost::filesystem::path ou
        }
 
        output_dcp.resolve_refs (assets);
-       output_dcp.write_xml (*standard, dcp::XMLMetadata(), signer);
+
+       for (auto i: output_dcp.assets()) {
+               if (!dynamic_pointer_cast<dcp::FontAsset>(i) && !dynamic_pointer_cast<dcp::CPL>(i)) {
+                       auto file = i->file();
+                       DCP_ASSERT (file);
+                       path new_path = make_unique(output / file->filename());
+                       create_hard_link_or_copy (*file, new_path);
+                       i->set_file (new_path);
+               }
+       }
+
+       output_dcp.set_issuer(issuer);
+       output_dcp.set_creator(creator);
+       output_dcp.set_issue_date(issue_date);
+       output_dcp.set_annotation_text(annotation_text);
+
+       output_dcp.write_xml(signer);
 }