Throw exceptions with badly-formed XML when reading a DCP; preserve detail in DCPRead...
[libdcp.git] / src / exceptions.h
1 /*
2     Copyright (C) 2012-2018 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 #ifndef LIBDCP_EXCEPTIONS_H
35 #define LIBDCP_EXCEPTIONS_H
36
37 #include <boost/filesystem.hpp>
38 #include <boost/optional.hpp>
39
40 /** @file  src/exceptions.h
41  *  @brief Exceptions thrown by libdcp.
42  */
43
44 namespace dcp
45 {
46
47 /** @class FileError
48  *  @brief An exception related to a file
49  */
50 class FileError : public std::runtime_error
51 {
52 public:
53         FileError (std::string message, boost::filesystem::path filename, int number);
54         ~FileError () throw () {}
55
56         /** @return filename of file that was involved */
57         boost::filesystem::path filename () const {
58                 return _filename;
59         }
60
61         /** @return error number of the error */
62         int number () const {
63                 return _number;
64         }
65
66 private:
67         /** filename of file that was involved */
68         boost::filesystem::path _filename;
69         int _number;
70 };
71
72 /** @class MXFFileError
73  *  @brief An exception related to an MXF file
74  */
75 class MXFFileError : public FileError
76 {
77 public:
78         MXFFileError (std::string message, boost::filesystem::path filename, int number)
79                 : FileError (message, filename, number)
80         {}
81 };
82
83 /** @class MiscError
84  *  @brief A miscellaneous exception
85  */
86 class MiscError : public std::runtime_error
87 {
88 public:
89         explicit MiscError (std::string message)
90                 : std::runtime_error (message)
91         {}
92 };
93
94 /** @class DCPReadError
95  *  @brief A DCP read exception
96  */
97 class DCPReadError : public std::runtime_error
98 {
99 public:
100         explicit DCPReadError (std::string message)
101                 : std::runtime_error(message)
102         {}
103
104         DCPReadError (std::string message, std::string detail);
105
106         std::string message () const {
107                 return _message;
108         }
109
110         boost::optional<std::string> detail () const {
111                 return _detail;
112         }
113
114 private:
115         std::string _message;
116         boost::optional<std::string> _detail;
117 };
118
119 /** @class MissingAssetError
120  *  @brief An error of a missing asset.
121  */
122 class MissingAssetError : public DCPReadError
123 {
124 public:
125         enum AssetType {
126                 MAIN_PICTURE,  //< main picture is missing
127                 MAIN_SOUND,    //< main sound is missing
128                 MAIN_SUBTITLE, //< main subtitle is missing
129                 UNKNOWN        //< something is missing but we don't know what
130         };
131
132         MissingAssetError (boost::filesystem::path, AssetType = UNKNOWN);
133         ~MissingAssetError () throw () {}
134 };
135
136 /** @class XMLError
137  *  @brief An XML error
138  */
139 class XMLError : public std::runtime_error
140 {
141 public:
142         explicit XMLError (std::string message)
143                 : std::runtime_error (message)
144         {}
145 };
146
147 /** @class UnresolvedRefError
148  *  @brief An exception caused by a reference (by UUID) to something which is not known
149  */
150 class UnresolvedRefError : public std::runtime_error
151 {
152 public:
153         explicit UnresolvedRefError (std::string id);
154 };
155
156 /** @class TimeFormatError
157  *  @brief A an error with a string passed to LocalTime.
158  */
159 class TimeFormatError : public std::runtime_error
160 {
161 public:
162         explicit TimeFormatError (std::string bad_time);
163 };
164
165 /** @class NotEncryptedError
166  *  @brief An error raised when creating a DecryptedKDM object for assets that are not
167  *  encrypted.
168  */
169 class NotEncryptedError : public std::runtime_error
170 {
171 public:
172         explicit NotEncryptedError (std::string const & what);
173         ~NotEncryptedError () throw () {}
174 };
175
176 /** @class ProgrammingError
177  *  @brief An exception thrown when a DCP_ASSERT fails; something that should not happen.
178  */
179 class ProgrammingError : public std::runtime_error
180 {
181 public:
182         ProgrammingError (std::string file, int line);
183 };
184
185 class MismatchedStandardError : public DCPReadError
186 {
187 public:
188         MismatchedStandardError ();
189 };
190
191 class KDMDecryptionError : public std::runtime_error
192 {
193 public:
194         KDMDecryptionError (std::string message, int cipher_length, int modulus_dmax);
195 };
196
197 class KDMFormatError : public std::runtime_error
198 {
199 public:
200         KDMFormatError (std::string message);
201 };
202
203 class CertificateChainError : public std::runtime_error
204 {
205 public:
206         CertificateChainError (std::string message);
207 };
208
209 }
210
211 #endif