Merge master.
[dcpomatic.git] / src / lib / exceptions.h
index b04d973dc7a62197571ce7d6697917f2023b23e0..213be6186d523a713a0a3f167f77127e0047164e 100644 (file)
@@ -104,7 +104,14 @@ private:
        /** name of the file that this exception concerns */
        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.
@@ -223,17 +230,38 @@ public:
        PixelFormatError (std::string o, AVPixelFormat f);
 };
 
+/** An error that occurs while parsing a SubRip file */
+class SubRipError : public FileError
+{
+public:
+       SubRipError (std::string, std::string, boost::filesystem::path);
+};
+
+/** 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: