diff options
| author | Carl Hetherington <cth@carlh.net> | 2015-09-01 20:47:14 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2015-09-01 20:47:14 +0100 |
| commit | 6904ca547ce503c9ea06b4def9b9a716068e493c (patch) | |
| tree | 1be4293f3231291344ee9ecc4e64180b4805176d /src/lib/update_checker.h | |
| parent | a16f2c07ea7301ed1b82b9039ea7db7c025054ff (diff) | |
update.{cc,h} -> update_checker.{cc,h}.
Diffstat (limited to 'src/lib/update_checker.h')
| -rw-r--r-- | src/lib/update_checker.h | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/src/lib/update_checker.h b/src/lib/update_checker.h new file mode 100644 index 000000000..b82be7808 --- /dev/null +++ b/src/lib/update_checker.h @@ -0,0 +1,104 @@ +/* + Copyright (C) 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 + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +/** @file src/lib/update.h + * @brief UpdateChecker class. + */ + +#include "signaller.h" +#include <curl/curl.h> +#include <boost/signals2.hpp> +#include <boost/thread/mutex.hpp> +#include <boost/thread/condition.hpp> +#include <boost/thread.hpp> + +struct update_checker_test; + +/** Class to check for the existance of an update for DCP-o-matic on a remote server */ +class UpdateChecker : public Signaller, public boost::noncopyable +{ +public: + UpdateChecker (); + ~UpdateChecker (); + + void run (); + + enum State { + 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 new stable version, if there is one */ + boost::optional<std::string> stable () { + boost::mutex::scoped_lock lm (_data_mutex); + return _stable; + } + + /** @return new test version, if there is one and Config is set to look for it */ + boost::optional<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 _emits == 1; + } + + size_t write_callback (void *, size_t, size_t); + + boost::signals2::signal<void (void)> StateChanged; + + static UpdateChecker* instance (); + +private: + friend struct update_checker_test; + + static UpdateChecker* _instance; + + static bool version_less_than (std::string const & a, std::string const & b); + + void set_state (State); + void thread (); + + char* _buffer; + int _offset; + CURL* _curl; + + /** mutex to protect _state, _stable, _test and _emits */ + mutable boost::mutex _data_mutex; + State _state; + boost::optional<std::string> _stable; + boost::optional<std::string> _test; + int _emits; + + boost::thread* _thread; + boost::mutex _process_mutex; + boost::condition _condition; + int _to_do; +}; |
