*/
+#ifndef DVDOMATIC_EXCEPTIONS_H
+#define DVDOMATIC_EXCEPTIONS_H
+
/** @file src/exceptions.h
* @brief Our exceptions.
*/
#include <stdexcept>
-#include <sstream>
#include <cstring>
+#include <boost/exception/all.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
class FileError : public StringError
{
public:
+ /** @param m Error message.
+ * @param f Name of the file that this exception concerns.
+ */
FileError (std::string m, std::string f)
: StringError (m)
, _file (f)
virtual ~FileError () throw () {}
+ /** @return name of the file that this exception concerns */
std::string file () const {
return _file;
}
private:
+ /** name of the file that this exception concerns */
std::string _file;
};
ReadFileError (std::string f, int e = 0)
: FileError ("", f)
{
- std::stringstream s;
- s << "could not read from file " << f;
- if (e) {
- s << " (" << strerror (e) << ")";
- }
- _what = s.str ();
+ _what = String::compose ("could not read from file %1 (%2)", f, strerror (e));
}
};
WriteFileError (std::string f, int e)
: FileError ("", f)
{
- std::stringstream s;
- s << "could not write to file " << f;
- if (e) {
- s << " (" << strerror (e) << ")";
- }
- _what = s.str ();
+ _what = String::compose ("could not write to file %1 (%2)", f, strerror (e));
}
};
{}
};
-class PlayError : public StringError
+class PixelFormatError : public StringError
{
public:
- PlayError (std::string s)
- : StringError (s)
+ PixelFormatError (std::string o, AVPixelFormat f)
+ : StringError (String::compose ("Cannot handle pixel format %1 during %2", f, o))
{}
};
-class DVDError : public StringError
+class ExceptionStore
{
public:
- DVDError (std::string s)
- : StringError (s)
- {}
+ bool thrown () const {
+ boost::mutex::scoped_lock lm (_mutex);
+ return _exception;
+ }
+
+ void rethrow () {
+ boost::mutex::scoped_lock lm (_mutex);
+ boost::rethrow_exception (_exception);
+ }
+
+protected:
+
+ void store_current () {
+ boost::mutex::scoped_lock lm (_mutex);
+ _exception = boost::current_exception ();
+ }
+
+private:
+ boost::exception_ptr _exception;
+ mutable boost::mutex _mutex;
};
+
+
+
+#endif