Cleanup: move EqualityOptions into its own file.
[libdcp.git] / src / asset.h
1 /*
2     Copyright (C) 2014-2021 Carl Hetherington <cth@carlh.net>
3
4     This file is part of libdcp.
5
6     libdcp is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10
11     libdcp is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with libdcp.  If not, see <http://www.gnu.org/licenses/>.
18
19     In addition, as a special exception, the copyright holders give
20     permission to link the code of portions of this program with the
21     OpenSSL library under certain conditions as described in each
22     individual source file, and distribute linked combinations
23     including the two.
24
25     You must obey the GNU General Public License in all respects
26     for all of the code used other than OpenSSL.  If you modify
27     file(s) with this exception, you may extend this exception to your
28     version of the file(s), but you are not obligated to do so.  If you
29     do not wish to do so, delete this exception statement from your
30     version.  If you delete this exception statement from all source
31     files in the program, then also delete it here.
32 */
33
34
35 /** @file  src/asset.h
36  *  @brief Asset class
37  */
38
39
40 #ifndef LIBDCP_ASSET_H
41 #define LIBDCP_ASSET_H
42
43
44 #include "object.h"
45 #include "types.h"
46 #include "pkl.h"
47 #include <boost/filesystem.hpp>
48 #include <boost/function.hpp>
49 #include <boost/optional.hpp>
50
51
52 namespace xmlpp {
53         class Node;
54 }
55
56
57 struct asset_test;
58
59
60 namespace dcp {
61
62
63 class AssetMap;
64 class EqualityOptions;
65
66
67 /** @class Asset
68  *  @brief Parent class for DCP assets, i.e. picture, sound, subtitles, closed captions, CPLs, fonts
69  *
70  *  Note that this class is not used for ReelAssets; those are just for the metadata
71  *  that gets put into &lt;Reel&gt;s.
72  */
73 class Asset : public Object
74 {
75 public:
76         /** Create an Asset with a randomly-generated ID */
77         Asset ();
78
79         /** Create an Asset from a given file with a randomly-generated ID
80          *  @param file File name
81          */
82         explicit Asset (boost::filesystem::path file);
83
84         /** Create an Asset from a given file with a given ID
85          *  @param id ID
86          *  @param file File name
87          */
88         Asset (std::string id, boost::filesystem::path file);
89
90         virtual bool equals (
91                 std::shared_ptr<const Asset> other,
92                 EqualityOptions const& opt,
93                 NoteHandler note
94                 ) const;
95
96         virtual void add_to_assetmap (AssetMap& asset_map, boost::filesystem::path root) const;
97
98         virtual void add_to_pkl (std::shared_ptr<PKL> pkl, boost::filesystem::path root) const;
99
100         /** @return the most recent disk file used to read or write this asset, if there is one */
101         boost::optional<boost::filesystem::path> file () const {
102                 return _file;
103         }
104
105         /** Set the file that holds this asset on disk.  Calling this function
106          *  clears this object's store of its hash, so you should call ::hash
107          *  after this.
108          *
109          *  @param file New file's path.
110          */
111         void set_file (boost::filesystem::path file) const;
112
113         /** Set the file that holds this asset on disk.  Calling this function
114          *  preserves the object's store of its hash, so if the object already
115          *  has a hash it is up to the caller to ensure that the new file has
116          *  the same hash.
117          *
118          *  @param file New file's path.
119          */
120         void set_file_preserving_hash(boost::filesystem::path file) const;
121
122         /** Set the file that holds this asset on disk.  The new file must
123          *  be exactly the same as the old one, as this function assumes
124          *  that the object's hash does not change.
125          *
126          *  @param file New file's path.
127          */
128         void rename_file(boost::filesystem::path file);
129
130         /** Calculate the hash of this asset's file, if it has not already been calculated,
131          *  then return it
132          *  @param progress Function that will be called with a parameter between 0 and 1 to indicate
133          *  progress in the calculation
134          *  @return the hash
135          */
136         std::string hash (boost::function<void (float)> progress = {}) const;
137
138         void set_hash (std::string hash);
139         void unset_hash();
140
141 protected:
142
143         /** The most recent disk file used to read or write this asset */
144         mutable boost::optional<boost::filesystem::path> _file;
145
146         static void add_file_to_assetmap (AssetMap& asset_map, boost::filesystem::path root, boost::filesystem::path file, std::string id);
147
148 private:
149         friend struct ::asset_test;
150
151         /** @return type string for PKLs for this asset */
152         virtual std::string pkl_type (Standard standard) const = 0;
153
154         /** Hash of _file if it has been computed */
155         mutable boost::optional<std::string> _hash;
156 };
157
158
159 }
160
161
162 #endif