/* Copyright (C) 2012-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. */ #ifndef LIBDCP_PACKAGE_H #define LIBDCP_PACKAGE_H #include "package_base.h" #include "dc_cpl.h" #include "im_cpl.h" #include "util.h" #include namespace dcp { class Asset; template class Package : public PackageBase { public: Package (boost::filesystem::path directory) : PackageBase (directory) { } void read (bool keep_going = false, ReadErrors* errors = 0) { std::list > other_assets; BOOST_FOREACH (boost::shared_ptr i, read_assetmap (keep_going, errors)) { boost::shared_ptr cpl = boost::dynamic_pointer_cast (i); if (cpl) { _cpls.push_back (cpl); } else { other_assets.push_back (i); } } BOOST_FOREACH (boost::shared_ptr i, _cpls) { i->resolve_refs (other_assets); } } void resolve_refs (std::list > assets) { BOOST_FOREACH (boost::shared_ptr i, _cpls) { i->resolve_refs (assets); } } std::list > cpls () const { return _cpls; } void add_cpl (boost::shared_ptr cpl) { _cpls.push_back (cpl); } protected: /** Write all the XML files for this package. * @param standand INTEROP, SMPTE or IMP * @param metadata Metadata to use for PKL and asset map files. * @param signer Signer to use, or 0. */ void do_write_xml ( Standard standard, dcp::XMLMetadata metadata, boost::shared_ptr signer ) { BOOST_FOREACH (boost::shared_ptr i, _cpls) { std::string const filename = "cpl_" + i->id() + ".xml"; i->write_xml (_directory / filename, standard, signer); } std::string const pkl_uuid = make_uuid (); boost::filesystem::path const pkl_path = write_pkl (standard, pkl_uuid, metadata, signer); write_volindex (standard); write_assetmap (standard, pkl_uuid, boost::filesystem::file_size (pkl_path), metadata); } /** the CPLs that make up this package */ std::list > _cpls; }; } #endif