Merge master.
[dcpomatic.git] / src / lib / update.h
index b879e902696d1c83e7e01c448545448d15b428e9..c86adb8736adad074625f8b7a73dd47ae1eb666e 100644 (file)
 
 */
 
+/** @file  src/lib/update.h
+ *  @brief UpdateChecker class.
+ */
+
 #include <boost/signals2.hpp>
 #include <boost/thread/mutex.hpp>
+#include <boost/thread/condition.hpp>
+#include <boost/thread.hpp>
 #include <curl/curl.h>
 
+/** Class to check for the existance of an update for DCP-o-matic on a remote server */
 class UpdateChecker
 {
 public:
        UpdateChecker ();
        ~UpdateChecker ();
 
-       void run (bool);
+       void run ();
 
        enum State {
-               YES,
-               FAILED,
-               NO,
-               NOT_RUN
+               YES,    ///< there is an update
+               FAILED, ///< the check failed, so we don't know
+               NO,     ///< there is no update
+               NOT_RUN ///< the check has not been run (yet)
        };
 
+       /** @return state of the checker */
        State state () {
                boost::mutex::scoped_lock lm (_data_mutex);
                return _state;
        }
        
+       /** @return the version string of the latest stable version (if _state == YES or NO) */
        std::string stable () {
                boost::mutex::scoped_lock lm (_data_mutex);
                return _stable;
        }
 
-       /** @return true if this check was run at startup, otherwise false */
-       bool startup () const {
+       /** @return the version string of the latest test version (if _state == YES or NO) */
+       std::string test () {
+               boost::mutex::scoped_lock lm (_data_mutex);
+               return _test;
+       }
+       
+       /** @return true if the last signal emission was the first */
+       bool last_emit_was_first () const {
                boost::mutex::scoped_lock lm (_data_mutex);
-               return _startup;
+               return _emits == 1;
        }
 
        size_t write_callback (void *, size_t, size_t);
@@ -62,18 +77,21 @@ private:
        static UpdateChecker* _instance;
 
        void set_state (State);
+       void thread ();
 
        char* _buffer;
        int _offset;
        CURL* _curl;
 
-       /** mutex to protect _state, _stable and _startup */
+       /** mutex to protect _state, _stable, _test and _emits */
        mutable boost::mutex _data_mutex;
        State _state;
        std::string _stable;
-       /** true if this check was run at startup, otherwise false */
-       bool _startup;
+       std::string _test;
+       int _emits;
 
-       /** mutex to ensure that only one query runs at once */
-       boost::mutex _single_thread_mutex;
+       boost::thread* _thread;
+       boost::mutex _process_mutex;
+       boost::condition _condition;
+       int _to_do;
 };