Add a special exception for the case when opj_start_compress fails.
[libdcp.git] / src / exceptions.h
1 /*
2     Copyright (C) 2012-2019 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                 , _message(message)
103         {}
104
105         DCPReadError (std::string message, std::string detail);
106
107         ~DCPReadError() throw () {}
108
109         std::string message () const {
110                 return _message;
111         }
112
113         boost::optional<std::string> detail () const {
114                 return _detail;
115         }
116
117 private:
118         std::string _message;
119         boost::optional<std::string> _detail;
120 };
121
122 class BadContentKindError : public DCPReadError
123 {
124 public:
125         BadContentKindError (std::string content_kind);
126 };
127
128 /** @class XMLError
129  *  @brief An XML error
130  */
131 class XMLError : public std::runtime_error
132 {
133 public:
134         explicit XMLError (std::string message)
135                 : std::runtime_error (message)
136         {}
137 };
138
139 /** @class UnresolvedRefError
140  *  @brief An exception caused by a reference (by UUID) to something which is not known
141  */
142 class UnresolvedRefError : public std::runtime_error
143 {
144 public:
145         explicit UnresolvedRefError (std::string id);
146 };
147
148 /** @class TimeFormatError
149  *  @brief A an error with a string passed to LocalTime.
150  */
151 class TimeFormatError : public std::runtime_error
152 {
153 public:
154         explicit TimeFormatError (std::string bad_time);
155 };
156
157 /** @class NotEncryptedError
158  *  @brief An error raised when creating a DecryptedKDM object for assets that are not
159  *  encrypted.
160  */
161 class NotEncryptedError : public std::runtime_error
162 {
163 public:
164         explicit NotEncryptedError (std::string const & what);
165         ~NotEncryptedError () throw () {}
166 };
167
168 /** @class ProgrammingError
169  *  @brief An exception thrown when a DCP_ASSERT fails; something that should not happen.
170  */
171 class ProgrammingError : public std::runtime_error
172 {
173 public:
174         ProgrammingError (std::string file, int line);
175 };
176
177 class KDMDecryptionError : public std::runtime_error
178 {
179 public:
180         KDMDecryptionError (std::string message, int cipher_length, int modulus_dmax);
181 };
182
183 class KDMFormatError : public std::runtime_error
184 {
185 public:
186         KDMFormatError (std::string message);
187 };
188
189 class CertificateChainError : public std::runtime_error
190 {
191 public:
192         CertificateChainError (std::string message);
193 };
194
195 class MissingSubtitleImageError : public std::runtime_error
196 {
197 public:
198         MissingSubtitleImageError (std::string id);
199 };
200
201 class BadKDMDateError : public std::runtime_error
202 {
203 public:
204         BadKDMDateError (bool starts_too_early);
205
206         bool starts_too_early () const {
207                 return _starts_too_early;
208         }
209
210 private:
211         bool _starts_too_early;
212 };
213
214
215 class StartCompressionError : public std::runtime_error
216 {
217 public:
218         explicit StartCompressionError (boost::optional<int> code = boost::optional<int>());
219
220         boost::optional<int> code () const {
221                 return _code;
222         }
223
224 private:
225         boost::optional<int> _code;
226 };
227
228 }
229
230 #endif