Remove all use of add_child() from xmlpp.
authorCarl Hetherington <cth@carlh.net>
Tue, 6 Feb 2024 09:58:39 +0000 (10:58 +0100)
committerCarl Hetherington <cth@carlh.net>
Wed, 20 Mar 2024 17:25:09 +0000 (18:25 +0100)
74 files changed:
cscript
src/lib/analytics.cc
src/lib/atmos_content.cc
src/lib/atmos_content.h
src/lib/atmos_mxf_content.cc
src/lib/atmos_mxf_content.h
src/lib/audio_analysis.cc
src/lib/audio_content.cc
src/lib/audio_content.h
src/lib/audio_mapping.cc
src/lib/audio_mapping.h
src/lib/audio_point.cc
src/lib/cinema.cc
src/lib/colour_conversion.cc
src/lib/colour_conversion.h
src/lib/config.cc
src/lib/content.cc
src/lib/content.h
src/lib/crop.cc
src/lib/crop.h
src/lib/cross_common.cc
src/lib/dcp_content.cc
src/lib/dcp_content.h
src/lib/dcp_digest_file.cc
src/lib/dcp_subtitle_content.cc
src/lib/dcp_subtitle_content.h
src/lib/dcp_text_track.cc
src/lib/dcp_video.cc
src/lib/dkdm_recipient.cc
src/lib/dkdm_wrapper.cc
src/lib/encode_server.cc
src/lib/export_config.cc
src/lib/export_config.h
src/lib/ffmpeg_audio_stream.cc
src/lib/ffmpeg_audio_stream.h
src/lib/ffmpeg_content.cc
src/lib/ffmpeg_content.h
src/lib/ffmpeg_image_proxy.cc
src/lib/ffmpeg_image_proxy.h
src/lib/ffmpeg_stream.cc
src/lib/ffmpeg_stream.h
src/lib/ffmpeg_subtitle_stream.cc
src/lib/ffmpeg_subtitle_stream.h
src/lib/film.cc
src/lib/font.cc
src/lib/font.h
src/lib/image_content.cc
src/lib/image_content.h
src/lib/image_proxy.h
src/lib/j2k_image_proxy.cc
src/lib/j2k_image_proxy.h
src/lib/kdm_recipient.cc
src/lib/pixel_quanta.cc
src/lib/player_video.cc
src/lib/player_video.h
src/lib/playlist.cc
src/lib/playlist.h
src/lib/raw_image_proxy.cc
src/lib/raw_image_proxy.h
src/lib/rgba.cc
src/lib/rgba.h
src/lib/screen.cc
src/lib/spl.cc
src/lib/spl_entry.cc
src/lib/string_text_file_content.cc
src/lib/string_text_file_content.h
src/lib/subtitle_analysis.cc
src/lib/text_content.cc
src/lib/text_content.h
src/lib/video_content.cc
src/lib/video_content.h
src/lib/video_mxf_content.cc
src/lib/video_mxf_content.h
test/stream_test.cc

diff --git a/cscript b/cscript
index c2aec07302ad9eb9483ae5b8f411496156b4f231..6f1f5c663f9b938bc787b931a8e6abfa5c2c1c15 100644 (file)
--- a/cscript
+++ b/cscript
@@ -534,7 +534,7 @@ def dependencies(target, options):
         # Use distro-provided FFmpeg on Arch
         deps = []
 
-    deps.append(('libdcp', 'v1.9.1'))
+    deps.append(('libdcp', 'v1.9.2', {'c++17': target.platform == 'osx'}))
     deps.append(('libsub', 'v1.6.47'))
     deps.append(('leqm-nrt', '30dcaea1373ac62fba050e02ce5b0c1085797a23'))
     deps.append(('rtaudio', 'f619b76'))
index 836051fe59616756482acf6003ba4539226e90a9..3fce7974923d639be1890d678848d8442cc5ab72 100644 (file)
@@ -93,8 +93,8 @@ Analytics::write () const
        xmlpp::Document doc;
        auto root = doc.create_root_node ("Analytics");
 
-       root->add_child("Version")->add_child_text(raw_convert<string>(_current_version));
-       root->add_child("SuccessfulDCPEncodes")->add_child_text(raw_convert<string>(_successful_dcp_encodes));
+       cxml::add_text_child(root, "Version", raw_convert<string>(_current_version));
+       cxml::add_text_child(root, "SuccessfulDCPEncodes", raw_convert<string>(_successful_dcp_encodes));
 
        try {
                doc.write_to_file_formatted(write_path("analytics.xml").string());
index ada304dad1c698d5d167230b1f7b42ccbb6dc0ee..22bd431a22fe9e7102de2b67cadab94516d24dbe 100644 (file)
@@ -63,10 +63,10 @@ AtmosContent::from_xml (Content* parent, cxml::ConstNodePtr node)
 
 
 void
-AtmosContent::as_xml (xmlpp::Node* node) const
+AtmosContent::as_xml(xmlpp::Element* element) const
 {
-       node->add_child("AtmosLength")->add_child_text(dcp::raw_convert<string>(_length));
-       node->add_child("AtmosEditRate")->add_child_text(_edit_rate.as_string());
+       cxml::add_text_child(element, "AtmosLength", dcp::raw_convert<string>(_length));
+       cxml::add_text_child(element, "AtmosEditRate", _edit_rate.as_string());
 }
 
 
index afa3c75a2770cd160250bb7fca673b718483ad05..ffa1814972240b17a69079e081033f0a03fe3a99 100644 (file)
@@ -42,7 +42,7 @@ public:
 
        static std::shared_ptr<AtmosContent> from_xml (Content* parent, cxml::ConstNodePtr node);
 
-       void as_xml (xmlpp::Node* node) const;
+       void as_xml(xmlpp::Element* element) const;
 
        void set_length (Frame len);
 
index 82c20e88f7bd8e7c723e49216b1d4aeeabe3bc4d..1283961ee121ad5ad4e5466500c69106475e7ae7 100644 (file)
@@ -98,11 +98,11 @@ AtmosMXFContent::summary () const
 
 
 void
-AtmosMXFContent::as_xml (xmlpp::Node* node, bool with_paths) const
+AtmosMXFContent::as_xml(xmlpp::Element* element, bool with_paths) const
 {
-       node->add_child("Type")->add_child_text("AtmosMXF");
-       Content::as_xml (node, with_paths);
-       atmos->as_xml (node);
+       cxml::add_text_child(element, "Type", "AtmosMXF");
+       Content::as_xml(element, with_paths);
+       atmos->as_xml(element);
 }
 
 
index 57f041774c1b3776926545b7b77c025c2c872c33..e6225a3556fec632c6bf919b9ecf3454348d4ceb 100644 (file)
@@ -39,7 +39,7 @@ public:
 
        void examine (std::shared_ptr<const Film> film, std::shared_ptr<Job> job) override;
        std::string summary () const override;
-       void as_xml (xmlpp::Node* node, bool with_path) const override;
+       void as_xml(xmlpp::Element* element, bool with_path) const override;
        dcpomatic::DCPTime full_length (std::shared_ptr<const Film> film) const override;
        dcpomatic::DCPTime approximate_length () const override;
 
index c50a2bb9db525b61c6c1b2d1c90c785618204077..ac990ee18f13e3488a4cbef06456458e31371416 100644 (file)
@@ -138,44 +138,44 @@ void
 AudioAnalysis::write (boost::filesystem::path filename)
 {
        auto doc = make_shared<xmlpp::Document>();
-       xmlpp::Element* root = doc->create_root_node ("AudioAnalysis");
+       auto root = doc->create_root_node("AudioAnalysis");
 
-       root->add_child("Version")->add_child_text(raw_convert<string>(_current_state_version));
+       cxml::add_text_child(root, "Version", raw_convert<string>(_current_state_version));
 
        for (auto& i: _data) {
-               auto channel = root->add_child ("Channel");
+               auto channel = cxml::add_child(root, "Channel");
                for (auto& j: i) {
-                       j.as_xml (channel->add_child ("Point"));
+                       j.as_xml(cxml::add_child(channel, "Point"));
                }
        }
 
        for (size_t i = 0; i < _sample_peak.size(); ++i) {
-               auto n = root->add_child("SamplePeak");
+               auto n = cxml::add_child(root, "SamplePeak");
                n->add_child_text (raw_convert<string> (_sample_peak[i].peak));
                n->set_attribute("time", raw_convert<string> (_sample_peak[i].time.get()));
        }
 
        for (auto i: _true_peak) {
-               root->add_child("TruePeak")->add_child_text (raw_convert<string> (i));
+               cxml::add_text_child(root, "TruePeak", raw_convert<string>(i));
        }
 
        if (_integrated_loudness) {
-               root->add_child("IntegratedLoudness")->add_child_text (raw_convert<string> (_integrated_loudness.get ()));
+               cxml::add_text_child(root, "IntegratedLoudness", raw_convert<string>(_integrated_loudness.get()));
        }
 
        if (_loudness_range) {
-               root->add_child("LoudnessRange")->add_child_text (raw_convert<string> (_loudness_range.get ()));
+               cxml::add_text_child(root, "LoudnessRange", raw_convert<string>(_loudness_range.get()));
        }
 
        if (_analysis_gain) {
-               root->add_child("AnalysisGain")->add_child_text (raw_convert<string> (_analysis_gain.get ()));
+               cxml::add_text_child(root, "AnalysisGain", raw_convert<string>(_analysis_gain.get()));
        }
 
-       root->add_child("SamplesPerPoint")->add_child_text (raw_convert<string> (_samples_per_point));
-       root->add_child("SampleRate")->add_child_text (raw_convert<string> (_sample_rate));
+       cxml::add_text_child(root, "SamplesPerPoint", raw_convert<string>(_samples_per_point));
+       cxml::add_text_child(root, "SampleRate", raw_convert<string>(_sample_rate));
 
        if (_leqm) {
-               root->add_child("Leqm")->add_child_text(raw_convert<string>(*_leqm));
+               cxml::add_text_child(root, "Leqm", raw_convert<string>(*_leqm));
        }
 
        doc->write_to_file_formatted (filename.string ());
index 16f2bd5f1a250d7188cb1a73740a415d530b2b08..2569e1cf049fe683646a17811d20642dfb6f54a9 100644 (file)
@@ -124,14 +124,14 @@ AudioContent::AudioContent (Content* parent, vector<shared_ptr<Content>> c)
 
 
 void
-AudioContent::as_xml (xmlpp::Node* node) const
+AudioContent::as_xml(xmlpp::Element* element) const
 {
        boost::mutex::scoped_lock lm (_mutex);
-       node->add_child("AudioGain")->add_child_text(raw_convert<string>(_gain));
-       node->add_child("AudioDelay")->add_child_text(raw_convert<string>(_delay));
-       node->add_child("AudioFadeIn")->add_child_text(raw_convert<string>(_fade_in.get()));
-       node->add_child("AudioFadeOut")->add_child_text(raw_convert<string>(_fade_out.get()));
-       node->add_child("AudioUseSameFadesAsVideo")->add_child_text(_use_same_fades_as_video ? "1" : "0");
+       cxml::add_text_child(element, "AudioGain", raw_convert<string>(_gain));
+       cxml::add_text_child(element, "AudioDelay", raw_convert<string>(_delay));
+       cxml::add_text_child(element, "AudioFadeIn", raw_convert<string>(_fade_in.get()));
+       cxml::add_text_child(element, "AudioFadeOut", raw_convert<string>(_fade_out.get()));
+       cxml::add_text_child(element, "AudioUseSameFadesAsVideo", _use_same_fades_as_video ? "1" : "0");
 }
 
 
index 084871c8ba8bb6e6da951e0faa885fa6f9532596..2a140b3e4f772bef453dde1d0899b0237d55159d 100644 (file)
@@ -56,7 +56,7 @@ public:
        AudioContent (Content* parent, std::vector<std::shared_ptr<Content>>);
        AudioContent (Content* parent, cxml::ConstNodePtr);
 
-       void as_xml (xmlpp::Node *) const;
+       void as_xml(xmlpp::Element*) const;
        std::string technical_summary () const;
        void take_settings_from (std::shared_ptr<const AudioContent> c);
 
index 6e8c4e30d3641f04cfa96c3961155d4f7168da2f..37929001dc3735490f6f36ae43153754e5777001 100644 (file)
@@ -220,17 +220,17 @@ AudioMapping::get (int input_channel, int output_channel) const
 
 
 void
-AudioMapping::as_xml (xmlpp::Node* node) const
+AudioMapping::as_xml(xmlpp::Element* element) const
 {
        auto const input = input_channels();
        auto const output = output_channels();
 
-       node->add_child("InputChannels")->add_child_text(raw_convert<string>(input));
-       node->add_child("OutputChannels")->add_child_text(raw_convert<string>(output));
+       cxml::add_text_child(element, "InputChannels", raw_convert<string>(input));
+       cxml::add_text_child(element, "OutputChannels", raw_convert<string>(output));
 
        for (int c = 0; c < input; ++c) {
                for (int d = 0; d < output; ++d) {
-                       auto t = node->add_child ("Gain");
+                       auto t = cxml::add_child(element, "Gain");
                        t->set_attribute("input", raw_convert<string>(c));
                        t->set_attribute("output", raw_convert<string>(d));
                        t->add_child_text (raw_convert<string> (get (c, d)));
index fe9a7978939d938db88f9b98db1b11f40d804595..68487d908f2cb1613bb93cf4f2015816ece95aff 100644 (file)
@@ -52,7 +52,7 @@ public:
 
        /* Default copy constructor is fine */
 
-       void as_xml (xmlpp::Node *) const;
+       void as_xml(xmlpp::Element*) const;
 
        void make_zero ();
        void make_default (AudioProcessor const * processor, boost::optional<boost::filesystem::path> filename = boost::optional<boost::filesystem::path>());
index 1f32d25fce3e2e35bbb0ff193a37617ad1284613..036904520ad1bf81c4dcf507a52c6ff097e5785f 100644 (file)
@@ -72,6 +72,6 @@ AudioPoint::operator= (AudioPoint const & other)
 void
 AudioPoint::as_xml (xmlpp::Element* parent) const
 {
-       parent->add_child("Peak")->add_child_text(raw_convert<string>(_data[PEAK]));
-       parent->add_child("RMS")->add_child_text(raw_convert<string>(_data[RMS]));
+       cxml::add_text_child(parent, "Peak", raw_convert<string>(_data[PEAK]));
+       cxml::add_text_child(parent, "RMS", raw_convert<string>(_data[RMS]));
 }
index 7388dbc2fb890390a15ca75f9f5beead2f956a20..6bd06373344232cdfdde749d9a6d771fbe36c165 100644 (file)
@@ -57,16 +57,16 @@ Cinema::read_screens (cxml::ConstNodePtr node)
 void
 Cinema::as_xml (xmlpp::Element* parent) const
 {
-       parent->add_child("Name")->add_child_text (name);
+       cxml::add_text_child(parent, "Name", name);
 
        for (auto i: emails) {
-               parent->add_child("Email")->add_child_text (i);
+               cxml::add_text_child(parent, "Email", i);
        }
 
-       parent->add_child("Notes")->add_child_text (notes);
+       cxml::add_text_child(parent, "Notes", notes);
 
        for (auto i: _screens) {
-               i->as_xml (parent->add_child ("Screen"));
+               i->as_xml(cxml::add_child(parent, "Screen"));
        }
 }
 
index bd1b47cb1ad43a067bf912c929d144c003eb171f..f1e6258122fbf3cebb7638be85e38ecedb4f8705 100644 (file)
@@ -151,41 +151,40 @@ ColourConversion::from_xml (cxml::NodePtr node, int version)
 }
 
 void
-ColourConversion::as_xml (xmlpp::Node* node) const
+ColourConversion::as_xml(xmlpp::Element* element) const
 {
-       auto in_node = node->add_child ("InputTransferFunction");
+       auto in_node = cxml::add_child(element, "InputTransferFunction");
        if (dynamic_pointer_cast<const dcp::GammaTransferFunction> (_in)) {
                auto tf = dynamic_pointer_cast<const dcp::GammaTransferFunction> (_in);
-               in_node->add_child("Type")->add_child_text ("Gamma");
-               in_node->add_child("Gamma")->add_child_text (raw_convert<string> (tf->gamma ()));
+               cxml::add_text_child(in_node, "Type", "Gamma");
+               cxml::add_text_child(in_node, "Gamma", raw_convert<string>(tf->gamma()));
        } else if (dynamic_pointer_cast<const dcp::ModifiedGammaTransferFunction> (_in)) {
                auto tf = dynamic_pointer_cast<const dcp::ModifiedGammaTransferFunction> (_in);
-               in_node->add_child("Type")->add_child_text ("ModifiedGamma");
-               in_node->add_child("Power")->add_child_text (raw_convert<string> (tf->power ()));
-               in_node->add_child("Threshold")->add_child_text (raw_convert<string> (tf->threshold ()));
-               in_node->add_child("A")->add_child_text (raw_convert<string> (tf->A ()));
-               in_node->add_child("B")->add_child_text (raw_convert<string> (tf->B ()));
-       } else if (dynamic_pointer_cast<const dcp::SGamut3TransferFunction> (_in)) {
-               in_node->add_child("Type")->add_child_text ("SGamut3");
+               cxml::add_text_child(in_node, "Type", "ModifiedGamma");
+               cxml::add_text_child(in_node, "Power", raw_convert<string>(tf->power ()));
+               cxml::add_text_child(in_node, "Threshold", raw_convert<string>(tf->threshold ()));
+               cxml::add_text_child(in_node, "A", raw_convert<string>(tf->A()));
+               cxml::add_text_child(in_node, "B", raw_convert<string>(tf->B()));
+       } else if (dynamic_pointer_cast<const dcp::SGamut3TransferFunction>(_in)) {
+               cxml::add_text_child(in_node, "Type", "SGamut3");
        }
 
-       node->add_child("YUVToRGB")->add_child_text (raw_convert<string> (static_cast<int> (_yuv_to_rgb)));
-       node->add_child("RedX")->add_child_text (raw_convert<string> (_red.x));
-       node->add_child("RedY")->add_child_text (raw_convert<string> (_red.y));
-       node->add_child("GreenX")->add_child_text (raw_convert<string> (_green.x));
-       node->add_child("GreenY")->add_child_text (raw_convert<string> (_green.y));
-       node->add_child("BlueX")->add_child_text (raw_convert<string> (_blue.x));
-       node->add_child("BlueY")->add_child_text (raw_convert<string> (_blue.y));
-       node->add_child("WhiteX")->add_child_text (raw_convert<string> (_white.x));
-       node->add_child("WhiteY")->add_child_text (raw_convert<string> (_white.y));
+       cxml::add_text_child(element, "YUVToRGB", raw_convert<string>(static_cast<int>(_yuv_to_rgb)));
+       cxml::add_text_child(element, "RedX", raw_convert<string>(_red.x));
+       cxml::add_text_child(element, "RedY", raw_convert<string>(_red.y));
+       cxml::add_text_child(element, "GreenX", raw_convert<string>(_green.x));
+       cxml::add_text_child(element, "GreenY", raw_convert<string>(_green.y));
+       cxml::add_text_child(element, "BlueX", raw_convert<string>(_blue.x));
+       cxml::add_text_child(element, "BlueY", raw_convert<string>(_blue.y));
+       cxml::add_text_child(element, "WhiteX", raw_convert<string>(_white.x));
+       cxml::add_text_child(element, "WhiteY", raw_convert<string>(_white.y));
        if (_adjusted_white) {
-               node->add_child("AdjustedWhiteX")->add_child_text (raw_convert<string> (_adjusted_white.get().x));
-               node->add_child("AdjustedWhiteY")->add_child_text (raw_convert<string> (_adjusted_white.get().y));
+               cxml::add_text_child(element, "AdjustedWhiteX", raw_convert<string>(_adjusted_white.get().x));
+               cxml::add_text_child(element, "AdjustedWhiteY", raw_convert<string>(_adjusted_white.get().y));
        }
 
-       if (dynamic_pointer_cast<const dcp::GammaTransferFunction> (_out)) {
-               shared_ptr<const dcp::GammaTransferFunction> gf = dynamic_pointer_cast<const dcp::GammaTransferFunction> (_out);
-               node->add_child("OutputGamma")->add_child_text (raw_convert<string> (gf->gamma ()));
+       if (auto gf = dynamic_pointer_cast<const dcp::GammaTransferFunction>(_out)) {
+               cxml::add_text_child(element, "OutputGamma", raw_convert<string>(gf->gamma()));
        }
 }
 
index 73b6ad23ccf558f469b2e29a5369d562301ba505..0c07ddbacd87c03ac30aea4f2a230e7606723ea0 100644 (file)
@@ -41,7 +41,7 @@ public:
        ColourConversion (cxml::NodePtr, int version);
        virtual ~ColourConversion () {}
 
-       virtual void as_xml (xmlpp::Node *) const;
+       virtual void as_xml(xmlpp::Element*) const;
        std::string identifier () const;
 
        boost::optional<size_t> preset () const;
index 160ef7645b008d0326b6fb329e3196bc851d7c27..912a71c4d140da9ddd6b6a7f47191edcb4384132 100644 (file)
@@ -736,218 +736,218 @@ Config::write_config () const
        auto root = doc.create_root_node ("Config");
 
        /* [XML] Version The version number of the configuration file format. */
-       root->add_child("Version")->add_child_text (raw_convert<string>(_current_version));
+       cxml::add_text_child(root, "Version", raw_convert<string>(_current_version));
        /* [XML] MasterEncodingThreads Number of encoding threads to use when running as master. */
-       root->add_child("MasterEncodingThreads")->add_child_text (raw_convert<string> (_master_encoding_threads));
+       cxml::add_text_child(root, "MasterEncodingThreads", raw_convert<string>(_master_encoding_threads));
        /* [XML] ServerEncodingThreads Number of encoding threads to use when running as server. */
-       root->add_child("ServerEncodingThreads")->add_child_text (raw_convert<string> (_server_encoding_threads));
+       cxml::add_text_child(root, "ServerEncodingThreads", raw_convert<string>(_server_encoding_threads));
        if (_default_directory) {
                /* [XML:opt] DefaultDirectory Default directory when creating a new film in the GUI. */
-               root->add_child("DefaultDirectory")->add_child_text (_default_directory->string ());
+               cxml::add_text_child(root, "DefaultDirectory", _default_directory->string());
        }
        /* [XML] ServerPortBase Port number to use for frame encoding requests.  <code>ServerPortBase</code> + 1 and
           <code>ServerPortBase</code> + 2 are used for querying servers.  <code>ServerPortBase</code> + 3 is used
           by the batch converter to listen for job requests.
        */
-       root->add_child("ServerPortBase")->add_child_text (raw_convert<string> (_server_port_base));
+       cxml::add_text_child(root, "ServerPortBase", raw_convert<string>(_server_port_base));
        /* [XML] UseAnyServers 1 to broadcast to look for encoding servers to use, 0 to use only those configured. */
-       root->add_child("UseAnyServers")->add_child_text (_use_any_servers ? "1" : "0");
+       cxml::add_text_child(root, "UseAnyServers", _use_any_servers ? "1" : "0");
 
        for (auto i: _servers) {
                /* [XML:opt] Server IP address or hostname of an encoding server to use; you can use as many of these tags
                   as you like.
                */
-               root->add_child("Server")->add_child_text (i);
+               cxml::add_text_child(root, "Server", i);
        }
 
        /* [XML] OnlyServersEncode 1 to set the master to do decoding of source content no JPEG2000 encoding; all encoding
           is done by the encoding servers.  0 to set the master to do some encoding as well as coordinating the job.
        */
-       root->add_child("OnlyServersEncode")->add_child_text (_only_servers_encode ? "1" : "0");
+       cxml::add_text_child(root, "OnlyServersEncode", _only_servers_encode ? "1" : "0");
        /* [XML] TMSProtocol Protocol to use to copy files to a TMS; 0 to use SCP, 1 for FTP. */
-       root->add_child("TMSProtocol")->add_child_text (raw_convert<string> (static_cast<int> (_tms_protocol)));
+       cxml::add_text_child(root, "TMSProtocol", raw_convert<string>(static_cast<int>(_tms_protocol)));
        /* [XML] TMSPassive True to use PASV mode with TMS FTP connections. */
-       root->add_child("TMSPassive")->add_child_text(_tms_passive ? "1" : "0");
+       cxml::add_text_child(root, "TMSPassive", _tms_passive ? "1" : "0");
        /* [XML] TMSIP IP address of TMS. */
-       root->add_child("TMSIP")->add_child_text (_tms_ip);
+       cxml::add_text_child(root, "TMSIP", _tms_ip);
        /* [XML] TMSPath Path on the TMS to copy files to. */
-       root->add_child("TMSPath")->add_child_text (_tms_path);
+       cxml::add_text_child(root, "TMSPath", _tms_path);
        /* [XML] TMSUser Username to log into the TMS with. */
-       root->add_child("TMSUser")->add_child_text (_tms_user);
+       cxml::add_text_child(root, "TMSUser", _tms_user);
        /* [XML] TMSPassword Password to log into the TMS with. */
-       root->add_child("TMSPassword")->add_child_text (_tms_password);
+       cxml::add_text_child(root, "TMSPassword", _tms_password);
        if (_language) {
                /* [XML:opt] Language Language to use in the GUI e.g. <code>fr_FR</code>. */
-               root->add_child("Language")->add_child_text (_language.get());
+               cxml::add_text_child(root, "Language", _language.get());
        }
        if (_default_dcp_content_type) {
                /* [XML:opt] DefaultDCPContentType Default content type to use when creating new films (<code>FTR</code>, <code>SHR</code>,
                   <code>TLR</code>, <code>TST</code>, <code>XSN</code>, <code>RTG</code>, <code>TSR</code>, <code>POL</code>,
                   <code>PSA</code> or <code>ADV</code>). */
-               root->add_child("DefaultDCPContentType")->add_child_text (_default_dcp_content_type->isdcf_name ());
+               cxml::add_text_child(root, "DefaultDCPContentType", _default_dcp_content_type->isdcf_name());
        }
        /* [XML] DefaultDCPAudioChannels Default number of audio channels to use when creating new films. */
-       root->add_child("DefaultDCPAudioChannels")->add_child_text (raw_convert<string> (_default_dcp_audio_channels));
+       cxml::add_text_child(root, "DefaultDCPAudioChannels", raw_convert<string>(_default_dcp_audio_channels));
        /* [XML] DCPIssuer Issuer text to write into CPL files. */
-       root->add_child("DCPIssuer")->add_child_text (_dcp_issuer);
+       cxml::add_text_child(root, "DCPIssuer", _dcp_issuer);
        /* [XML] DCPCreator Creator text to write into CPL files. */
-       root->add_child("DCPCreator")->add_child_text (_dcp_creator);
+       cxml::add_text_child(root, "DCPCreator", _dcp_creator);
        /* [XML] Company name to write into MXF files. */
-       root->add_child("DCPCompanyName")->add_child_text (_dcp_company_name);
+       cxml::add_text_child(root, "DCPCompanyName", _dcp_company_name);
        /* [XML] Product name to write into MXF files. */
-       root->add_child("DCPProductName")->add_child_text (_dcp_product_name);
+       cxml::add_text_child(root, "DCPProductName", _dcp_product_name);
        /* [XML] Product version to write into MXF files. */
-       root->add_child("DCPProductVersion")->add_child_text (_dcp_product_version);
+       cxml::add_text_child(root, "DCPProductVersion", _dcp_product_version);
        /* [XML] Comment to write into JPEG2000 data. */
-       root->add_child("DCPJ2KComment")->add_child_text (_dcp_j2k_comment);
+       cxml::add_text_child(root, "DCPJ2KComment", _dcp_j2k_comment);
        /* [XML] UploadAfterMakeDCP 1 to upload to a TMS after making a DCP, 0 for no upload. */
-       root->add_child("UploadAfterMakeDCP")->add_child_text (_upload_after_make_dcp ? "1" : "0");
+       cxml::add_text_child(root, "UploadAfterMakeDCP", _upload_after_make_dcp ? "1" : "0");
 
        /* [XML] DefaultStillLength Default length (in seconds) for still images in new films. */
-       root->add_child("DefaultStillLength")->add_child_text (raw_convert<string> (_default_still_length));
+       cxml::add_text_child(root, "DefaultStillLength", raw_convert<string>(_default_still_length));
        /* [XML] DefaultJ2KBandwidth Default bitrate (in bits per second) for JPEG2000 data in new films. */
-       root->add_child("DefaultJ2KBandwidth")->add_child_text (raw_convert<string> (_default_j2k_bandwidth));
+       cxml::add_text_child(root, "DefaultJ2KBandwidth", raw_convert<string>(_default_j2k_bandwidth));
        /* [XML] DefaultAudioDelay Default delay to apply to audio (positive moves audio later) in milliseconds. */
-       root->add_child("DefaultAudioDelay")->add_child_text (raw_convert<string> (_default_audio_delay));
+       cxml::add_text_child(root, "DefaultAudioDelay", raw_convert<string>(_default_audio_delay));
        /* [XML] DefaultInterop 1 to default new films to Interop, 0 for SMPTE. */
-       root->add_child("DefaultInterop")->add_child_text (_default_interop ? "1" : "0");
+       cxml::add_text_child(root, "DefaultInterop", _default_interop ? "1" : "0");
        if (_default_audio_language) {
                /* [XML] DefaultAudioLanguage Default audio language to use for new films */
-               root->add_child("DefaultAudioLanguage")->add_child_text(_default_audio_language->to_string());
+               cxml::add_text_child(root, "DefaultAudioLanguage", _default_audio_language->to_string());
        }
        if (_default_territory) {
                /* [XML] DefaultTerritory Default territory to use for new films */
-               root->add_child("DefaultTerritory")->add_child_text(_default_territory->subtag());
+               cxml::add_text_child(root, "DefaultTerritory", _default_territory->subtag());
        }
        for (auto const& i: _default_metadata) {
-               auto c = root->add_child("DefaultMetadata");
+               auto c = cxml::add_child(root, "DefaultMetadata");
                c->set_attribute("key", i.first);
                c->add_child_text(i.second);
        }
        if (_default_kdm_directory) {
                /* [XML:opt] DefaultKDMDirectory Default directory to write KDMs to. */
-               root->add_child("DefaultKDMDirectory")->add_child_text (_default_kdm_directory->string ());
+               cxml::add_text_child(root, "DefaultKDMDirectory", _default_kdm_directory->string ());
        }
-       _default_kdm_duration.as_xml(root->add_child("DefaultKDMDuration"));
+       _default_kdm_duration.as_xml(cxml::add_child(root, "DefaultKDMDuration"));
        /* [XML] MailServer Hostname of SMTP server to use. */
-       root->add_child("MailServer")->add_child_text (_mail_server);
+       cxml::add_text_child(root, "MailServer", _mail_server);
        /* [XML] MailPort Port number to use on SMTP server. */
-       root->add_child("MailPort")->add_child_text (raw_convert<string> (_mail_port));
+       cxml::add_text_child(root, "MailPort", raw_convert<string>(_mail_port));
        /* [XML] MailProtocol Protocol to use on SMTP server (Auto, Plain, STARTTLS or SSL) */
        switch (_mail_protocol) {
        case EmailProtocol::AUTO:
-               root->add_child("MailProtocol")->add_child_text("Auto");
+               cxml::add_text_child(root, "MailProtocol", "Auto");
                break;
        case EmailProtocol::PLAIN:
-               root->add_child("MailProtocol")->add_child_text("Plain");
+               cxml::add_text_child(root, "MailProtocol", "Plain");
                break;
        case EmailProtocol::STARTTLS:
-               root->add_child("MailProtocol")->add_child_text("STARTTLS");
+               cxml::add_text_child(root, "MailProtocol", "STARTTLS");
                break;
        case EmailProtocol::SSL:
-               root->add_child("MailProtocol")->add_child_text("SSL");
+               cxml::add_text_child(root, "MailProtocol", "SSL");
                break;
        }
        /* [XML] MailUser Username to use on SMTP server. */
-       root->add_child("MailUser")->add_child_text (_mail_user);
+       cxml::add_text_child(root, "MailUser", _mail_user);
        /* [XML] MailPassword Password to use on SMTP server. */
-       root->add_child("MailPassword")->add_child_text (_mail_password);
+       cxml::add_text_child(root, "MailPassword", _mail_password);
 
        /* [XML] KDMSubject Subject to use for KDM emails. */
-       root->add_child("KDMSubject")->add_child_text (_kdm_subject);
+       cxml::add_text_child(root, "KDMSubject", _kdm_subject);
        /* [XML] KDMFrom From address to use for KDM emails. */
-       root->add_child("KDMFrom")->add_child_text (_kdm_from);
+       cxml::add_text_child(root, "KDMFrom", _kdm_from);
        for (auto i: _kdm_cc) {
                /* [XML] KDMCC CC address to use for KDM emails; you can use as many of these tags as you like. */
-               root->add_child("KDMCC")->add_child_text (i);
+               cxml::add_text_child(root, "KDMCC", i);
        }
        /* [XML] KDMBCC BCC address to use for KDM emails. */
-       root->add_child("KDMBCC")->add_child_text (_kdm_bcc);
+       cxml::add_text_child(root, "KDMBCC", _kdm_bcc);
        /* [XML] KDMEmail Text of KDM email. */
-       root->add_child("KDMEmail")->add_child_text (_kdm_email);
+       cxml::add_text_child(root, "KDMEmail", _kdm_email);
 
        /* [XML] NotificationSubject Subject to use for notification emails. */
-       root->add_child("NotificationSubject")->add_child_text (_notification_subject);
+       cxml::add_text_child(root, "NotificationSubject", _notification_subject);
        /* [XML] NotificationFrom From address to use for notification emails. */
-       root->add_child("NotificationFrom")->add_child_text (_notification_from);
+       cxml::add_text_child(root, "NotificationFrom", _notification_from);
        /* [XML] NotificationFrom To address to use for notification emails. */
-       root->add_child("NotificationTo")->add_child_text (_notification_to);
+       cxml::add_text_child(root, "NotificationTo", _notification_to);
        for (auto i: _notification_cc) {
                /* [XML] NotificationCC CC address to use for notification emails; you can use as many of these tags as you like. */
-               root->add_child("NotificationCC")->add_child_text (i);
+               cxml::add_text_child(root, "NotificationCC", i);
        }
        /* [XML] NotificationBCC BCC address to use for notification emails. */
-       root->add_child("NotificationBCC")->add_child_text (_notification_bcc);
+       cxml::add_text_child(root, "NotificationBCC", _notification_bcc);
        /* [XML] NotificationEmail Text of notification email. */
-       root->add_child("NotificationEmail")->add_child_text (_notification_email);
+       cxml::add_text_child(root, "NotificationEmail", _notification_email);
 
        /* [XML] CheckForUpdates 1 to check dcpomatic.com for new versions, 0 to check only on request. */
-       root->add_child("CheckForUpdates")->add_child_text (_check_for_updates ? "1" : "0");
+       cxml::add_text_child(root, "CheckForUpdates", _check_for_updates ? "1" : "0");
        /* [XML] CheckForUpdates 1 to check dcpomatic.com for new text versions, 0 to check only on request. */
-       root->add_child("CheckForTestUpdates")->add_child_text (_check_for_test_updates ? "1" : "0");
+       cxml::add_text_child(root, "CheckForTestUpdates", _check_for_test_updates ? "1" : "0");
 
        /* [XML] MaximumJ2KBandwidth Maximum J2K bandwidth (in bits per second) that can be specified in the GUI. */
-       root->add_child("MaximumJ2KBandwidth")->add_child_text (raw_convert<string> (_maximum_j2k_bandwidth));
+       cxml::add_text_child(root, "MaximumJ2KBandwidth", raw_convert<string>(_maximum_j2k_bandwidth));
        /* [XML] AllowAnyDCPFrameRate 1 to allow users to specify any frame rate when creating DCPs, 0 to limit the GUI to standard rates. */
-       root->add_child("AllowAnyDCPFrameRate")->add_child_text (_allow_any_dcp_frame_rate ? "1" : "0");
+       cxml::add_text_child(root, "AllowAnyDCPFrameRate", _allow_any_dcp_frame_rate ? "1" : "0");
        /* [XML] AllowAnyContainer 1 to allow users to user any container ratio for their DCP, 0 to limit the GUI to DCI Flat/Scope */
-       root->add_child("AllowAnyContainer")->add_child_text (_allow_any_container ? "1" : "0");
+       cxml::add_text_child(root, "AllowAnyContainer", _allow_any_container ? "1" : "0");
        /* [XML] Allow96kHzAudio 1 to allow users to make DCPs with 96kHz audio, 0 to always make 48kHz DCPs */
-       root->add_child("Allow96kHzAudio")->add_child_text(_allow_96khz_audio ? "1" : "0");
+       cxml::add_text_child(root, "Allow96kHzAudio", _allow_96khz_audio ? "1" : "0");
        /* [XML] UseAllAudioChannels 1 to allow users to map audio to all 16 DCP channels, 0 to limit to the channels used in standard DCPs */
-       root->add_child("UseAllAudioChannels")->add_child_text(_use_all_audio_channels ? "1" : "0");
+       cxml::add_text_child(root, "UseAllAudioChannels", _use_all_audio_channels ? "1" : "0");
        /* [XML] ShowExperimentalAudioProcessors 1 to offer users the (experimental) audio upmixer processors, 0 to hide them */
-       root->add_child("ShowExperimentalAudioProcessors")->add_child_text (_show_experimental_audio_processors ? "1" : "0");
+       cxml::add_text_child(root, "ShowExperimentalAudioProcessors", _show_experimental_audio_processors ? "1" : "0");
        /* [XML] LogTypes Types of logging to write; a bitfield where 1 is general notes, 2 warnings, 4 errors, 8 debug information related
           to 3D, 16 debug information related to encoding, 32 debug information for timing purposes, 64 debug information related
           to sending email, 128 debug information related to the video view, 256 information about disk writing, 512 debug information
           related to the player, 1024 debug information related to audio analyses.
        */
-       root->add_child("LogTypes")->add_child_text (raw_convert<string> (_log_types));
+       cxml::add_text_child(root, "LogTypes", raw_convert<string> (_log_types));
        /* [XML] AnalyseEBUR128 1 to do EBUR128 analyses when analysing audio, otherwise 0. */
-       root->add_child("AnalyseEBUR128")->add_child_text (_analyse_ebur128 ? "1" : "0");
+       cxml::add_text_child(root, "AnalyseEBUR128", _analyse_ebur128 ? "1" : "0");
        /* [XML] AutomaticAudioAnalysis 1 to run audio analysis automatically when audio content is added to the film, otherwise 0. */
-       root->add_child("AutomaticAudioAnalysis")->add_child_text (_automatic_audio_analysis ? "1" : "0");
+       cxml::add_text_child(root, "AutomaticAudioAnalysis", _automatic_audio_analysis ? "1" : "0");
 #ifdef DCPOMATIC_WINDOWS
        if (_win32_console) {
                /* [XML] Win32Console 1 to open a console when running on Windows, otherwise 0.
                 * We only write this if it's true, which is a bit of a hack to allow unit tests to work
                 * more easily on Windows (without a platform-specific reference in config_write_utf8_test)
                 */
-               root->add_child("Win32Console")->add_child_text ("1");
+               cxml::add_text_child(root, "Win32Console", "1");
        }
 #endif
 
        /* [XML] Signer Certificate chain and private key to use when signing DCPs and KDMs.  Should contain <code>&lt;Certificate&gt;</code>
           tags in order and a <code>&lt;PrivateKey&gt;</code> tag all containing PEM-encoded certificates or private keys as appropriate.
        */
-       auto signer = root->add_child ("Signer");
+       auto signer = cxml::add_child(root, "Signer");
        DCPOMATIC_ASSERT (_signer_chain);
        for (auto const& i: _signer_chain->unordered()) {
-               signer->add_child("Certificate")->add_child_text (i.certificate (true));
+               cxml::add_text_child(signer, "Certificate", i.certificate (true));
        }
-       signer->add_child("PrivateKey")->add_child_text (_signer_chain->key().get ());
+       cxml::add_text_child(signer, "PrivateKey", _signer_chain->key().get ());
 
        /* [XML] Decryption Certificate chain and private key to use when decrypting KDMs */
-       auto decryption = root->add_child ("Decryption");
+       auto decryption = cxml::add_child(root, "Decryption");
        DCPOMATIC_ASSERT (_decryption_chain);
        for (auto const& i: _decryption_chain->unordered()) {
-               decryption->add_child("Certificate")->add_child_text (i.certificate (true));
+               cxml::add_text_child(decryption, "Certificate", i.certificate (true));
        }
-       decryption->add_child("PrivateKey")->add_child_text (_decryption_chain->key().get ());
+       cxml::add_text_child(decryption, "PrivateKey", _decryption_chain->key().get());
 
        /* [XML] History Filename of DCP to present in the <guilabel>File</guilabel> menu of the GUI; there can be more than one
           of these tags.
        */
        for (auto i: _history) {
-               root->add_child("History")->add_child_text (i.string ());
+               cxml::add_text_child(root, "History", i.string());
        }
 
        /* [XML] History Filename of DCP to present in the <guilabel>File</guilabel> menu of the player; there can be more than one
           of these tags.
        */
        for (auto i: _player_history) {
-               root->add_child("PlayerHistory")->add_child_text (i.string ());
+               cxml::add_text_child(root, "PlayerHistory", i.string());
        }
 
        /* [XML] DKDMGroup A group of DKDMs, each with a <code>Name</code> attribute, containing other <code>&lt;DKDMGroup&gt;</code>
@@ -957,53 +957,53 @@ Config::write_config () const
        _dkdms->as_xml (root);
 
        /* [XML] CinemasFile Filename of cinemas list file. */
-       root->add_child("CinemasFile")->add_child_text (_cinemas_file.string());
+       cxml::add_text_child(root, "CinemasFile", _cinemas_file.string());
        /* [XML] DKDMRecipientsFile Filename of DKDM recipients list file. */
-       root->add_child("DKDMRecipientsFile")->add_child_text (_dkdm_recipients_file.string());
+       cxml::add_text_child(root, "DKDMRecipientsFile", _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");
+       cxml::add_text_child(root, "ShowHintsBeforeMakeDCP", _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");
+       cxml::add_text_child(root, "ConfirmKDMEmail", _confirm_kdm_email ? "1" : "0");
        /* [XML] KDMFilenameFormat Format for KDM filenames. */
-       root->add_child("KDMFilenameFormat")->add_child_text (_kdm_filename_format.specification ());
+       cxml::add_text_child(root, "KDMFilenameFormat", _kdm_filename_format.specification());
        /* [XML] KDMFilenameFormat Format for DKDM filenames. */
-       root->add_child("DKDMFilenameFormat")->add_child_text(_dkdm_filename_format.specification());
+       cxml::add_text_child(root, "DKDMFilenameFormat", _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 ());
+       cxml::add_text_child(root, "KDMContainerNameFormat", _kdm_container_name_format.specification());
        /* [XML] DCPMetadataFilenameFormat Format for DCP metadata filenames. */
-       root->add_child("DCPMetadataFilenameFormat")->add_child_text (_dcp_metadata_filename_format.specification ());
+       cxml::add_text_child(root, "DCPMetadataFilenameFormat", _dcp_metadata_filename_format.specification());
        /* [XML] DCPAssetFilenameFormat Format for DCP asset filenames. */
-       root->add_child("DCPAssetFilenameFormat")->add_child_text (_dcp_asset_filename_format.specification ());
+       cxml::add_text_child(root, "DCPAssetFilenameFormat", _dcp_asset_filename_format.specification());
        /* [XML] JumpToSelected 1 to make the GUI jump to the start of content when it is selected, otherwise 0. */
-       root->add_child("JumpToSelected")->add_child_text (_jump_to_selected ? "1" : "0");
+       cxml::add_text_child(root, "JumpToSelected", _jump_to_selected ? "1" : "0");
        /* [XML] Nagged 1 if a particular nag screen has been shown and should not be shown again, otherwise 0. */
        for (int i = 0; i < NAG_COUNT; ++i) {
-               xmlpp::Element* e = root->add_child ("Nagged");
+               auto e = cxml::add_child(root, "Nagged");
                e->set_attribute("id", raw_convert<string>(i));
                e->add_child_text (_nagged[i] ? "1" : "0");
        }
        /* [XML] PreviewSound 1 to use sound in the GUI preview and player, otherwise 0. */
-       root->add_child("PreviewSound")->add_child_text (_sound ? "1" : "0");
+       cxml::add_text_child(root, "PreviewSound", _sound ? "1" : "0");
        if (_sound_output) {
                /* [XML:opt] PreviewSoundOutput Name of the audio output to use. */
-               root->add_child("PreviewSoundOutput")->add_child_text (_sound_output.get());
+               cxml::add_text_child(root, "PreviewSoundOutput", _sound_output.get());
        }
        /* [XML] CoverSheet Text of the cover sheet to write when making DCPs. */
-       root->add_child("CoverSheet")->add_child_text (_cover_sheet);
+       cxml::add_text_child(root, "CoverSheet", _cover_sheet);
        if (_last_player_load_directory) {
-               root->add_child("LastPlayerLoadDirectory")->add_child_text(_last_player_load_directory->string());
+               cxml::add_text_child(root, "LastPlayerLoadDirectory", _last_player_load_directory->string());
        }
        /* [XML] LastKDMWriteType Last type of KDM-write: <code>flat</code> for a flat file, <code>folder</code> for a folder or <code>zip</code> for a ZIP file. */
        if (_last_kdm_write_type) {
                switch (_last_kdm_write_type.get()) {
                case KDM_WRITE_FLAT:
-                       root->add_child("LastKDMWriteType")->add_child_text("flat");
+                       cxml::add_text_child(root, "LastKDMWriteType", "flat");
                        break;
                case KDM_WRITE_FOLDER:
-                       root->add_child("LastKDMWriteType")->add_child_text("folder");
+                       cxml::add_text_child(root, "LastKDMWriteType", "folder");
                        break;
                case KDM_WRITE_ZIP:
-                       root->add_child("LastKDMWriteType")->add_child_text("zip");
+                       cxml::add_text_child(root, "LastKDMWriteType", "zip");
                        break;
                }
        }
@@ -1011,58 +1011,58 @@ Config::write_config () const
        if (_last_dkdm_write_type) {
                switch (_last_dkdm_write_type.get()) {
                case DKDM_WRITE_INTERNAL:
-                       root->add_child("LastDKDMWriteType")->add_child_text("internal");
+                       cxml::add_text_child(root, "LastDKDMWriteType", "internal");
                        break;
                case DKDM_WRITE_FILE:
-                       root->add_child("LastDKDMWriteType")->add_child_text("file");
+                       cxml::add_text_child(root, "LastDKDMWriteType", "file");
                        break;
                }
        }
        /* [XML] FramesInMemoryMultiplier value to multiply the encoding threads count by to get the maximum number of
           frames to be held in memory at once.
        */
-       root->add_child("FramesInMemoryMultiplier")->add_child_text(raw_convert<string>(_frames_in_memory_multiplier));
+       cxml::add_text_child(root, "FramesInMemoryMultiplier", raw_convert<string>(_frames_in_memory_multiplier));
 
        /* [XML] DecodeReduction power of 2 to reduce DCP images by before decoding in the player. */
        if (_decode_reduction) {
-               root->add_child("DecodeReduction")->add_child_text(raw_convert<string>(_decode_reduction.get()));
+               cxml::add_text_child(root, "DecodeReduction", raw_convert<string>(_decode_reduction.get()));
        }
 
        /* [XML] DefaultNotify 1 to default jobs to notify when complete, otherwise 0. */
-       root->add_child("DefaultNotify")->add_child_text(_default_notify ? "1" : "0");
+       cxml::add_text_child(root, "DefaultNotify", _default_notify ? "1" : "0");
 
        /* [XML] Notification 1 if a notification type is enabled, otherwise 0. */
        for (int i = 0; i < NOTIFICATION_COUNT; ++i) {
-               xmlpp::Element* e = root->add_child ("Notification");
-               e->set_attribute("id", raw_convert<string>(i));
+               auto e = cxml::add_child(root, "Notification");
+               e->set_attribute ("id", raw_convert<string>(i));
                e->add_child_text (_notification[i] ? "1" : "0");
        }
 
        if (_barco_username) {
                /* [XML] BarcoUsername Username for logging into Barco's servers when downloading server certificates. */
-               root->add_child("BarcoUsername")->add_child_text(*_barco_username);
+               cxml::add_text_child(root, "BarcoUsername", *_barco_username);
        }
        if (_barco_password) {
                /* [XML] BarcoPassword Password for logging into Barco's servers when downloading server certificates. */
-               root->add_child("BarcoPassword")->add_child_text(*_barco_password);
+               cxml::add_text_child(root, "BarcoPassword", *_barco_password);
        }
 
        if (_christie_username) {
                /* [XML] ChristieUsername Username for logging into Christie's servers when downloading server certificates. */
-               root->add_child("ChristieUsername")->add_child_text(*_christie_username);
+               cxml::add_text_child(root, "ChristieUsername", *_christie_username);
        }
        if (_christie_password) {
                /* [XML] ChristiePassword Password for logging into Christie's servers when downloading server certificates. */
-               root->add_child("ChristiePassword")->add_child_text(*_christie_password);
+               cxml::add_text_child(root, "ChristiePassword", *_christie_password);
        }
 
        if (_gdc_username) {
                /* [XML] GDCUsername Username for logging into GDC's servers when downloading server certificates. */
-               root->add_child("GDCUsername")->add_child_text(*_gdc_username);
+               cxml::add_text_child(root, "GDCUsername", *_gdc_username);
        }
        if (_gdc_password) {
                /* [XML] GDCPassword Password for logging into GDC's servers when downloading server certificates. */
-               root->add_child("GDCPassword")->add_child_text(*_gdc_password);
+               cxml::add_text_child(root, "GDCPassword", *_gdc_password);
        }
 
        /* [XML] PlayerMode <code>window</code> for a single window, <code>full</code> for full-screen and <code>dual</code> for full screen playback
@@ -1070,18 +1070,18 @@ Config::write_config () const
        */
        switch (_player_mode) {
        case PLAYER_MODE_WINDOW:
-               root->add_child("PlayerMode")->add_child_text("window");
+               cxml::add_text_child(root, "PlayerMode", "window");
                break;
        case PLAYER_MODE_FULL:
-               root->add_child("PlayerMode")->add_child_text("full");
+               cxml::add_text_child(root, "PlayerMode", "full");
                break;
        case PLAYER_MODE_DUAL:
-               root->add_child("PlayerMode")->add_child_text("dual");
+               cxml::add_text_child(root, "PlayerMode", "dual");
                break;
        }
 
        if (_player_restricted_menus) {
-               root->add_child("PlayerRestrictedMenus")->add_child_text("1");
+               cxml::add_text_child(root, "PlayerRestrictedMenus", "1");
        }
 
        if (_playlist_editor_restricted_menus) {
@@ -1089,75 +1089,75 @@ Config::write_config () const
        }
 
        /* [XML] ImageDisplay Screen number to put image on in dual-screen player mode. */
-       root->add_child("ImageDisplay")->add_child_text(raw_convert<string>(_image_display));
+       cxml::add_text_child(root, "ImageDisplay", raw_convert<string>(_image_display));
        switch (_video_view_type) {
        case VIDEO_VIEW_SIMPLE:
-               root->add_child("VideoViewType")->add_child_text("simple");
+               cxml::add_text_child(root, "VideoViewType", "simple");
                break;
        case VIDEO_VIEW_OPENGL:
-               root->add_child("VideoViewType")->add_child_text("opengl");
+               cxml::add_text_child(root, "VideoViewType", "opengl");
                break;
        }
        /* [XML] RespectKDMValidityPeriods 1 to refuse to use KDMs that are out of date, 0 to ignore KDM dates. */
-       root->add_child("RespectKDMValidityPeriods")->add_child_text(_respect_kdm_validity_periods ? "1" : "0");
+       cxml::add_text_child(root, "RespectKDMValidityPeriods", _respect_kdm_validity_periods ? "1" : "0");
        if (_player_debug_log_file) {
                /* [XML] PlayerLogFile Filename to use for player debug logs. */
-               root->add_child("PlayerDebugLogFile")->add_child_text(_player_debug_log_file->string());
+               cxml::add_text_child(root, "PlayerDebugLogFile", _player_debug_log_file->string());
        }
        if (_player_content_directory) {
                /* [XML] PlayerContentDirectory Directory to use for player content in the dual-screen mode. */
-               root->add_child("PlayerContentDirectory")->add_child_text(_player_content_directory->string());
+               cxml::add_text_child(root, "PlayerContentDirectory", _player_content_directory->string());
        }
        if (_player_playlist_directory) {
                /* [XML] PlayerPlaylistDirectory Directory to use for player playlists in the dual-screen mode. */
-               root->add_child("PlayerPlaylistDirectory")->add_child_text(_player_playlist_directory->string());
+               cxml::add_text_child(root, "PlayerPlaylistDirectory", _player_playlist_directory->string());
        }
        if (_player_kdm_directory) {
                /* [XML] PlayerKDMDirectory Directory to use for player KDMs in the dual-screen mode. */
-               root->add_child("PlayerKDMDirectory")->add_child_text(_player_kdm_directory->string());
+               cxml::add_text_child(root, "PlayerKDMDirectory", _player_kdm_directory->string());
        }
        if (_audio_mapping) {
-               _audio_mapping->as_xml (root->add_child("AudioMapping"));
+               _audio_mapping->as_xml(cxml::add_child(root, "AudioMapping"));
        }
        for (auto const& i: _custom_languages) {
-               root->add_child("CustomLanguage")->add_child_text(i.to_string());
+               cxml::add_text_child(root, "CustomLanguage", i.to_string());
        }
        for (auto const& initial: _initial_paths) {
                if (initial.second) {
-                       root->add_child(initial.first)->add_child_text(initial.second->string());
+                       cxml::add_text_child(root, initial.first, initial.second->string());
                }
        }
-       root->add_child("UseISDCFNameByDefault")->add_child_text(_use_isdcf_name_by_default ? "1" : "0");
-       root->add_child("WriteKDMsToDisk")->add_child_text(_write_kdms_to_disk ? "1" : "0");
-       root->add_child("EmailKDMs")->add_child_text(_email_kdms ? "1" : "0");
-       root->add_child("DefaultKDMType")->add_child_text(dcp::formulation_to_string(_default_kdm_type));
-       root->add_child("AutoCropThreshold")->add_child_text(raw_convert<string>(_auto_crop_threshold));
+       cxml::add_text_child(root, "UseISDCFNameByDefault", _use_isdcf_name_by_default ? "1" : "0");
+       cxml::add_text_child(root, "WriteKDMsToDisk", _write_kdms_to_disk ? "1" : "0");
+       cxml::add_text_child(root, "EmailKDMs", _email_kdms ? "1" : "0");
+       cxml::add_text_child(root, "DefaultKDMType", dcp::formulation_to_string(_default_kdm_type));
+       cxml::add_text_child(root, "AutoCropThreshold", raw_convert<string>(_auto_crop_threshold));
        if (_last_release_notes_version) {
-               root->add_child("LastReleaseNotesVersion")->add_child_text(*_last_release_notes_version);
+               cxml::add_text_child(root, "LastReleaseNotesVersion", *_last_release_notes_version);
        }
        if (_main_divider_sash_position) {
-               root->add_child("MainDividerSashPosition")->add_child_text(raw_convert<string>(*_main_divider_sash_position));
+               cxml::add_text_child(root, "MainDividerSashPosition", raw_convert<string>(*_main_divider_sash_position));
        }
        if (_main_content_divider_sash_position) {
-               root->add_child("MainContentDividerSashPosition")->add_child_text(raw_convert<string>(*_main_content_divider_sash_position));
+               cxml::add_text_child(root, "MainContentDividerSashPosition", raw_convert<string>(*_main_content_divider_sash_position));
        }
 
-       root->add_child("DefaultAddFileLocation")->add_child_text(
+       cxml::add_text_child(root, "DefaultAddFileLocation",
                _default_add_file_location == DefaultAddFileLocation::SAME_AS_LAST_TIME ? "last" : "project"
                );
 
        /* [XML] AllowSMPTEBv20 1 to allow the user to choose SMPTE (Bv2.0 only) as a standard, otherwise 0 */
-       root->add_child("AllowSMPTEBv20")->add_child_text(_allow_smpte_bv20 ? "1" : "0");
+       cxml::add_text_child(root, "AllowSMPTEBv20", _allow_smpte_bv20 ? "1" : "0");
        /* [XML] ISDCFNamePartLength Maximum length of the "name" part of an ISDCF name, which should be 14 according to the standard */
-       root->add_child("ISDCFNamePartLength")->add_child_text(raw_convert<string>(_isdcf_name_part_length));
+       cxml::add_text_child(root, "ISDCFNamePartLength", raw_convert<string>(_isdcf_name_part_length));
 
 #ifdef DCPOMATIC_GROK
        if (_grok) {
-               _grok->as_xml(root->add_child("Grok"));
+               _grok->as_xml(cxml::add_child(root, "Grok"));
        }
 #endif
 
-       _export.write(root->add_child("Export"));
+       _export.write(cxml::add_child(root, "Export"));
 
        auto target = config_write_file();
 
@@ -1186,10 +1186,10 @@ write_file (string root_node, string node, string version, list<shared_ptr<T>> t
 {
        xmlpp::Document doc;
        auto root = doc.create_root_node (root_node);
-       root->add_child("Version")->add_child_text(version);
+       cxml::add_text_child(root, "Version", version);
 
        for (auto i: things) {
-               i->as_xml (root->add_child(node));
+               i->as_xml(cxml::add_child(root, node));
        }
 
        try {
@@ -1529,7 +1529,7 @@ void
 Config::link (boost::filesystem::path new_file) const
 {
        xmlpp::Document doc;
-       doc.create_root_node("Config")->add_child("Link")->add_child_text(new_file.string());
+       cxml::add_text_child(doc.create_root_node("Config"), "Link", new_file.string());
        try {
                doc.write_to_file_formatted(write_path("config.xml").string());
        } catch (xmlpp::exception& e) {
index 6324050ec69a22f056cc3bedb4c1c7ae2ff002f0..6743705d9b94659fd019c7b6286778d0f7d75919 100644 (file)
@@ -140,23 +140,23 @@ Content::Content (vector<shared_ptr<Content>> c)
 
 
 void
-Content::as_xml (xmlpp::Node* node, bool with_paths) const
+Content::as_xml(xmlpp::Element* element, bool with_paths) const
 {
        boost::mutex::scoped_lock lm (_mutex);
 
        if (with_paths) {
                for (size_t i = 0; i < _paths.size(); ++i) {
-                       auto p = node->add_child("Path");
+                       auto p = cxml::add_child(element, "Path");
                        p->add_child_text (_paths[i].string());
                        p->set_attribute ("mtime", raw_convert<string>(_last_write_times[i]));
                }
        }
-       node->add_child("Digest")->add_child_text(_digest);
-       node->add_child("Position")->add_child_text(raw_convert<string>(_position.get()));
-       node->add_child("TrimStart")->add_child_text(raw_convert<string>(_trim_start.get()));
-       node->add_child("TrimEnd")->add_child_text(raw_convert<string>(_trim_end.get()));
+       cxml::add_text_child(element, "Digest", _digest);
+       cxml::add_text_child(element, "Position", raw_convert<string>(_position.get()));
+       cxml::add_text_child(element, "TrimStart", raw_convert<string>(_trim_start.get()));
+       cxml::add_text_child(element, "TrimEnd", raw_convert<string>(_trim_end.get()));
        if (_video_frame_rate) {
-               node->add_child("VideoFrameRate")->add_child_text(raw_convert<string>(_video_frame_rate.get()));
+               cxml::add_text_child(element, "VideoFrameRate", raw_convert<string>(_video_frame_rate.get()));
        }
 }
 
index f2fecddf063df96a2546fffb66cd82722922aa13..3753c84d701fdda7409b07f44289d8eebcad13da 100644 (file)
@@ -100,7 +100,7 @@ public:
         */
        virtual std::string technical_summary () const;
 
-       virtual void as_xml (xmlpp::Node *, bool with_paths) const;
+       virtual void as_xml(xmlpp::Element* element, bool with_paths) const;
        virtual dcpomatic::DCPTime full_length (std::shared_ptr<const Film>) const = 0;
        virtual dcpomatic::DCPTime approximate_length () const = 0;
        virtual std::string identifier () const;
index d2d020a9fb36cb96d0f4bca83507432ba41deedf..a6f7d4bacd6948272a7db73e9a6d3ea8c7b2f241 100644 (file)
@@ -42,12 +42,12 @@ Crop::Crop(shared_ptr<cxml::Node> node)
 
 
 void
-Crop::as_xml(xmlpp::Node* node) const
+Crop::as_xml(xmlpp::Element* element) const
 {
-       node->add_child("LeftCrop")->add_child_text(raw_convert<string>(left));
-       node->add_child("RightCrop")->add_child_text(raw_convert<string>(right));
-       node->add_child("TopCrop")->add_child_text(raw_convert<string>(top));
-       node->add_child("BottomCrop")->add_child_text(raw_convert<string>(bottom));
+       cxml::add_text_child(element, "LeftCrop", raw_convert<string>(left));
+       cxml::add_text_child(element, "RightCrop", raw_convert<string>(right));
+       cxml::add_text_child(element, "TopCrop", raw_convert<string>(top));
+       cxml::add_text_child(element, "BottomCrop", raw_convert<string>(bottom));
 }
 
 
index 00734d5e9c63e4d732b341b2e4983487ee3a3455..24330731dec59ac9429489ee5e30c2f5d9990daa 100644 (file)
@@ -65,7 +65,7 @@ struct Crop
                return s;
        }
 
-       void as_xml (xmlpp::Node *) const;
+       void as_xml(xmlpp::Element*) const;
 };
 
 
index b8f1d48f13dbc983de6493d73d1c8689480603a7..1e145c8fc5b19285519e93c8064e7751b8efe2cc 100644 (file)
@@ -59,16 +59,16 @@ Drive::as_xml () const
 {
        xmlpp::Document doc;
        auto root = doc.create_root_node ("Drive");
-       root->add_child("Device")->add_child_text(_device);
+       cxml::add_text_child(root, "Device", _device);
        for (auto i: _mount_points) {
-               root->add_child("MountPoint")->add_child_text(i.string());
+               cxml::add_text_child(root, "MountPoint", i.string());
        }
-       root->add_child("Size")->add_child_text(dcp::raw_convert<string>(_size));
+       cxml::add_text_child(root, "Size", dcp::raw_convert<string>(_size));
        if (_vendor) {
-               root->add_child("Vendor")->add_child_text(*_vendor);
+               cxml::add_text_child(root, "Vendor", *_vendor);
        }
        if (_model) {
-               root->add_child("Model")->add_child_text(*_model);
+               cxml::add_text_child(root, "Model", *_model);
        }
 
        return doc.write_to_string("UTF-8");
index e583578ecc9a087d6d6a5cd3c814c562e96afd93..e9afa04cc1cdf9136d87d5c66455422d20652438 100644 (file)
@@ -355,96 +355,98 @@ DCPContent::technical_summary () const
        return s;
 }
 
+
 void
-DCPContent::as_xml (xmlpp::Node* node, bool with_paths) const
+DCPContent::as_xml(xmlpp::Element* element, bool with_paths) const
 {
-       node->add_child("Type")->add_child_text ("DCP");
+       cxml::add_text_child(element, "Type", "DCP");
 
-       Content::as_xml (node, with_paths);
+       Content::as_xml(element, with_paths);
 
        if (video) {
-               video->as_xml (node);
+               video->as_xml(element);
        }
 
        if (audio) {
-               audio->as_xml (node);
-               node->add_child("AudioFrameRate")->add_child_text (raw_convert<string> (audio->stream()->frame_rate()));
-               node->add_child("AudioLength")->add_child_text (raw_convert<string> (audio->stream()->length()));
-               audio->stream()->mapping().as_xml (node->add_child("AudioMapping"));
+               audio->as_xml(element);
+               cxml::add_text_child(element, "AudioFrameRate", raw_convert<string>(audio->stream()->frame_rate()));
+               cxml::add_text_child(element, "AudioLength", raw_convert<string>(audio->stream()->length()));
+               audio->stream()->mapping().as_xml(cxml::add_child(element, "AudioMapping"));
        }
 
        for (auto i: text) {
-               i->as_xml (node);
+               i->as_xml(element);
        }
 
        if (atmos) {
-               atmos->as_xml (node);
+               atmos->as_xml(element);
        }
 
        boost::mutex::scoped_lock lm (_mutex);
 
-       node->add_child("Name")->add_child_text (_name);
-       node->add_child("Encrypted")->add_child_text (_encrypted ? "1" : "0");
-       node->add_child("NeedsAssets")->add_child_text (_needs_assets ? "1" : "0");
+       cxml::add_text_child(element, "Name", _name);
+       cxml::add_text_child(element, "Encrypted", _encrypted ? "1" : "0");
+       cxml::add_text_child(element, "NeedsAssets", _needs_assets ? "1" : "0");
        if (_kdm) {
-               node->add_child("KDM")->add_child_text (_kdm->as_xml ());
+               cxml::add_text_child(element, "KDM", _kdm->as_xml());
        }
-       node->add_child("KDMValid")->add_child_text (_kdm_valid ? "1" : "0");
-       node->add_child("ReferenceVideo")->add_child_text (_reference_video ? "1" : "0");
-       node->add_child("ReferenceAudio")->add_child_text (_reference_audio ? "1" : "0");
-       node->add_child("ReferenceOpenSubtitle")->add_child_text(_reference_text[TextType::OPEN_SUBTITLE] ? "1" : "0");
-       node->add_child("ReferenceClosedCaption")->add_child_text(_reference_text[TextType::CLOSED_CAPTION] ? "1" : "0");
+       cxml::add_text_child(element, "KDMValid", _kdm_valid ? "1" : "0");
+       cxml::add_text_child(element, "ReferenceVideo", _reference_video ? "1" : "0");
+       cxml::add_text_child(element, "ReferenceAudio", _reference_audio ? "1" : "0");
+       cxml::add_text_child(element, "ReferenceOpenSubtitle", _reference_text[TextType::OPEN_SUBTITLE] ? "1" : "0");
+       cxml::add_text_child(element, "ReferenceClosedCaption", _reference_text[TextType::CLOSED_CAPTION] ? "1" : "0");
        if (_standard) {
                switch (_standard.get ()) {
                case dcp::Standard::INTEROP:
-                       node->add_child("Standard")->add_child_text ("Interop");
+                       cxml::add_text_child(element, "Standard", "Interop");
                        break;
                case dcp::Standard::SMPTE:
-                       node->add_child("Standard")->add_child_text ("SMPTE");
+                       cxml::add_text_child(element, "Standard", "SMPTE");
                        break;
                default:
                        DCPOMATIC_ASSERT (false);
                }
        }
-       node->add_child("ThreeD")->add_child_text (_three_d ? "1" : "0");
+       cxml::add_text_child(element, "ThreeD", _three_d ? "1" : "0");
        if (_content_kind) {
-               node->add_child("ContentKind")->add_child_text(_content_kind->name());
+               cxml::add_text_child(element, "ContentKind", _content_kind->name());
        }
        if (_cpl) {
-               node->add_child("CPL")->add_child_text (_cpl.get ());
+               cxml::add_text_child(element, "CPL", _cpl.get());
        }
        for (auto i: _reel_lengths) {
-               node->add_child("ReelLength")->add_child_text (raw_convert<string> (i));
+               cxml::add_text_child(element, "ReelLength", raw_convert<string>(i));
        }
 
        for (auto const& i: _markers) {
-               auto marker = node->add_child("Marker");
+               auto marker = cxml::add_child(element, "Marker");
                marker->set_attribute("type", dcp::marker_to_string(i.first));
                marker->add_child_text(raw_convert<string>(i.second.get()));
        }
 
        for (auto i: _ratings) {
-               auto rating = node->add_child("Rating");
+               auto rating = cxml::add_child(element, "Rating");
                i.as_xml (rating);
        }
 
        for (auto i: _content_versions) {
-               node->add_child("ContentVersion")->add_child_text(i);
+               cxml::add_text_child(element, "ContentVersion", i);
        }
 
        if (_active_audio_channels) {
-               node->add_child("ActiveAudioChannels")->add_child_text(raw_convert<string>(*_active_audio_channels));
+               cxml::add_text_child(element, "ActiveAudioChannels", raw_convert<string>(*_active_audio_channels));
        }
 
        for (auto i = 0; i < static_cast<int>(TextType::COUNT); ++i) {
                if (_has_non_zero_entry_point[i]) {
-                       auto has = node->add_child("HasNonZeroEntryPoint");
+                       auto has = cxml::add_child(element, "HasNonZeroEntryPoint");
                        has->add_child_text("1");
                        has->set_attribute("type", text_type_to_string(static_cast<TextType>(i)));
                }
        }
 }
 
+
 DCPTime
 DCPContent::full_length (shared_ptr<const Film> film) const
 {
index eac0810bb747d56347bac418796a4c221ce2ae4e..995e0b68134aa55c44075e399a32dc989d346b8a 100644 (file)
@@ -75,7 +75,7 @@ public:
        void examine (std::shared_ptr<const Film> film, std::shared_ptr<Job>) override;
        std::string summary () const override;
        std::string technical_summary () const override;
-       void as_xml (xmlpp::Node *, bool with_paths) const override;
+       void as_xml(xmlpp::Element*, bool with_paths) const override;
        std::string identifier () const override;
        void take_settings_from (std::shared_ptr<const Content> c) override;
 
index eb243b60dbc41e652e624b5ad461dd523e6e8ecf..4278caa986a6762604fef23e471ed2a3166ea0e9 100644 (file)
@@ -42,14 +42,14 @@ template <class R, class A>
 void add_asset(string film_key, shared_ptr<R> reel_asset, shared_ptr<A> asset, xmlpp::Element* reel, string name)
 {
        if (asset) {
-               auto out = reel->add_child(name);
-               out->add_child("Id")->add_child_text("urn:uuid:" + asset->id());
+               auto out = cxml::add_child(reel, name);
+               cxml::add_text_child(out, "Id", "urn:uuid:" + asset->id());
                if (reel_asset->annotation_text()) {
-                       out->add_child("AnnotationText")->add_child_text(reel_asset->annotation_text().get());
+                       cxml::add_text_child(out, "AnnotationText", reel_asset->annotation_text().get());
                }
                if (asset->key_id()) {
-                       out->add_child("KeyId")->add_child_text("urn:uuid:" + asset->key_id().get());
-                       out->add_child("Key")->add_child_text(asset->key() ? asset->key()->hex() : film_key);
+                       cxml::add_text_child(out, "KeyId", "urn:uuid:" + asset->key_id().get());
+                       cxml::add_text_child(out, "Key", asset->key() ? asset->key()->hex() : film_key);
                }
        }
 };
@@ -64,16 +64,16 @@ write_dcp_digest_file (
 {
        xmlpp::Document doc;
        auto root = doc.create_root_node("FHG_DCP_DIGEST", "http://www.fhg.de/2009/04/02/dcpdig");
-       root->add_child("InteropMode")->add_child_text(cpl->standard() == dcp::Standard::INTEROP ? "true" : "false");
-       auto composition = root->add_child("CompositionList")->add_child("Composition");
-       composition->add_child("Id")->add_child_text("urn:uuid:" + cpl->id());
-       composition->add_child("AnnotationText")->add_child_text(cpl->annotation_text().get_value_or(""));
-       composition->add_child("ContentTitleText")->add_child_text(cpl->content_title_text());
-       auto reel_list = composition->add_child("ReelList");
+       cxml::add_text_child(root, "InteropMode", cpl->standard() == dcp::Standard::INTEROP ? "true" : "false");
+       auto composition = cxml::add_child(cxml::add_child(root, "CompositionList"), "Composition");
+       cxml::add_text_child(composition, "Id", "urn:uuid:" + cpl->id());
+       cxml::add_text_child(composition, "AnnotationText", cpl->annotation_text().get_value_or(""));
+       cxml::add_text_child(composition, "ContentTitleText", cpl->content_title_text());
+       auto reel_list = cxml::add_child(composition, "ReelList");
        for (auto in_reel: cpl->reels()) {
-               auto out_reel = reel_list->add_child("Reel");
-               out_reel->add_child("Id")->add_child_text("urn:uuid:" + in_reel->id());
-               out_reel->add_child("AnnotationText");
+               auto out_reel = cxml::add_child(reel_list, "Reel");
+               cxml::add_text_child(out_reel, "Id", "urn:uuid:" + in_reel->id());
+               cxml::add_child(out_reel, "AnnotationText");
                if (in_reel->main_picture()) {
                        add_asset(film_key, in_reel->main_picture(), in_reel->main_picture()->asset(), out_reel, "MainPicture");
                }
index 8de5967efb51421d64240fec484a43da786cbbc8..9ca3750d193122534dd63560a603fa5232c672be 100644 (file)
@@ -137,14 +137,14 @@ DCPSubtitleContent::technical_summary () const
 }
 
 void
-DCPSubtitleContent::as_xml (xmlpp::Node* node, bool with_paths) const
+DCPSubtitleContent::as_xml(xmlpp::Element* element, bool with_paths) const
 {
-       node->add_child("Type")->add_child_text ("DCPSubtitle");
-       Content::as_xml (node, with_paths);
+       cxml::add_text_child(element, "Type", "DCPSubtitle");
+       Content::as_xml(element, with_paths);
 
        if (only_text()) {
-               only_text()->as_xml (node);
+               only_text()->as_xml(element);
        }
 
-       node->add_child("Length")->add_child_text (raw_convert<string> (_length.get ()));
+       cxml::add_text_child(element, "Length", raw_convert<string>(_length.get()));
 }
index 89a6f26a2b28dd34e7df1cc58e42669b3db44687..068b6dbac0b943f4c72c1be9de44169de6297810 100644 (file)
@@ -30,7 +30,7 @@ public:
        void examine (std::shared_ptr<const Film> film, std::shared_ptr<Job>) override;
        std::string summary () const override;
        std::string technical_summary () const override;
-       void as_xml (xmlpp::Node *, bool with_paths) const override;
+       void as_xml(xmlpp::Element*, bool with_paths) const override;
        dcpomatic::DCPTime full_length (std::shared_ptr<const Film> film) const override;
        dcpomatic::DCPTime approximate_length () const override;
 
index 0bd75127541ac7be96abf6854426aaf46df06446..2929323963d76c4c4561292a657144cd85c43743 100644 (file)
@@ -56,9 +56,9 @@ DCPTextTrack::summary () const
 void
 DCPTextTrack::as_xml (xmlpp::Element* parent) const
 {
-       parent->add_child("Name")->add_child_text(name);
+       cxml::add_text_child(parent, "Name", name);
        if (language) {
-               parent->add_child("Language")->add_child_text(language->to_string());
+               cxml::add_text_child(parent, "Language", language->to_string());
        }
 }
 
index 3769a3285e552b9e40400e2513e79e920a499eb1..6580ac448bc9d80c0c7e83983e1bd5e88fa5fc3d 100644 (file)
@@ -239,7 +239,7 @@ DCPVideo::encode_remotely (EncodeServerDescription serv, int timeout) const
        /* Collect all XML metadata */
        xmlpp::Document doc;
        auto root = doc.create_root_node ("EncodingRequest");
-       root->add_child("Version")->add_child_text (raw_convert<string> (SERVER_LINK_VERSION));
+       cxml::add_text_child(root, "Version", raw_convert<string>(SERVER_LINK_VERSION));
        add_metadata (root);
 
        LOG_DEBUG_ENCODE (N_("Sending frame %1 to remote"), _index);
@@ -278,10 +278,10 @@ DCPVideo::encode_remotely (EncodeServerDescription serv, int timeout) const
 void
 DCPVideo::add_metadata (xmlpp::Element* el) const
 {
-       el->add_child("Index")->add_child_text (raw_convert<string> (_index));
-       el->add_child("FramesPerSecond")->add_child_text (raw_convert<string> (_frames_per_second));
-       el->add_child("J2KBandwidth")->add_child_text (raw_convert<string> (_j2k_bandwidth));
-       el->add_child("Resolution")->add_child_text (raw_convert<string> (int (_resolution)));
+       cxml::add_text_child(el, "Index", raw_convert<string>(_index));
+       cxml::add_text_child(el, "FramesPerSecond", raw_convert<string>(_frames_per_second));
+       cxml::add_text_child(el, "J2KBandwidth", raw_convert<string>(_j2k_bandwidth));
+       cxml::add_text_child(el, "Resolution", raw_convert<string>(int(_resolution)));
        _frame->add_metadata (el);
 }
 
index 8f3bfea2e8b5ecd5c4e4f4e70aed8a049ba81ff3..4e56a37c4627423a9d8fecd0d1daeaca51b7c3a0 100644 (file)
@@ -48,7 +48,7 @@ DKDMRecipient::as_xml (xmlpp::Element* node) const
        KDMRecipient::as_xml (node);
 
        for (auto i: emails) {
-               node->add_child("Email")->add_child_text(i);
+               cxml::add_text_child(node, "Email", i);
        }
 }
 
index 7beaae8f478d4099fc6590db149a23e7ebd69bb9..4c7838a8d0ceba65cb5768c017ef7944e6c1edac 100644 (file)
@@ -66,16 +66,16 @@ DKDM::name () const
 
 
 void
-DKDM::as_xml (xmlpp::Element* node) const
+DKDM::as_xml(xmlpp::Element* element) const
 {
-       node->add_child("DKDM")->add_child_text (_dkdm.as_xml ());
+       cxml::add_text_child(element, "DKDM", _dkdm.as_xml());
 }
 
 
 void
-DKDMGroup::as_xml (xmlpp::Element* node) const
+DKDMGroup::as_xml(xmlpp::Element* element) const
 {
-       auto f = node->add_child("DKDMGroup");
+       auto f = cxml::add_child(element, "DKDMGroup");
        f->set_attribute("name", _name);
        for (auto i: _children) {
                i->as_xml (f);
index 7eae4375f81f332c5f29bd906c35ff877ab9e85e..b9c907e050a6af4cb4221eb105db3717f2299e54 100644 (file)
@@ -301,8 +301,8 @@ EncodeServer::broadcast_received ()
                /* Reply to the client saying what we can do */
                xmlpp::Document doc;
                auto root = doc.create_root_node ("ServerAvailable");
-               root->add_child("Threads")->add_child_text (raw_convert<string> (_worker_threads.size ()));
-               root->add_child("Version")->add_child_text (raw_convert<string> (SERVER_LINK_VERSION));
+               cxml::add_text_child(root, "Threads", raw_convert<string>(_worker_threads.size()));
+               cxml::add_text_child(root, "Version", raw_convert<string>(SERVER_LINK_VERSION));
                auto xml = doc.write_to_string ("UTF-8");
 
                if (_verbose) {
index e030b98e26ceeed3c8d6c2fc6fd7c02e57048cb7..4dfbb902796565df2d49337d62eec8c2ca98fc00 100644 (file)
@@ -77,7 +77,7 @@ ExportConfig::read(cxml::ConstNodePtr node)
 
 
 void
-ExportConfig::write(xmlpp::Element* node) const
+ExportConfig::write(xmlpp::Element* element) const
 {
        string name;
 
@@ -97,11 +97,11 @@ ExportConfig::write(xmlpp::Element* node) const
                        break;
        }
 
-       node->add_child("Format")->add_child_text(name);
-       node->add_child("MixdownToStereo")->add_child_text(_mixdown_to_stereo ? "1" : "0");
-       node->add_child("SplitReels")->add_child_text(_split_reels ? "1" : "0");
-       node->add_child("SplitStreams")->add_child_text(_split_streams ? "1" : "0");
-       node->add_child("X264CRF")->add_child_text(dcp::raw_convert<string>(_x264_crf));
+       cxml::add_text_child(element, "Format", name);
+       cxml::add_text_child(element, "MixdownToStereo", _mixdown_to_stereo ? "1" : "0");
+       cxml::add_text_child(element, "SplitReels", _split_reels ? "1" : "0");
+       cxml::add_text_child(element, "SplitStreams", _split_streams ? "1" : "0");
+       cxml::add_text_child(element, "X264CRF", dcp::raw_convert<string>(_x264_crf));
 }
 
 
index 47dddb6c3783c8ce6a5e7542256d2b996df35b13..52d7b601d8ea2dca91ffcbd75e2f98c5fa0b2b25 100644 (file)
@@ -37,7 +37,7 @@ public:
 
        void set_defaults();
        void read(cxml::ConstNodePtr node);
-       void write(xmlpp::Element* node) const;
+       void write(xmlpp::Element* element) const;
 
        ExportFormat format() const {
                return _format;
index 9400eb60dddd6c46fc2d90853b5339e098ca40b5..24f96b889217edf6581bcbbcfd42778dc0e8b7fb 100644 (file)
@@ -52,19 +52,19 @@ FFmpegAudioStream::FFmpegAudioStream (cxml::ConstNodePtr node, int version)
 
 
 void
-FFmpegAudioStream::as_xml (xmlpp::Node* root) const
+FFmpegAudioStream::as_xml(xmlpp::Element* root) const
 {
        FFmpegStream::as_xml (root);
-       root->add_child("FrameRate")->add_child_text(raw_convert<string>(frame_rate()));
-       root->add_child("Length")->add_child_text(raw_convert<string>(length()));
-       mapping().as_xml (root->add_child("Mapping"));
+       cxml::add_text_child(root, "FrameRate", raw_convert<string>(frame_rate()));
+       cxml::add_text_child(root, "Length", raw_convert<string>(length()));
+       mapping().as_xml(cxml::add_child(root, "Mapping"));
        if (first_audio) {
-               root->add_child("FirstAudio")->add_child_text(raw_convert<string>(first_audio.get().get()));
+               cxml::add_text_child(root, "FirstAudio", raw_convert<string>(first_audio.get().get()));
        }
        if (codec_name) {
-               root->add_child("CodecName")->add_child_text(codec_name.get());
+               cxml::add_text_child(root, "CodecName", codec_name.get());
        }
        if (bit_depth()) {
-               root->add_child("BitDepth")->add_child_text(raw_convert<string>(bit_depth().get()));
+               cxml::add_text_child(root, "BitDepth", raw_convert<string>(bit_depth().get()));
        }
 }
index aae982f9e81ff6ecaff40f62b384dc893cf067dc..afd30e905a9445c766e6eef429393b593f56c815 100644 (file)
@@ -48,7 +48,7 @@ public:
 
        FFmpegAudioStream (cxml::ConstNodePtr, int);
 
-       void as_xml (xmlpp::Node *) const;
+       void as_xml(xmlpp::Element*) const;
 
        /* XXX: should probably be locked */
 
index c788e7cb1d271296fd201477f9e0e6631de0c32b..8baa40c1b63dfcf6252348900f67bb3a3d90e42a 100644 (file)
@@ -197,61 +197,61 @@ FFmpegContent::FFmpegContent (vector<shared_ptr<Content>> c)
 
 
 void
-FFmpegContent::as_xml (xmlpp::Node* node, bool with_paths) const
+FFmpegContent::as_xml(xmlpp::Element* element, bool with_paths) const
 {
-       node->add_child("Type")->add_child_text("FFmpeg");
-       Content::as_xml (node, with_paths);
+       cxml::add_text_child(element, "Type", "FFmpeg");
+       Content::as_xml(element, with_paths);
 
        if (video) {
-               video->as_xml (node);
+               video->as_xml(element);
        }
 
        if (audio) {
-               audio->as_xml (node);
+               audio->as_xml(element);
 
                for (auto i: audio->streams()) {
                        auto f = dynamic_pointer_cast<FFmpegAudioStream> (i);
                        DCPOMATIC_ASSERT (f);
-                       f->as_xml (node->add_child("AudioStream"));
+                       f->as_xml(cxml::add_child(element, "AudioStream"));
                }
        }
 
        if (only_text()) {
-               only_text()->as_xml (node);
+               only_text()->as_xml(element);
        }
 
        boost::mutex::scoped_lock lm (_mutex);
 
        for (auto i: _subtitle_streams) {
-               auto t = node->add_child("SubtitleStream");
+               auto t = cxml::add_child(element, "SubtitleStream");
                if (_subtitle_stream && i == _subtitle_stream) {
-                       t->add_child("Selected")->add_child_text("1");
+                       cxml::add_text_child(t, "Selected", "1");
                }
                i->as_xml (t);
        }
 
        for (auto i: _filters) {
-               node->add_child("Filter")->add_child_text(i.id());
+               cxml::add_text_child(element, "Filter", i.id());
        }
 
        if (_first_video) {
-               node->add_child("FirstVideo")->add_child_text(raw_convert<string>(_first_video.get().get()));
+               cxml::add_text_child(element, "FirstVideo", raw_convert<string>(_first_video.get().get()));
        }
 
        if (_color_range) {
-               node->add_child("ColorRange")->add_child_text(raw_convert<string>(static_cast<int>(*_color_range)));
+               cxml::add_text_child(element, "ColorRange", raw_convert<string>(static_cast<int>(*_color_range)));
        }
        if (_color_primaries) {
-               node->add_child("ColorPrimaries")->add_child_text(raw_convert<string>(static_cast<int>(*_color_primaries)));
+               cxml::add_text_child(element, "ColorPrimaries", raw_convert<string>(static_cast<int>(*_color_primaries)));
        }
        if (_color_trc) {
-               node->add_child("ColorTransferCharacteristic")->add_child_text(raw_convert<string>(static_cast<int>(*_color_trc)));
+               cxml::add_text_child(element, "ColorTransferCharacteristic", raw_convert<string>(static_cast<int>(*_color_trc)));
        }
        if (_colorspace) {
-               node->add_child("Colorspace")->add_child_text(raw_convert<string>(static_cast<int>(*_colorspace)));
+               cxml::add_text_child(element, "Colorspace", raw_convert<string>(static_cast<int>(*_colorspace)));
        }
        if (_bits_per_pixel) {
-               node->add_child("BitsPerPixel")->add_child_text(raw_convert<string>(*_bits_per_pixel));
+               cxml::add_text_child(element, "BitsPerPixel", raw_convert<string>(*_bits_per_pixel));
        }
 }
 
index a86358b7677ec46eb07f143585c1cfccf2788647..ce067f2d35b1f310595c51b11db4fc1baa1afdd9 100644 (file)
@@ -70,7 +70,7 @@ public:
        void take_settings_from (std::shared_ptr<const Content> c) override;
        std::string summary () const override;
        std::string technical_summary () const override;
-       void as_xml (xmlpp::Node *, bool with_paths) const override;
+       void as_xml(xmlpp::Element* element, bool with_paths) const override;
        dcpomatic::DCPTime full_length (std::shared_ptr<const Film> film) const override;
        dcpomatic::DCPTime approximate_length () const override;
 
index 2fcd486dfafc72daa641f0a7c50e6c891c8c9d01..0ee41deabd1dd6af427a9a2c6c787fae35eec2b7 100644 (file)
@@ -234,9 +234,9 @@ FFmpegImageProxy::image (Image::Alignment alignment, optional<dcp::Size>) const
 
 
 void
-FFmpegImageProxy::add_metadata (xmlpp::Node* node) const
+FFmpegImageProxy::add_metadata(xmlpp::Element* element) const
 {
-       node->add_child("Type")->add_child_text (N_("FFmpeg"));
+       cxml::add_text_child(element, "Type", N_("FFmpeg"));
 }
 
 void
index b567fadee0825e2c6506746c6d44739c999132ea..1b8f44a7a87bd0b0cfdb4772c8121ce3727483d0 100644 (file)
@@ -35,7 +35,7 @@ public:
                boost::optional<dcp::Size> size = boost::optional<dcp::Size> ()
                ) const override;
 
-       void add_metadata (xmlpp::Node *) const override;
+       void add_metadata(xmlpp::Element*) const override;
        void write_to_socket (std::shared_ptr<Socket>) const override;
        bool same (std::shared_ptr<const ImageProxy> other) const override;
        size_t memory_used () const override;
index 47f71d1195bcbb2a169b5661c31171a8bd165c11..800c45eb6b45685d5258169074e77bace1a0eca6 100644 (file)
@@ -40,10 +40,10 @@ FFmpegStream::FFmpegStream (cxml::ConstNodePtr node)
 }
 
 void
-FFmpegStream::as_xml (xmlpp::Node* root) const
+FFmpegStream::as_xml(xmlpp::Element* root) const
 {
-       root->add_child("Name")->add_child_text (name);
-       root->add_child("Id")->add_child_text (raw_convert<string> (_id));
+       cxml::add_text_child(root, "Name", name);
+       cxml::add_text_child(root, "Id", raw_convert<string>(_id));
 }
 
 bool
index 84b2a8853317082b676f651bee47f11de3bc940b..221075eebec32a95c60a63de6b39302ffef87c6a 100644 (file)
@@ -37,7 +37,7 @@ public:
 
        explicit FFmpegStream (cxml::ConstNodePtr);
 
-       void as_xml (xmlpp::Node *) const;
+       void as_xml(xmlpp::Element*) const;
 
        /** @param c An AVFormatContext.
         *  @param index A stream index within the AVFormatContext.
index 1101901b7f1b20a83a192129b8361f5ce4d9cba5..3f43b6ec5773fe130873930d84c87f323c3e733e 100644 (file)
@@ -49,15 +49,15 @@ FFmpegSubtitleStream::FFmpegSubtitleStream (cxml::ConstNodePtr node, int version
 }
 
 void
-FFmpegSubtitleStream::as_xml (xmlpp::Node* root) const
+FFmpegSubtitleStream::as_xml(xmlpp::Element* root) const
 {
-       FFmpegStream::as_xml (root);
+       FFmpegStream::as_xml(root);
 
        boost::mutex::scoped_lock lm (_mutex);
        for (map<RGBA, RGBA>::const_iterator i = _colours.begin(); i != _colours.end(); ++i) {
-               xmlpp::Node* node = root->add_child("Colour");
-               i->first.as_xml (node->add_child("From"));
-               i->second.as_xml (node->add_child("To"));
+               auto node = cxml::add_child(root, "Colour");
+               i->first.as_xml(cxml::add_child(node, "From"));
+               i->second.as_xml(cxml::add_child(node, "To"));
        }
 }
 
index 8f56d1975e5e7eb5defa7b529af64af4909fef06..6251350cecee9045f1881077cd69f94529a4f8f9 100644 (file)
@@ -33,7 +33,7 @@ public:
 
        FFmpegSubtitleStream (cxml::ConstNodePtr node, int version);
 
-       void as_xml (xmlpp::Node *) const;
+       void as_xml(xmlpp::Element*) const;
 
        void set_colour (RGBA from, RGBA to);
        std::map<RGBA, RGBA> colours () const;
index d2c73c8b5ef5e02269d27c2e11637e601eff7f39..a88e8a855573d62a270ccf9a2eb35a428b9df0aa 100644 (file)
@@ -380,91 +380,91 @@ Film::metadata (bool with_content_paths) const
        auto doc = make_shared<xmlpp::Document>();
        auto root = doc->create_root_node ("Metadata");
 
-       root->add_child("Version")->add_child_text (raw_convert<string> (current_state_version));
-       auto last_write = root->add_child("LastWrittenBy");
+       cxml::add_text_child(root, "Version", raw_convert<string>(current_state_version));
+       auto last_write = cxml::add_child(root, "LastWrittenBy");
        last_write->add_child_text (dcpomatic_version);
        last_write->set_attribute("git", dcpomatic_git_commit);
-       root->add_child("Name")->add_child_text (_name);
-       root->add_child("UseISDCFName")->add_child_text (_use_isdcf_name ? "1" : "0");
+       cxml::add_text_child(root, "Name", _name);
+       cxml::add_text_child(root, "UseISDCFName", _use_isdcf_name ? "1" : "0");
 
        if (_dcp_content_type) {
-               root->add_child("DCPContentType")->add_child_text (_dcp_content_type->isdcf_name ());
+               cxml::add_text_child(root, "DCPContentType", _dcp_content_type->isdcf_name());
        }
 
        if (_container) {
-               root->add_child("Container")->add_child_text (_container->id ());
-       }
-
-       root->add_child("Resolution")->add_child_text (resolution_to_string (_resolution));
-       root->add_child("J2KBandwidth")->add_child_text (raw_convert<string> (_j2k_bandwidth));
-       root->add_child("VideoFrameRate")->add_child_text (raw_convert<string> (_video_frame_rate));
-       root->add_child("AudioFrameRate")->add_child_text(raw_convert<string>(_audio_frame_rate));
-       root->add_child("ISDCFDate")->add_child_text (boost::gregorian::to_iso_string (_isdcf_date));
-       root->add_child("AudioChannels")->add_child_text (raw_convert<string> (_audio_channels));
-       root->add_child("ThreeD")->add_child_text (_three_d ? "1" : "0");
-       root->add_child("Sequence")->add_child_text (_sequence ? "1" : "0");
-       root->add_child("Interop")->add_child_text (_interop ? "1" : "0");
-       root->add_child("LimitToSMPTEBv20")->add_child_text(_limit_to_smpte_bv20 ? "1" : "0");
-       root->add_child("Encrypted")->add_child_text (_encrypted ? "1" : "0");
-       root->add_child("Key")->add_child_text (_key.hex ());
-       root->add_child("ContextID")->add_child_text (_context_id);
+               cxml::add_text_child(root, "Container", _container->id());
+       }
+
+       cxml::add_text_child(root, "Resolution", resolution_to_string(_resolution));
+       cxml::add_text_child(root, "J2KBandwidth", raw_convert<string>(_j2k_bandwidth));
+       cxml::add_text_child(root, "VideoFrameRate", raw_convert<string>(_video_frame_rate));
+       cxml::add_text_child(root, "AudioFrameRate", raw_convert<string>(_audio_frame_rate));
+       cxml::add_text_child(root, "ISDCFDate", boost::gregorian::to_iso_string(_isdcf_date));
+       cxml::add_text_child(root, "AudioChannels", raw_convert<string>(_audio_channels));
+       cxml::add_text_child(root, "ThreeD", _three_d ? "1" : "0");
+       cxml::add_text_child(root, "Sequence", _sequence ? "1" : "0");
+       cxml::add_text_child(root, "Interop", _interop ? "1" : "0");
+       cxml::add_text_child(root, "LimitToSMPTEBv20", _limit_to_smpte_bv20 ? "1" : "0");
+       cxml::add_text_child(root, "Encrypted", _encrypted ? "1" : "0");
+       cxml::add_text_child(root, "Key", _key.hex ());
+       cxml::add_text_child(root, "ContextID", _context_id);
        if (_audio_processor) {
-               root->add_child("AudioProcessor")->add_child_text (_audio_processor->id ());
+               cxml::add_text_child(root, "AudioProcessor", _audio_processor->id());
        }
-       root->add_child("ReelType")->add_child_text (raw_convert<string> (static_cast<int> (_reel_type)));
-       root->add_child("ReelLength")->add_child_text (raw_convert<string> (_reel_length));
+       cxml::add_text_child(root, "ReelType", raw_convert<string>(static_cast<int> (_reel_type)));
+       cxml::add_text_child(root, "ReelLength", raw_convert<string>(_reel_length));
        for (auto boundary: _custom_reel_boundaries) {
-               root->add_child("CustomReelBoundary")->add_child_text(raw_convert<string>(boundary.get()));
+               cxml::add_text_child(root, "CustomReelBoundary", raw_convert<string>(boundary.get()));
        }
-       root->add_child("ReencodeJ2K")->add_child_text (_reencode_j2k ? "1" : "0");
-       root->add_child("UserExplicitVideoFrameRate")->add_child_text(_user_explicit_video_frame_rate ? "1" : "0");
+       cxml::add_text_child(root, "ReencodeJ2K", _reencode_j2k ? "1" : "0");
+       cxml::add_text_child(root, "UserExplicitVideoFrameRate", _user_explicit_video_frame_rate ? "1" : "0");
        for (auto const& marker: _markers) {
-               auto m = root->add_child("Marker");
+               auto m = cxml::add_child(root, "Marker");
                m->set_attribute("type", dcp::marker_to_string(marker.first));
                m->add_child_text(raw_convert<string>(marker.second.get()));
        }
        for (auto i: _ratings) {
-               i.as_xml (root->add_child("Rating"));
+               i.as_xml(cxml::add_child(root, "Rating"));
        }
        for (auto i: _content_versions) {
-               root->add_child("ContentVersion")->add_child_text(i);
+               cxml::add_text_child(root, "ContentVersion", i);
        }
-       root->add_child("NameLanguage")->add_child_text(_name_language.to_string());
-       root->add_child("TerritoryType")->add_child_text(territory_type_to_string(_territory_type));
+       cxml::add_text_child(root, "NameLanguage", _name_language.to_string());
+       cxml::add_text_child(root, "TerritoryType", territory_type_to_string(_territory_type));
        if (_release_territory) {
-               root->add_child("ReleaseTerritory")->add_child_text(_release_territory->subtag());
+               cxml::add_text_child(root, "ReleaseTerritory", _release_territory->subtag());
        }
        if (_sign_language_video_language) {
-               root->add_child("SignLanguageVideoLanguage")->add_child_text(_sign_language_video_language->to_string());
+               cxml::add_text_child(root, "SignLanguageVideoLanguage", _sign_language_video_language->to_string());
        }
-       root->add_child("VersionNumber")->add_child_text(raw_convert<string>(_version_number));
-       root->add_child("Status")->add_child_text(dcp::status_to_string(_status));
+       cxml::add_text_child(root, "VersionNumber", raw_convert<string>(_version_number));
+       cxml::add_text_child(root, "Status", dcp::status_to_string(_status));
        if (_chain) {
-               root->add_child("Chain")->add_child_text(*_chain);
+               cxml::add_text_child(root, "Chain", *_chain);
        }
        if (_distributor) {
-               root->add_child("Distributor")->add_child_text(*_distributor);
+               cxml::add_text_child(root, "Distributor", *_distributor);
        }
        if (_facility) {
-               root->add_child("Facility")->add_child_text(*_facility);
+               cxml::add_text_child(root, "Facility", *_facility);
        }
        if (_studio) {
-               root->add_child("Studio")->add_child_text(*_studio);
+               cxml::add_text_child(root, "Studio", *_studio);
        }
-       root->add_child("TempVersion")->add_child_text(_temp_version ? "1" : "0");
-       root->add_child("PreRelease")->add_child_text(_pre_release ? "1" : "0");
-       root->add_child("RedBand")->add_child_text(_red_band ? "1" : "0");
-       root->add_child("TwoDVersionOfThreeD")->add_child_text(_two_d_version_of_three_d ? "1" : "0");
+       cxml::add_text_child(root, "TempVersion", _temp_version ? "1" : "0");
+       cxml::add_text_child(root, "PreRelease", _pre_release ? "1" : "0");
+       cxml::add_text_child(root, "RedBand", _red_band ? "1" : "0");
+       cxml::add_text_child(root, "TwoDVersionOfThreeD", _two_d_version_of_three_d ? "1" : "0");
        if (_luminance) {
-               root->add_child("LuminanceValue")->add_child_text(raw_convert<string>(_luminance->value()));
-               root->add_child("LuminanceUnit")->add_child_text(dcp::Luminance::unit_to_string(_luminance->unit()));
+               cxml::add_text_child(root, "LuminanceValue", raw_convert<string>(_luminance->value()));
+               cxml::add_text_child(root, "LuminanceUnit", dcp::Luminance::unit_to_string(_luminance->unit()));
        }
-       root->add_child("UserExplicitContainer")->add_child_text(_user_explicit_container ? "1" : "0");
-       root->add_child("UserExplicitResolution")->add_child_text(_user_explicit_resolution ? "1" : "0");
+       cxml::add_text_child(root, "UserExplicitContainer", _user_explicit_container ? "1" : "0");
+       cxml::add_text_child(root, "UserExplicitResolution", _user_explicit_resolution ? "1" : "0");
        if (_audio_language) {
-               root->add_child("AudioLanguage")->add_child_text(_audio_language->to_string());
+               cxml::add_text_child(root, "AudioLanguage", _audio_language->to_string());
        }
-       _playlist->as_xml (root->add_child ("Playlist"), with_content_paths);
+       _playlist->as_xml(cxml::add_child(root, "Playlist"), with_content_paths);
 
        return doc;
 }
@@ -2310,7 +2310,7 @@ Film::write_ui_state() const
        auto root = doc->create_root_node("UI");
 
        for (auto state: _ui_state) {
-               root->add_child(state.first)->add_child_text(state.second);
+               cxml::add_text_child(root, state.first, state.second);
        }
 
        try {
index 955a2ad1ca2821b94ad43df82829d12ba2449b5d..246d3eeb8a67998af65ab4a24a11718ea867913f 100644 (file)
@@ -63,11 +63,11 @@ Font& Font::operator=(Font const& other)
 
 
 void
-Font::as_xml (xmlpp::Node* node)
+Font::as_xml(xmlpp::Element* element)
 {
-       node->add_child("Id")->add_child_text(_id);
+       cxml::add_text_child(element, "Id", _id);
        if (_content.file) {
-               node->add_child("File")->add_child_text(_content.file->string());
+               cxml::add_text_child(element, "File", _content.file->string());
        }
 }
 
index 12a14aba4e74086dee82c93d3a6464dd6159dee7..092b682bac1cd496d17f2d2ad5399166112eab2b 100644 (file)
@@ -57,7 +57,7 @@ public:
        Font(Font const& other);
        Font& operator=(Font const& other);
 
-       void as_xml (xmlpp::Node* node);
+       void as_xml(xmlpp::Element* element);
 
        std::string id () const {
                return _id;
index 1a92c944ed8047cdceb50f7f43b46e894923a323..1ac6e085bdc6cebbefdfad195b4fb5a4628b96b1 100644 (file)
@@ -99,13 +99,13 @@ ImageContent::technical_summary () const
 
 
 void
-ImageContent::as_xml (xmlpp::Node* node, bool with_paths) const
+ImageContent::as_xml(xmlpp::Element* element, bool with_paths) const
 {
-       node->add_child("Type")->add_child_text ("Image");
-       Content::as_xml (node, with_paths);
+       cxml::add_text_child(element, "Type", "Image");
+       Content::as_xml(element, with_paths);
 
        if (video) {
-               video->as_xml (node);
+               video->as_xml(element);
        }
 }
 
index d817eeee84e4cc0b6a2685666db207eae79a0025..140159bfaa77e5f0e890ce46954628459e099361 100644 (file)
@@ -40,7 +40,7 @@ public:
        void examine (std::shared_ptr<const Film> film, std::shared_ptr<Job>) override;
        std::string summary () const override;
        std::string technical_summary () const override;
-       void as_xml (xmlpp::Node *, bool with_paths) const override;
+       void as_xml(xmlpp::Element*, bool with_paths) const override;
        dcpomatic::DCPTime full_length (std::shared_ptr<const Film> film) const override;
        dcpomatic::DCPTime approximate_length () const override;
 
index a37be580fcf062fbb247e1d02285e532d49279da..cec13b7732e162b8c57fb033f2f3a7b6eed20d55 100644 (file)
@@ -41,7 +41,7 @@ class Image;
 class Socket;
 
 namespace xmlpp {
-       class Node;
+       class Element;
 }
 
 namespace cxml {
@@ -101,7 +101,7 @@ public:
                boost::optional<dcp::Size> size = boost::optional<dcp::Size> ()
                ) const = 0;
 
-       virtual void add_metadata (xmlpp::Node *) const = 0;
+       virtual void add_metadata(xmlpp::Element *) const = 0;
        virtual void write_to_socket (std::shared_ptr<Socket>) const = 0;
        /** @return true if our image is definitely the same as another, false if it is probably not */
        virtual bool same (std::shared_ptr<const ImageProxy>) const = 0;
index 269b01bca7457c65dfe0377240bb4b7fbbdc7348..869e96967723d279142a5249de0f1e09b0534739 100644 (file)
@@ -192,15 +192,15 @@ J2KImageProxy::image (Image::Alignment alignment, optional<dcp::Size> target_siz
 
 
 void
-J2KImageProxy::add_metadata (xmlpp::Node* node) const
+J2KImageProxy::add_metadata(xmlpp::Element* element) const
 {
-       node->add_child("Type")->add_child_text(N_("J2K"));
-       node->add_child("Width")->add_child_text(raw_convert<string>(_size.width));
-       node->add_child("Height")->add_child_text(raw_convert<string>(_size.height));
+       cxml::add_text_child(element, "Type", N_("J2K"));
+       cxml::add_text_child(element, "Width", raw_convert<string>(_size.width));
+       cxml::add_text_child(element, "Height", raw_convert<string>(_size.height));
        if (_eye) {
-               node->add_child("Eye")->add_child_text(raw_convert<string>(static_cast<int>(_eye.get())));
+               cxml::add_text_child(element, "Eye", raw_convert<string>(static_cast<int>(_eye.get())));
        }
-       node->add_child("Size")->add_child_text(raw_convert<string>(_data->size()));
+       cxml::add_text_child(element, "Size", raw_convert<string>(_data->size()));
 }
 
 
index 9666ea406784f9981780661e60ba39c7dcfb2c31..3346fff08c4dc8d8cc82d5270468c52d0d17dd11 100644 (file)
@@ -61,7 +61,7 @@ public:
                boost::optional<dcp::Size> size = boost::optional<dcp::Size> ()
                ) const override;
 
-       void add_metadata (xmlpp::Node *) const override;
+       void add_metadata(xmlpp::Element*) const override;
        void write_to_socket (std::shared_ptr<Socket> override) const override;
        /** @return true if our image is definitely the same as another, false if it is probably not */
        bool same (std::shared_ptr<const ImageProxy>) const override;
index 671e9797c24cbfb40e2b9bdf509538d2cf1dc391..c33eb1b9fa962fcd0e308af21d4770aad10c08dc 100644 (file)
@@ -39,14 +39,14 @@ KDMRecipient::KDMRecipient (cxml::ConstNodePtr node)
 void
 KDMRecipient::as_xml (xmlpp::Element* parent) const
 {
-       parent->add_child("Name")->add_child_text(name);
+       cxml::add_text_child(parent, "Name", name);
        if (recipient) {
-               parent->add_child("Recipient")->add_child_text(recipient->certificate(true));
+               cxml::add_text_child(parent, "Recipient", recipient->certificate(true));
        }
        if (recipient_file) {
-               parent->add_child("RecipientFile")->add_child_text(*recipient_file);
+               cxml::add_text_child(parent, "RecipientFile", *recipient_file);
        }
 
-       parent->add_child("Notes")->add_child_text(notes);
+       cxml::add_text_child(parent, "Notes", notes);
 }
 
index 7c1d285cffd3d0c1b55b0384f73cc582b10cd135..07690f3ac3537cd2e5b2528fef7c6278db4775d1 100644 (file)
@@ -34,8 +34,8 @@ PixelQuanta::PixelQuanta (cxml::ConstNodePtr node)
 void
 PixelQuanta::as_xml (xmlpp::Element* node) const
 {
-       node->add_child("X")->add_child_text(dcp::raw_convert<std::string>(x));
-       node->add_child("Y")->add_child_text(dcp::raw_convert<std::string>(y));
+       cxml::add_text_child(node, "X", dcp::raw_convert<std::string>(x));
+       cxml::add_text_child(node, "Y", dcp::raw_convert<std::string>(y));
 }
 
 
index b39f83908222bce2fd7313e944edc2d3199362d0..247301d582312f83656bce2d270a2bcc1319d9b1 100644 (file)
@@ -200,29 +200,29 @@ PlayerVideo::make_image (function<AVPixelFormat (AVPixelFormat)> pixel_format, V
 
 
 void
-PlayerVideo::add_metadata (xmlpp::Node* node) const
+PlayerVideo::add_metadata(xmlpp::Element* element) const
 {
-       _crop.as_xml (node);
+       _crop.as_xml(element);
        if (_fade) {
-               node->add_child("Fade")->add_child_text (raw_convert<string> (_fade.get ()));
+               cxml::add_text_child(element, "Fade", raw_convert<string>(_fade.get()));
        }
-       _in->add_metadata (node->add_child ("In"));
-       node->add_child("InterWidth")->add_child_text (raw_convert<string> (_inter_size.width));
-       node->add_child("InterHeight")->add_child_text (raw_convert<string> (_inter_size.height));
-       node->add_child("OutWidth")->add_child_text (raw_convert<string> (_out_size.width));
-       node->add_child("OutHeight")->add_child_text (raw_convert<string> (_out_size.height));
-       node->add_child("Eyes")->add_child_text (raw_convert<string> (static_cast<int> (_eyes)));
-       node->add_child("Part")->add_child_text (raw_convert<string> (static_cast<int> (_part)));
-       node->add_child("VideoRange")->add_child_text(raw_convert<string>(static_cast<int>(_video_range)));
-       node->add_child("Error")->add_child_text(_error ? "1" : "0");
+       _in->add_metadata(cxml::add_child(element, "In"));
+       cxml::add_text_child(element, "InterWidth", raw_convert<string>(_inter_size.width));
+       cxml::add_text_child(element, "InterHeight", raw_convert<string>(_inter_size.height));
+       cxml::add_text_child(element, "OutWidth", raw_convert<string>(_out_size.width));
+       cxml::add_text_child(element, "OutHeight", raw_convert<string>(_out_size.height));
+       cxml::add_text_child(element, "Eyes", raw_convert<string>(static_cast<int>(_eyes)));
+       cxml::add_text_child(element, "Part", raw_convert<string>(static_cast<int>(_part)));
+       cxml::add_text_child(element, "VideoRange", raw_convert<string>(static_cast<int>(_video_range)));
+       cxml::add_text_child(element, "Error", _error ? "1" : "0");
        if (_colour_conversion) {
-               _colour_conversion.get().as_xml (node);
+               _colour_conversion.get().as_xml(element);
        }
        if (_text) {
-               node->add_child ("SubtitleWidth")->add_child_text (raw_convert<string> (_text->image->size().width));
-               node->add_child ("SubtitleHeight")->add_child_text (raw_convert<string> (_text->image->size().height));
-               node->add_child ("SubtitleX")->add_child_text (raw_convert<string> (_text->position.x));
-               node->add_child ("SubtitleY")->add_child_text (raw_convert<string> (_text->position.y));
+               cxml::add_text_child(element, "SubtitleWidth", raw_convert<string>(_text->image->size().width));
+               cxml::add_text_child(element, "SubtitleHeight", raw_convert<string>(_text->image->size().height));
+               cxml::add_text_child(element, "SubtitleX", raw_convert<string>(_text->position.x));
+               cxml::add_text_child(element, "SubtitleY", raw_convert<string>(_text->position.y));
        }
 }
 
index 10b2078a00af83e73b1505b97aa2801145c9edde..e2968749c48dc3ebf2e693e05550aee9b4a51192 100644 (file)
@@ -82,7 +82,7 @@ public:
        static AVPixelFormat force (AVPixelFormat);
        static AVPixelFormat keep_xyz_or_rgb (AVPixelFormat);
 
-       void add_metadata (xmlpp::Node* node) const;
+       void add_metadata(xmlpp::Element* element) const;
        void write_to_socket (std::shared_ptr<Socket> socket) const;
 
        bool reset_metadata (std::shared_ptr<const Film> film, dcp::Size player_video_container_size);
index 85957e106803be886e4f5a85016f15cc21282282..7f83e94740bc4b6dc3b4837090aab81bb1e4f692 100644 (file)
@@ -282,10 +282,10 @@ Playlist::set_from_xml (shared_ptr<const Film> film, cxml::ConstNodePtr node, in
  *  @param with_content_paths true to include &lt;Path&gt; nodes in &lt;Content&gt; nodes, false to omit them.
  */
 void
-Playlist::as_xml (xmlpp::Node* node, bool with_content_paths)
+Playlist::as_xml(xmlpp::Element* element, bool with_content_paths)
 {
        for (auto i: content()) {
-               i->as_xml (node->add_child ("Content"), with_content_paths);
+               i->as_xml(cxml::add_child(element, "Content"), with_content_paths);
        }
 }
 
index e2662eb4581d78293f7d344c6e35619eaae9c400..7b9bd19fac914ed644e2251a29ccadf7f6e37539 100644 (file)
@@ -50,7 +50,7 @@ public:
        Playlist (Playlist const&) = delete;
        Playlist& operator= (Playlist const&) = delete;
 
-       void as_xml (xmlpp::Node *, bool with_content_paths);
+       void as_xml(xmlpp::Element*, bool with_content_paths);
        void set_from_xml (std::shared_ptr<const Film> film, cxml::ConstNodePtr node, int version, std::list<std::string>& notes);
 
        void add (std::shared_ptr<const Film> film, std::shared_ptr<Content>);
index c606ddd9906520b128c1009517d2c706dd180659..1ad78827c51d362ac237e489a9b38bc44b2f6ade 100644 (file)
@@ -73,12 +73,12 @@ RawImageProxy::image (Image::Alignment alignment, optional<dcp::Size>) const
 
 
 void
-RawImageProxy::add_metadata (xmlpp::Node* node) const
+RawImageProxy::add_metadata(xmlpp::Element* element) const
 {
-       node->add_child("Type")->add_child_text(N_("Raw"));
-       node->add_child("Width")->add_child_text(raw_convert<string>(_image->size().width));
-       node->add_child("Height")->add_child_text(raw_convert<string>(_image->size().height));
-       node->add_child("PixelFormat")->add_child_text(raw_convert<string>(static_cast<int>(_image->pixel_format())));
+       cxml::add_text_child(element, "Type", N_("Raw"));
+       cxml::add_text_child(element, "Width", raw_convert<string>(_image->size().width));
+       cxml::add_text_child(element, "Height", raw_convert<string>(_image->size().height));
+       cxml::add_text_child(element, "PixelFormat", raw_convert<string>(static_cast<int>(_image->pixel_format())));
 }
 
 
index d5ae2457d265ed156da08da1b9a269d10408e437..852f7c07677c9b66c5fa34df0bc98f805db285c9 100644 (file)
@@ -37,7 +37,7 @@ public:
                boost::optional<dcp::Size> size = boost::optional<dcp::Size> ()
                ) const override;
 
-       void add_metadata (xmlpp::Node *) const override;
+       void add_metadata(xmlpp::Element*) const override;
        void write_to_socket (std::shared_ptr<Socket>) const override;
        bool same (std::shared_ptr<const ImageProxy>) const override;
        size_t memory_used () const override;
index 2e6a4fab632aa6e64c251fba52ac51f899d44dc0..2e0408d8ab5ddd730e32c1ad02b1a73ed0ce2558 100644 (file)
@@ -41,12 +41,12 @@ RGBA::RGBA (cxml::ConstNodePtr node)
 
 
 void
-RGBA::as_xml (xmlpp::Node* parent) const
+RGBA::as_xml(xmlpp::Element* parent) const
 {
-       parent->add_child("R")->add_child_text(lexical_cast<string>(int(r)));
-       parent->add_child("G")->add_child_text(lexical_cast<string>(int(g)));
-       parent->add_child("B")->add_child_text(lexical_cast<string>(int(b)));
-       parent->add_child("A")->add_child_text(lexical_cast<string>(int(a)));
+       cxml::add_text_child(parent, "R", lexical_cast<string>(int(r)));
+       cxml::add_text_child(parent, "G", lexical_cast<string>(int(g)));
+       cxml::add_text_child(parent, "B", lexical_cast<string>(int(b)));
+       cxml::add_text_child(parent, "A", lexical_cast<string>(int(a)));
 }
 
 
index 96fed710ef4582e3cc5676bc77d0aa0f5429e147..a582a4ca103e9f2fe4c0707dfea621bb0ea77e3c 100644 (file)
@@ -44,7 +44,7 @@ public:
 
        explicit RGBA (cxml::ConstNodePtr node);
 
-       void as_xml (xmlpp::Node* parent) const;
+       void as_xml(xmlpp::Element* parent) const;
 
        uint8_t r = 0;
        uint8_t g = 0;
index f0c80cd794f7a27e524859a76f7bdba85536e7ff..38c474850d64c2efe10d7b5322a95728a7e66ba4 100644 (file)
@@ -57,7 +57,7 @@ Screen::as_xml (xmlpp::Element* parent) const
 {
        KDMRecipient::as_xml (parent);
        for (auto i: trusted_devices) {
-               parent->add_child("TrustedDevice")->add_child_text(i.as_string());
+               cxml::add_text_child(parent, "TrustedDevice", i.as_string());
        }
 }
 
index f49f11a7d26ac15cb8b1429b6bd64b36ee3618ac..e87465cdc5dd6909bf71ef05fbce63fe86ce6e06 100644 (file)
@@ -62,10 +62,10 @@ SPL::write (boost::filesystem::path path) const
 {
        xmlpp::Document doc;
        auto root = doc.create_root_node ("SPL");
-       root->add_child("Id")->add_child_text (_id);
-       root->add_child("Name")->add_child_text (_name);
+       cxml::add_text_child(root, "Id", _id);
+       cxml::add_text_child(root, "Name", _name);
        for (auto i: _spl) {
-               i.as_xml (root->add_child("Entry"));
+               i.as_xml(cxml::add_child(root, "Entry"));
        }
        doc.write_to_file_formatted (path.string());
 }
index f0b377a56bfe5b6d0b983f22aa293a4b39702f2a..a77b0b7d5a4e350ed2253da79b5686aef25b67f7 100644 (file)
@@ -53,5 +53,5 @@ SPLEntry::SPLEntry (shared_ptr<Content> c)
 void
 SPLEntry::as_xml (xmlpp::Element* e)
 {
-       e->add_child("Digest")->add_child_text(digest);
+       cxml::add_text_child(e, "Digest", digest);
 }
index d8c195be77af1fe53ada9e66830d776ad4810826..c6639936c9bbd70cae7867221ba51f9485ab150c 100644 (file)
@@ -122,16 +122,16 @@ StringTextFileContent::technical_summary () const
 
 
 void
-StringTextFileContent::as_xml (xmlpp::Node* node, bool with_paths) const
+StringTextFileContent::as_xml(xmlpp::Element* element, bool with_paths) const
 {
-       node->add_child("Type")->add_child_text("TextSubtitle");
-       Content::as_xml (node, with_paths);
+       cxml::add_text_child(element, "Type", "TextSubtitle");
+       Content::as_xml(element, with_paths);
 
        if (only_text()) {
-               only_text()->as_xml(node);
+               only_text()->as_xml(element);
        }
 
-       node->add_child("Length")->add_child_text(raw_convert<string>(_length.get ()));
+       cxml::add_text_child(element, "Length", raw_convert<string>(_length.get()));
 }
 
 
index 30f543381bf68fd0390b025fbac30a888210b881..8a5d9946a6cfbebae29860fb80714a1db91ad924 100644 (file)
@@ -45,7 +45,7 @@ public:
        void examine (std::shared_ptr<const Film> film, std::shared_ptr<Job>) override;
        std::string summary () const override;
        std::string technical_summary () const override;
-       void as_xml (xmlpp::Node *, bool with_paths) const override;
+       void as_xml(xmlpp::Element*, bool with_paths) const override;
        dcpomatic::DCPTime full_length (std::shared_ptr<const Film> film) const override;
        dcpomatic::DCPTime approximate_length () const override;
        std::string identifier () const override;
index ff1969a3a37c227cd32fde4a2dc793760648908a..2968416c671c4e62b8797efe4480361f98e38604 100644 (file)
@@ -70,18 +70,18 @@ SubtitleAnalysis::write (boost::filesystem::path path) const
        auto doc = make_shared<xmlpp::Document>();
        xmlpp::Element* root = doc->create_root_node ("SubtitleAnalysis");
 
-       root->add_child("Version")->add_child_text (raw_convert<string>(_current_state_version));
+       cxml::add_text_child(root, "Version", raw_convert<string>(_current_state_version));
 
        if (_bounding_box) {
-               auto bounding_box = root->add_child("BoundingBox");
-               bounding_box->add_child("X")->add_child_text(raw_convert<string>(_bounding_box->x));
-               bounding_box->add_child("Y")->add_child_text(raw_convert<string>(_bounding_box->y));
-               bounding_box->add_child("Width")->add_child_text(raw_convert<string>(_bounding_box->width));
-               bounding_box->add_child("Height")->add_child_text(raw_convert<string>(_bounding_box->height));
+               auto bounding_box = cxml::add_child(root, "BoundingBox");
+               cxml::add_text_child(bounding_box, "X", raw_convert<string>(_bounding_box->x));
+               cxml::add_text_child(bounding_box, "Y", raw_convert<string>(_bounding_box->y));
+               cxml::add_text_child(bounding_box, "Width", raw_convert<string>(_bounding_box->width));
+               cxml::add_text_child(bounding_box, "Height", raw_convert<string>(_bounding_box->height));
        }
 
-       root->add_child("AnalysisXOffset")->add_child_text(raw_convert<string>(_analysis_x_offset));
-       root->add_child("AnalysisYOffset")->add_child_text(raw_convert<string>(_analysis_y_offset));
+       cxml::add_text_child(root, "AnalysisXOffset", raw_convert<string>(_analysis_x_offset));
+       cxml::add_text_child(root, "AnalysisYOffset", raw_convert<string>(_analysis_y_offset));
 
        doc->write_to_file_formatted (path.string());
 }
index 09f6e41b656a476d0367690e9d67a6bd99cb5b0a..cfdaabcbc0bdf24e3bf133052d842563c4837e40 100644 (file)
@@ -356,61 +356,61 @@ TextContent::TextContent (Content* parent, vector<shared_ptr<Content>> c)
 
 /** _mutex must not be held on entry */
 void
-TextContent::as_xml (xmlpp::Node* root) const
+TextContent::as_xml(xmlpp::Element* root) const
 {
        boost::mutex::scoped_lock lm (_mutex);
 
-       auto text = root->add_child ("Text");
+       auto text = cxml::add_child(root, "Text");
 
-       text->add_child("Use")->add_child_text (_use ? "1" : "0");
-       text->add_child("Burn")->add_child_text (_burn ? "1" : "0");
-       text->add_child("XOffset")->add_child_text (raw_convert<string> (_x_offset));
-       text->add_child("YOffset")->add_child_text (raw_convert<string> (_y_offset));
-       text->add_child("XScale")->add_child_text (raw_convert<string> (_x_scale));
-       text->add_child("YScale")->add_child_text (raw_convert<string> (_y_scale));
+       cxml::add_text_child(text, "Use", _use ? "1" : "0");
+       cxml::add_text_child(text, "Burn", _burn ? "1" : "0");
+       cxml::add_text_child(text, "XOffset", raw_convert<string>(_x_offset));
+       cxml::add_text_child(text, "YOffset", raw_convert<string>(_y_offset));
+       cxml::add_text_child(text, "XScale", raw_convert<string>(_x_scale));
+       cxml::add_text_child(text, "YScale", raw_convert<string>(_y_scale));
        if (_colour) {
-               text->add_child("Red")->add_child_text (raw_convert<string> (_colour->r));
-               text->add_child("Green")->add_child_text (raw_convert<string> (_colour->g));
-               text->add_child("Blue")->add_child_text (raw_convert<string> (_colour->b));
+               cxml::add_text_child(text, "Red", raw_convert<string>(_colour->r));
+               cxml::add_text_child(text, "Green", raw_convert<string>(_colour->g));
+               cxml::add_text_child(text, "Blue", raw_convert<string>(_colour->b));
        }
        if (_effect) {
                switch (*_effect) {
                case dcp::Effect::NONE:
-                       text->add_child("Effect")->add_child_text("none");
+                       cxml::add_text_child(text, "Effect", "none");
                        break;
                case dcp::Effect::BORDER:
-                       text->add_child("Effect")->add_child_text("outline");
+                       cxml::add_text_child(text, "Effect", "outline");
                        break;
                case dcp::Effect::SHADOW:
-                       text->add_child("Effect")->add_child_text("shadow");
+                       cxml::add_text_child(text, "Effect", "shadow");
                        break;
                }
        }
        if (_effect_colour) {
-               text->add_child("EffectRed")->add_child_text (raw_convert<string> (_effect_colour->r));
-               text->add_child("EffectGreen")->add_child_text (raw_convert<string> (_effect_colour->g));
-               text->add_child("EffectBlue")->add_child_text (raw_convert<string> (_effect_colour->b));
+               cxml::add_text_child(text, "EffectRed", raw_convert<string>(_effect_colour->r));
+               cxml::add_text_child(text, "EffectGreen", raw_convert<string>(_effect_colour->g));
+               cxml::add_text_child(text, "EffectBlue", raw_convert<string>(_effect_colour->b));
        }
-       text->add_child("LineSpacing")->add_child_text (raw_convert<string> (_line_spacing));
+       cxml::add_text_child(text, "LineSpacing", raw_convert<string>(_line_spacing));
        if (_fade_in) {
-               text->add_child("FadeIn")->add_child_text (raw_convert<string> (_fade_in->get()));
+               cxml::add_text_child(text, "FadeIn", raw_convert<string>(_fade_in->get()));
        }
        if (_fade_out) {
-               text->add_child("FadeOut")->add_child_text (raw_convert<string> (_fade_out->get()));
+               cxml::add_text_child(text, "FadeOut", raw_convert<string>(_fade_out->get()));
        }
-       text->add_child("OutlineWidth")->add_child_text (raw_convert<string> (_outline_width));
+       cxml::add_text_child(text, "OutlineWidth", raw_convert<string>(_outline_width));
 
        for (auto i: _fonts) {
-               i->as_xml (text->add_child("Font"));
+               i->as_xml(cxml::add_child(text, "Font"));
        }
 
-       text->add_child("Type")->add_child_text (text_type_to_string(_type));
-       text->add_child("OriginalType")->add_child_text (text_type_to_string(_original_type));
+       cxml::add_text_child(text, "Type", text_type_to_string(_type));
+       cxml::add_text_child(text, "OriginalType", text_type_to_string(_original_type));
        if (_dcp_track) {
-               _dcp_track->as_xml(text->add_child("DCPTrack"));
+               _dcp_track->as_xml(cxml::add_child(text, "DCPTrack"));
        }
        if (_language) {
-               auto lang = text->add_child("Language");
+               auto lang = cxml::add_child(text, "Language");
                lang->add_child_text (_language->to_string());
                lang->set_attribute("additional", _language_is_additional ? "1" : "0");
        }
index 4d4bdc507e478043ca2111c2fa0507d812aaec8d..3122271209deb67e33aea54d6b9e1d3c77e14ce7 100644 (file)
@@ -72,7 +72,7 @@ public:
        TextContent (Content* parent, std::vector<std::shared_ptr<Content>>);
        TextContent (Content* parent, cxml::ConstNodePtr, int version, std::list<std::string>& notes);
 
-       void as_xml (xmlpp::Node *) const;
+       void as_xml(xmlpp::Element*) const;
        std::string identifier () const;
        void take_settings_from (std::shared_ptr<const TextContent> c);
 
index c6046cb372b5a90241e0fce027c183db677eca7f..e84462ed28baa06177e2ef2778c887fa48d60c96 100644 (file)
@@ -273,37 +273,37 @@ VideoContent::VideoContent (Content* parent, vector<shared_ptr<Content> > c)
 
 
 void
-VideoContent::as_xml (xmlpp::Node* node) const
+VideoContent::as_xml(xmlpp::Element* element) const
 {
        boost::mutex::scoped_lock lm (_mutex);
-       node->add_child("Use")->add_child_text (_use ? "1" : "0");
-       node->add_child("VideoLength")->add_child_text (raw_convert<string> (_length));
+       cxml::add_text_child(element, "Use", _use ? "1" : "0");
+       cxml::add_text_child(element, "VideoLength", raw_convert<string>(_length));
        if (_size) {
-               node->add_child("VideoWidth")->add_child_text(raw_convert<string>(_size->width));
-               node->add_child("VideoHeight")->add_child_text(raw_convert<string>(_size->height));
+               cxml::add_text_child(element, "VideoWidth", raw_convert<string>(_size->width));
+               cxml::add_text_child(element, "VideoHeight", raw_convert<string>(_size->height));
        }
-       node->add_child("VideoFrameType")->add_child_text (video_frame_type_to_string (_frame_type));
+       cxml::add_text_child(element, "VideoFrameType", video_frame_type_to_string(_frame_type));
        if (_sample_aspect_ratio) {
-               node->add_child("SampleAspectRatio")->add_child_text (raw_convert<string> (_sample_aspect_ratio.get ()));
+               cxml::add_text_child(element, "SampleAspectRatio", raw_convert<string> (_sample_aspect_ratio.get ()));
        }
-       _crop.as_xml (node);
+       _crop.as_xml(element);
        if (_custom_ratio) {
-               node->add_child("CustomRatio")->add_child_text(raw_convert<string>(*_custom_ratio));
+               cxml::add_text_child(element, "CustomRatio", raw_convert<string>(*_custom_ratio));
        }
        if (_custom_size) {
-               node->add_child("CustomWidth")->add_child_text(raw_convert<string>(_custom_size->width));
-               node->add_child("CustomHeight")->add_child_text(raw_convert<string>(_custom_size->height));
+               cxml::add_text_child(element, "CustomWidth", raw_convert<string>(_custom_size->width));
+               cxml::add_text_child(element, "CustomHeight", raw_convert<string>(_custom_size->height));
        }
        if (_colour_conversion) {
-               _colour_conversion.get().as_xml (node->add_child("ColourConversion"));
+               _colour_conversion.get().as_xml(cxml::add_child(element, "ColourConversion"));
        }
-       node->add_child("YUV")->add_child_text (_yuv ? "1" : "0");
-       node->add_child("FadeIn")->add_child_text (raw_convert<string> (_fade_in));
-       node->add_child("FadeOut")->add_child_text (raw_convert<string> (_fade_out));
-       node->add_child("Range")->add_child_text(_range == VideoRange::FULL ? "full" : "video");
-       _pixel_quanta.as_xml(node->add_child("PixelQuanta"));
+       cxml::add_text_child(element, "YUV", _yuv ? "1" : "0");
+       cxml::add_text_child(element, "FadeIn", raw_convert<string>(_fade_in));
+       cxml::add_text_child(element, "FadeOut", raw_convert<string>(_fade_out));
+       cxml::add_text_child(element, "Range", _range == VideoRange::FULL ? "full" : "video");
+       _pixel_quanta.as_xml(cxml::add_child(element, "PixelQuanta"));
        if (_burnt_subtitle_language) {
-               node->add_child("BurntSubtitleLanguage")->add_child_text(_burnt_subtitle_language->to_string());
+               cxml::add_text_child(element, "BurntSubtitleLanguage", _burnt_subtitle_language->to_string());
        }
 }
 
index d31c25f135e136f748204c5ae2479b09d8641db1..a7b630b14a0c86df93936a96e60c50c4a9838770 100644 (file)
@@ -66,7 +66,7 @@ public:
        VideoContent (Content* parent, cxml::ConstNodePtr node, int version, VideoRange video_range_hint);
        VideoContent (Content* parent, std::vector<std::shared_ptr<Content>>);
 
-       void as_xml (xmlpp::Node *) const;
+       void as_xml(xmlpp::Element*) const;
        std::string technical_summary () const;
        std::string identifier () const;
        void take_settings_from (std::shared_ptr<const VideoContent> c);
index 9adca5a2da33d40d91f5312f5ccb9918df006206..546e1445b2110a1191f436a09a25f69e2b03a698 100644 (file)
@@ -121,11 +121,11 @@ VideoMXFContent::identifier () const
 
 
 void
-VideoMXFContent::as_xml (xmlpp::Node* node, bool with_paths) const
+VideoMXFContent::as_xml(xmlpp::Element* element, bool with_paths) const
 {
-       node->add_child("Type")->add_child_text("VideoMXF");
-       Content::as_xml (node, with_paths);
-       video->as_xml (node);
+       cxml::add_text_child(element, "Type", "VideoMXF");
+       Content::as_xml(element, with_paths);
+       video->as_xml(element);
 }
 
 
index 5a04c3da9c292405b83f7e3f0c4e20fe73995077..1731942a6958c0bcc533381dbcbe8f9a9effbc75 100644 (file)
@@ -40,7 +40,7 @@ public:
        std::string summary () const override;
        std::string technical_summary () const override;
        std::string identifier () const override;
-       void as_xml (xmlpp::Node* node, bool with_paths) const override;
+       void as_xml(xmlpp::Element* element, bool with_paths) const override;
        dcpomatic::DCPTime full_length (std::shared_ptr<const Film> film) const override;
        dcpomatic::DCPTime approximate_length () const override;
        void add_properties (std::shared_ptr<const Film> film, std::list<UserProperty>& p) const override;
index a180739ab5f8e84fe9cd1223731824345d74263b..ecd2deac8fc3c4275544ad5e917444e170143033 100644 (file)
@@ -43,38 +43,38 @@ BOOST_AUTO_TEST_CASE (stream_test)
 {
        xmlpp::Document doc;
        auto root = doc.create_root_node("FFmpegAudioStream");
-       root->add_child("Name")->add_child_text ("hello there world");
-       root->add_child("Id")->add_child_text ("4");
-       root->add_child("FrameRate")->add_child_text ("44100");
-       root->add_child("Channels")->add_child_text ("2");
+       cxml::add_text_child(root, "Name", "hello there world");
+       cxml::add_text_child(root, "Id", "4");
+       cxml::add_text_child(root, "FrameRate", "44100");
+       cxml::add_text_child(root, "Channels", "2");
 
        /* This is the state file version 5 description of the mapping */
 
-       auto mapping = root->add_child("Mapping");
-       mapping->add_child("ContentChannels")->add_child_text ("2");
+       auto mapping = cxml::add_child(root, "Mapping");
+       cxml::add_text_child(mapping, "ContentChannels", "2");
        {
                /* L -> L */
-               auto map = mapping->add_child("Map");
-               map->add_child("ContentIndex")->add_child_text ("0");
-               map->add_child("DCP")->add_child_text ("0");
+               auto map = cxml::add_child(mapping, "Map");
+               cxml::add_text_child(map, "ContentIndex", "0");
+               cxml::add_text_child(map, "DCP", "0");
        }
        {
                /* L -> C */
-               auto map = mapping->add_child("Map");
-               map->add_child("ContentIndex")->add_child_text ("0");
-               map->add_child("DCP")->add_child_text ("2");
+               auto map = cxml::add_child(mapping, "Map");
+               cxml::add_text_child(map, "ContentIndex", "0");
+               cxml::add_text_child(map, "DCP", "2");
        }
        {
                /* R -> R */
-               auto map = mapping->add_child("Map");
-               map->add_child("ContentIndex")->add_child_text ("1");
-               map->add_child("DCP")->add_child_text ("1");
+               auto map = cxml::add_child(mapping, "Map");
+               cxml::add_text_child(map, "ContentIndex", "1");
+               cxml::add_text_child(map, "DCP", "1");
        }
        {
                /* R -> C */
-               auto map = mapping->add_child("Map");
-               map->add_child("ContentIndex")->add_child_text ("1");
-               map->add_child("DCP")->add_child_text ("2");
+               auto map = cxml::add_child(mapping, "Map");
+               cxml::add_text_child(map, "ContentIndex", "1");
+               cxml::add_text_child(map, "DCP", "2");
        }
 
        FFmpegAudioStream a (cxml::NodePtr (new cxml::Node (root)), 5);