/* Copyright (C) 2017 Carl Hetherington This file is part of DCP-o-matic. DCP-o-matic 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. DCP-o-matic 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 DCP-o-matic. If not, see . */ #include "compose.hpp" #include "dkdm_wrapper.h" #include "dcpomatic_assert.h" #include #include using std::string; using std::list; using boost::shared_ptr; using boost::dynamic_pointer_cast; shared_ptr DKDMBase::read (cxml::ConstNodePtr node) { if (node->name() == "DKDM") { return shared_ptr (new DKDM (dcp::EncryptedKDM (node->content ()))); #ifdef DCPOMATIC_VARIANT_SWAROOP } else if (node->name() == "ECinemaDKDM") { return shared_ptr (new ECinemaDKDM(EncryptedECinemaKDM(node->content()))); #endif } else if (node->name() == "DKDMGroup") { shared_ptr group (new DKDMGroup (node->string_attribute ("Name"))); BOOST_FOREACH (cxml::ConstNodePtr i, node->node_children()) { shared_ptr c = read (i); if (c) { group->add (c); } } return group; } return shared_ptr (); } string DKDM::name () const { return String::compose ("%1 (%2)", _dkdm.content_title_text(), _dkdm.cpl_id()); } void DKDM::as_xml (xmlpp::Element* node) const { node->add_child("DKDM")->add_child_text (_dkdm.as_xml ()); } #ifdef DCPOMATIC_VARIANT_SWAROOP string ECinemaDKDM::name () const { return String::compose ("%1 (%2)", _dkdm.name(), _dkdm.id()); } void ECinemaDKDM::as_xml (xmlpp::Element* node) const { node->add_child("ECinemaDKDM")->add_child_text (_dkdm.as_xml()); } #endif void DKDMGroup::as_xml (xmlpp::Element* node) const { xmlpp::Element* f = node->add_child("DKDMGroup"); f->set_attribute ("Name", _name); BOOST_FOREACH (shared_ptr i, _children) { i->as_xml (f); } } void DKDMGroup::add (shared_ptr child, shared_ptr previous) { DCPOMATIC_ASSERT (child); if (previous) { list >::iterator i = find (_children.begin(), _children.end(), previous); if (i != _children.end ()) { ++i; } _children.insert (i, child); } else { _children.push_back (child); } child->set_parent (dynamic_pointer_cast (shared_from_this ())); } void DKDMGroup::remove (shared_ptr child) { for (list >::iterator i = _children.begin(); i != _children.end(); ++i) { if (*i == child) { _children.erase (i); child->set_parent (shared_ptr ()); return; } shared_ptr g = dynamic_pointer_cast (*i); if (g) { g->remove (child); } } }