*/
-#ifndef DVDOMATIC_EXCEPTIONS_H
-#define DVDOMATIC_EXCEPTIONS_H
+#ifndef DCPOMATIC_EXCEPTIONS_H
+#define DCPOMATIC_EXCEPTIONS_H
/** @file src/exceptions.h
* @brief Our exceptions.
#include <stdexcept>
#include <cstring>
#include <boost/exception/all.hpp>
+#include <boost/filesystem.hpp>
#include <boost/thread.hpp>
extern "C" {
#include <libavutil/pixfmt.h>
}
-#include "compose.hpp"
/** @class StringError
* @brief A parent class for exceptions using messages held in a std::string
/** @param m Error message.
* @param f Name of the file that this exception concerns.
*/
- FileError (std::string m, std::string f)
+ FileError (std::string m, boost::filesystem::path f)
: StringError (m)
, _file (f)
{}
virtual ~FileError () throw () {}
/** @return name of the file that this exception concerns */
- std::string file () const {
+ boost::filesystem::path file () const {
return _file;
}
private:
/** name of the file that this exception concerns */
- std::string _file;
+ boost::filesystem::path _file;
+};
+
+class JoinError : public StringError
+{
+public:
+ JoinError (std::string s)
+ : StringError (s)
+ {}
};
-
/** @class OpenFileError.
* @brief Indicates that some error occurred when trying to open a file.
{
public:
/** @param f File that we were trying to open */
- OpenFileError (std::string f)
- : FileError ("could not open file " + f, f)
- {}
+ OpenFileError (boost::filesystem::path f);
};
/** @class CreateFileError.
{
public:
/** @param f File that we were trying to create */
- CreateFileError (std::string f)
- : FileError ("could not create file " + f, f)
- {}
+ CreateFileError (boost::filesystem::path f);
};
/** @param f File that we were trying to read from.
* @param e errno value, or 0.
*/
- ReadFileError (std::string f, int e = 0)
- : FileError ("", f)
- {
- _what = String::compose ("could not read from file %1 (%2)", f, strerror (e));
- }
+ ReadFileError (boost::filesystem::path f, int e = 0);
};
/** @class WriteFileError.
/** @param f File that we were trying to write to.
* @param e errno value, or 0.
*/
- WriteFileError (std::string f, int e)
- : FileError ("", f)
- {
- _what = String::compose ("could not write to file %1 (%2)", f, strerror (e));
- }
+ WriteFileError (boost::filesystem::path f, int e);
};
/** @class SettingError.
{
public:
/** @param s Name of setting that was required */
- MissingSettingError (std::string s)
- : SettingError (s, "missing required setting " + s)
- {}
+ MissingSettingError (std::string s);
};
/** @class BadSettingError
{}
};
-class PixelFormatError : public StringError
+class KDMError : public StringError
{
public:
- PixelFormatError (std::string o, AVPixelFormat f)
- : StringError (String::compose ("Cannot handle pixel format %1 during %2", f, o))
+ KDMError (std::string s)
+ : StringError (s)
{}
};
+class PixelFormatError : public StringError
+{
+public:
+ PixelFormatError (std::string o, AVPixelFormat f);
+};
+
+/** A parent class for classes which have a need to catch and
+ * re-throw exceptions. This is intended for classes
+ * which run their own thread; they should do something like
+ *
+ * void my_thread ()
+ * try {
+ * // do things which might throw exceptions
+ * } catch (...) {
+ * store_current ();
+ * }
+ *
+ * and then in another thread call rethrow(). If any
+ * exception was thrown by my_thread it will be stored by
+ * store_current() and then rethrow() will re-throw it where
+ * it can be handled.
+ */
class ExceptionStore
{
public:
- bool thrown () const {
- boost::mutex::scoped_lock lm (_mutex);
- return _exception;
- }
-
void rethrow () {
boost::mutex::scoped_lock lm (_mutex);
- boost::rethrow_exception (_exception);
+ if (_exception) {
+ boost::rethrow_exception (_exception);
+ _exception = boost::exception_ptr ();
+ }
}
protected: