/* Copyright (C) 2016 Carl Hetherington This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "im_cpl.h" #include "util.h" #include "xml.h" #include "dcp_assert.h" #include "segment.h" #include #include #include using std::list; using std::string; using boost::shared_ptr; using namespace dcp::im; CPL::CPL (boost::filesystem::path file) : Asset (file) { cxml::Document f ("CompositionPlaylist"); f.read_file (file); _id = remove_urn_uuid (f.string_child ("Id")); /* XXX: I don't know whether these things are required or optional */ _annotation = f.optional_string_child("Annotation").get_value_or (""); _issue_date = f.string_child("IssueDate"); _issuer = f.optional_string_child("Issuer").get_value_or (""); _creator = f.optional_string_child("Creator").get_value_or (""); /* ContentOriginator? */ _content_title = f.optional_string_child("ContentTitle").get_value_or (""); _content_kind = content_kind_from_string (f.string_child ("ContentKind")); BOOST_FOREACH (cxml::ConstNodePtr i, f.node_child("ContentVersionList")->node_children("ContentVersion")) { _content_versions.push_back (make_pair (remove_urn_uuid(i->string_child("Id")), i->string_child("LabelText"))); } /* EssenceDescriptorList */ _edit_rate = Fraction (f.string_child("EditRate")); /* ExtensionProperties */ _segments = type_grand_children (f, "SegmentList", "Segment"); /* f.done (); */ } void CPL::resolve_refs (list > assets) { /* XXX */ } string CPL::pkl_type (Standard standard) const { switch (standard) { case DCP_INTEROP: case DCP_SMPTE: /* This class shouldn't be writing DCP CPLs */ DCP_ASSERT (false); case IMP: return "text/xml"; } return ""; } /** Write an CompositonPlaylist XML file. * @param file Filename to write. * @param standard Must be IMP. * @param signer Signer to sign the CPL, or 0 to add no signature. */ void CPL::write_xml (boost::filesystem::path file, Standard standard, shared_ptr signer) const { xmlpp::Document doc; xmlpp::Element* root = 0; switch (standard) { case DCP_INTEROP: case DCP_SMPTE: /* This class shouldn't be writing DCP CPLs */ root = doc.create_root_node ("CompositionPlaylist", "http://www.digicine.com/PROTO-ASDCP-CPL-20040511#"); break; case IMP: root = doc.create_root_node ("CompositionPlaylist", "http://www.smpte-ra.org/schemas/429-7/2006/CPL"); break; } if (signer) { root->set_namespace_declaration ("http://www.w3.org/2000/09/xmldsig#", "dsig"); } /* XXX */ set_file (file); }