Some OS X build fixes.
[libdcp.git] / src / exceptions.h
index 0dbbec4b5cb62ef25f8d771a0b2499fd4998cf39..9b2617eee3d7c85d1b39595ffbc1d09dad177233 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2012 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2012-2014 Carl Hetherington <cth@carlh.net>
 
     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
 
 */
 
+#ifndef LIBDCP_EXCEPTIONS_H
+#define LIBDCP_EXCEPTIONS_H
+
+#include <boost/filesystem.hpp>
+
 /** @file  src/exceptions.h
  *  @brief Exceptions thrown by libdcp.
  */
 
-namespace libdcp
+namespace dcp
 {
 
-class FileError : public std::exception
+class StringError : public std::exception
 {
 public:
-       FileError (std::string const & message, std::string const & filename)
+       StringError () {}
+       StringError (std::string message)
                : _message (message)
-               , _filename (filename)
        {}
                            
-       ~FileError () throw () {}
+       ~StringError () throw () {}
 
+       /** @return error message */
        char const * what () const throw () {
                return _message.c_str ();
        }
-       
-       std::string filename () const {
+
+protected:
+       std::string _message;
+};
+
+/** @class FileError
+ *  @brief An exception related to a file
+ */
+class FileError : public StringError
+{
+public:
+       FileError (std::string message, boost::filesystem::path filename, int number);
+       ~FileError () throw () {}
+
+       /** @return filename of file that was involved */
+       boost::filesystem::path filename () const {
                return _filename;
        }
 
+       /** @return error number of the error */
+       int number () const {
+               return _number;
+       }
+
 private:
-       std::string _message;
-       std::string _filename;
+       /** filename of file that was involved */
+       boost::filesystem::path _filename;
+       int _number;
 };
 
-class MiscError : public std::exception
+/** @class MXFFileError
+ *  @brief An exception related to an MXF file
+ */
+class MXFFileError : public FileError
 {
 public:
-       MiscError (std::string const & message) : _message (message) {}
-       ~MiscError () throw () {}
+       MXFFileError (std::string message, boost::filesystem::path filename, int number)
+               : FileError (message, filename, number)
+       {}
+};
+       
+/** @class MiscError
+ *  @brief A miscellaneous exception
+ */
+class MiscError : public StringError
+{
+public:
+       MiscError (std::string message)
+               : StringError (message)
+       {}
+};
 
-       char const * what () const throw () {
-               return _message.c_str ();
-       }
+/** @class DCPReadError
+ *  @brief A DCP read exception
+ */
+class DCPReadError : public StringError
+{
+public:
+       DCPReadError (std::string message)
+               : StringError (message)
+       {}
+
+protected:
+       DCPReadError () {}
+};
+
+/** @class MissingAssetError
+ *  @brief An error of a missing asset.
+ */
+class MissingAssetError : public DCPReadError
+{
+public:
+       enum AssetType {
+               MAIN_PICTURE,  //< main picture is missing
+               MAIN_SOUND,    //< main sound is missing
+               MAIN_SUBTITLE, //< main subtitle is missing
+               UNKNOWN        //< something is missing but we don't know what
+       };
+       
+       MissingAssetError (boost::filesystem::path, AssetType = UNKNOWN);
+       ~MissingAssetError () throw () {}
 
 private:
-       std::string _message;
+       boost::filesystem::path _path;
+       AssetType _type;
+};
+
+/** @class XMLError
+ *  @brief An XML error
+ */
+class XMLError : public StringError
+{
+public:
+       XMLError (std::string message)
+               : StringError (message)
+       {}
+};
+
+/** @class UnresolvedRefError
+ *  @brief An exception caused by a reference (by UUID) to something which is not known
+ */
+class UnresolvedRefError : public StringError
+{
+public:
+       UnresolvedRefError (std::string id);
+};
+
+/** @class TimeFormatError
+ *  @brief A an error with a string passed to LocalTime.
+ */
+class TimeFormatError : public StringError
+{
+public:
+       TimeFormatError (std::string bad_time);
+};
+
+class NotEncryptedError : public StringError
+{
+public:
+       NotEncryptedError (std::string const & what);
+       ~NotEncryptedError () throw () {}
+};
+       
+class ProgrammingError : public StringError
+{
+public:
+       ProgrammingError (std::string file, int line);
 };
 
 }
+
+#endif