/* 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. */ /** @file src/package.h * @brief Package class. */ #ifndef LIBDCP_PACKAGE_H #define LIBDCP_PACKAGE_H #include "types.h" #include "certificate.h" #include "metadata.h" #include "dcp_assert.h" #include #include #include #include #include namespace xmlpp { class Document; class Element; } /** @brief Namespace for everything in libdcp */ namespace dcp { class Content; class Reel; class CPL; class XMLMetadata; class CertificateChain; class DecryptedKDM; class Asset; class PackageReadError; /** @class Package * @brief A class to create or read a package. */ class Package : public boost::noncopyable { public: /** Construct a package. You can pass an existing package's directory * as the parameter; alternatively, directory will be created * if it does not exist. Note that if you pass an existing package * into this constructor it will not be read until you call ::read(). * * @param directory Directory containing the package's files. */ Package (boost::filesystem::path directory); typedef std::list > ReadErrors; /** Read the package's structure into this object. * @param keep_going true to try to keep going in the face of (some) errors. * @param errors List of errors that will be added to if keep_going is true. */ void read (bool keep_going = false, ReadErrors* errors = 0); /** Compare this package with another, according to various options. * @param other package to compare this one to. * @param options Options to define what "equality" means. * @param note Functor to handle notes made by the equality operation. * @return true if the packages are equal according to EqualityOptions, otherwise false. */ bool equals (Package const & other, EqualityOptions options, NoteHandler note) const; void add (boost::shared_ptr cpl); bool encrypted () const; void add (DecryptedKDM const &); void resolve_refs (std::list > assets); virtual std::list > assets () const = 0; protected: /** Write the PKL file. * @param pkl_uuid UUID to use. */ boost::filesystem::path write_pkl ( Standard standard, std::string pkl_uuid, XMLMetadata metadata, boost::shared_ptr signer ) const; void write_volindex (Standard standard) const; /** Write the ASSETMAP file. * @param pkl_uuid UUID of our PKL. * @param pkl_length Length of our PKL in bytes. */ void write_assetmap (Standard standard, std::string pkl_uuid, int pkl_length, XMLMetadata metadata) const; template std::list > cpls_of_type () const { std::list > cpls; BOOST_FOREACH (boost::shared_ptr i, _cpls) { boost::shared_ptr t = boost::dynamic_pointer_cast (i); DCP_ASSERT (t); cpls.push_back (t); } return cpls; } /** the directory that we are writing to */ boost::filesystem::path _directory; /** the CPLs that make up this package */ std::list > _cpls; private: virtual boost::shared_ptr read_cpl (boost::filesystem::path file) const = 0; }; } #endif