X-Git-Url: https://git.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Flib%2Fexceptions.h;h=80d4801daf83d24854d2b6f1e23a11b6497eab9a;hp=5efb045b74906cdbb77e782d61023ba709c6c77d;hb=2b9bdd0f97172514efe265a517653c4e49d89f55;hpb=a69d242f3f00207d6ea7320e6723775f4b0dbfb3 diff --git a/src/lib/exceptions.h b/src/lib/exceptions.h index 5efb045b7..80d4801da 100644 --- a/src/lib/exceptions.h +++ b/src/lib/exceptions.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2012-2014 Carl Hetherington + Copyright (C) 2012-2021 Carl Hetherington This file is part of DCP-o-matic. @@ -18,19 +18,25 @@ */ + /** @file src/lib/exceptions.h * @brief Our exceptions. */ + #ifndef DCPOMATIC_EXCEPTIONS_H #define DCPOMATIC_EXCEPTIONS_H + +#include "compose.hpp" extern "C" { #include } #include -#include +#include #include +#include + /** @class DecodeError * @brief A low-level problem with the decoder (possibly due to the nature @@ -42,8 +48,34 @@ public: explicit DecodeError (std::string s) : std::runtime_error (s) {} + + DecodeError (std::string function, std::string caller) + : std::runtime_error (String::compose("%1 failed [%2]", function, caller)) + {} + + DecodeError (std::string function, std::string caller, int error) + : std::runtime_error (String::compose("%1 failed [%2] (%3)", function, caller, error)) + {} + + DecodeError (std::string function, std::string caller, boost::filesystem::path file) + : std::runtime_error (String::compose("%1 failed [%2] (%3)", function, caller, file.string())) + {} + + DecodeError (std::string function, std::string caller, int error, boost::filesystem::path file) + : std::runtime_error (String::compose("%1 failed [%2] (%3) (%4)", function, caller, error, file.string())) + {} +}; + + +class CryptoError : public std::runtime_error +{ +public: + explicit CryptoError (std::string s) + : std::runtime_error (s) + {} }; + /** @class EncodeError * @brief A low-level problem with an encoder. */ @@ -53,8 +85,17 @@ public: explicit EncodeError (std::string s) : std::runtime_error (s) {} + + explicit EncodeError (std::string function, std::string caller) + : std::runtime_error (String::compose("%1 failed [%2]", function, caller)) + {} + + explicit EncodeError (std::string function, std::string caller, int error) + : std::runtime_error (String::compose("%1 failed [%2] (%3)", function, caller, error)) + {} }; + /** @class FileError. * @brief Parent class for file-related errors. */ @@ -65,7 +106,7 @@ public: * @param f Name of the file that this exception concerns. */ FileError (std::string m, boost::filesystem::path f) - : std::runtime_error (m) + : std::runtime_error (String::compose("%1 with %2", m, f.string())) , _file (f) {} @@ -81,6 +122,7 @@ private: boost::filesystem::path _file; }; + class JoinError : public std::runtime_error { public: @@ -89,19 +131,44 @@ public: {} }; + /** @class OpenFileError. * @brief Indicates that some error occurred when trying to open a file. */ class OpenFileError : public FileError { public: + enum Mode { + READ, + WRITE, + READ_WRITE + }; + /** @param f File that we were trying to open. * @param error Code of error that occurred. - * @param reading true if we were opening to read, false if opening to write. + * @param mode Mode that we tried to open the file in. */ - OpenFileError (boost::filesystem::path f, int error, bool reading); + OpenFileError (boost::filesystem::path f, int error, Mode mode); }; + +class FileNotFoundError : public std::runtime_error +{ +public: + FileNotFoundError (boost::filesystem::path f); + virtual ~FileNotFoundError () throw () {} + + /** @return name of the file that this exception concerns */ + boost::filesystem::path file () const { + return _file; + } + +private: + /** name of the file that this exception concerns */ + boost::filesystem::path _file; +}; + + /** @class ReadFileError. * @brief Indicates that some error occurred when trying to read from a file */ @@ -114,6 +181,7 @@ public: ReadFileError (boost::filesystem::path f, int e = 0); }; + /** @class WriteFileError. * @brief Indicates that some error occurred when trying to write to a file */ @@ -126,6 +194,7 @@ public: WriteFileError (boost::filesystem::path f, int e); }; + /** @class SettingError. * @brief Indicates that something is wrong with a setting. */ @@ -151,6 +220,7 @@ private: std::string _setting; }; + /** @class MissingSettingError. * @brief Indicates that a Film is missing a setting that is required for some operation. */ @@ -161,6 +231,7 @@ public: explicit MissingSettingError (std::string s); }; + /** @class BadSettingError * @brief Indicates that a setting is bad in some way. */ @@ -175,28 +246,52 @@ public: {} }; + /** @class NetworkError * @brief Indicates some problem with communication on the network. */ class NetworkError : public std::runtime_error { public: - explicit NetworkError (std::string s) - : std::runtime_error (s) - {} + explicit NetworkError (std::string s, boost::optional d = boost::optional()); + + std::string summary () const { + return _summary; + } + + boost::optional detail () const { + return _detail; + } + +private: + std::string _summary; + boost::optional _detail; }; + /** @class KDMError * @brief A problem with a KDM. */ class KDMError : public std::runtime_error { public: - explicit KDMError (std::string s) - : std::runtime_error (s) - {} + KDMError (std::string s, std::string d); + ~KDMError () throw() {} + + std::string summary () const { + return _summary; + } + + std::string detail () const { + return _detail; + } + +private: + std::string _summary; + std::string _detail; }; + /** @class PixelFormatError * @brief A problem with an unsupported pixel format. */ @@ -206,6 +301,7 @@ public: PixelFormatError (std::string o, AVPixelFormat f); }; + /** @class TextSubtitleError * @brief An error that occurs while parsing a TextSubtitleError file. */ @@ -215,6 +311,7 @@ public: TextSubtitleError (std::string, std::string, boost::filesystem::path); }; + class DCPError : public std::runtime_error { public: @@ -223,6 +320,30 @@ public: {} }; + +/** @class ProjectFolderError + * @brief An attempt has been made to read a DCP from a directory, but it looks + * like the directory actually contains a DCP-o-matic project. + */ +class ProjectFolderError : public DCPError +{ +public: + /* Code which catches this exception will provide their own message */ + ProjectFolderError () + : DCPError ("dummy") + {} +}; + + +class CPLNotFoundError : public DCPError +{ +public: + CPLNotFoundError(std::string id) + : DCPError(String::compose("CPL %1 not found", id)) + {} +}; + + class InvalidSignerError : public std::runtime_error { public: @@ -230,12 +351,14 @@ public: explicit InvalidSignerError (std::string reason); }; + class ProgrammingError : public std::runtime_error { public: ProgrammingError (std::string file, int line, std::string message = ""); }; + class TextEncodingError : public std::runtime_error { public: @@ -244,6 +367,16 @@ public: {} }; + +class MetadataError : public std::runtime_error +{ +public: + explicit MetadataError (std::string s) + : std::runtime_error (s) + {} +}; + + class OldFormatError : public std::runtime_error { public: @@ -252,10 +385,90 @@ public: {} }; + class KDMAsContentError : public std::runtime_error { public: KDMAsContentError (); }; + +class GLError : public std::runtime_error +{ +public: + GLError (char const* last, int e); + GLError (char const* message); +}; + + +/** @class CopyError + * @brief An error which occurs when copying a DCP to a distribution drive. + */ +class CopyError : public std::runtime_error +{ +public: + CopyError (std::string s, boost::optional ext4_error = boost::optional(), boost::optional platform_error = boost::optional()); + virtual ~CopyError () throw () {} + + std::string message () const { + return _message; + } + + boost::optional ext4_number() const { + return _ext4_number; + } + + boost::optional platform_number() const { + return _platform_number; + } + +private: + std::string _message; + boost::optional _ext4_number; + boost::optional _platform_number; +}; + + +/** @class CommunicationFailedError + * @brief Communication between dcpomatic2_disk and _disk_writer failed somehow. + */ +class CommunicationFailedError : public CopyError +{ +public: + CommunicationFailedError (); +}; + + +/** @class VerifyError + * @brief An error which occurs when verifying a DCP that we copied to a distribution drive. + */ +class VerifyError : public std::runtime_error +{ +public: + VerifyError (std::string s, int n); + virtual ~VerifyError () throw () {} + + std::string message () const { + return _message; + } + + int number () const { + return _number; + } + +private: + std::string _message; + int _number; +}; + + +class PrivilegeError : public std::runtime_error +{ +public: + explicit PrivilegeError (std::string s) + : std::runtime_error (s) + {} +}; + + #endif