X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Flib%2Fupdate_checker.cc;h=98e4078225d36f8619d4d34cd2e2fa3c3f24d639;hp=634328e6aef992c0bee26d0f170657484415d9a6;hb=5eb8b5c3a1566aef638e9d9df03b88d320735092;hpb=6904ca547ce503c9ea06b4def9b9a716068e493c diff --git a/src/lib/update_checker.cc b/src/lib/update_checker.cc index 634328e6a..98e407822 100644 --- a/src/lib/update_checker.cc +++ b/src/lib/update_checker.cc @@ -1,32 +1,32 @@ /* Copyright (C) 2014-2015 Carl Hetherington - This program is free software; you can redistribute it and/or modify + This file is part of DCP-o-matic. + + DCP-o-matic 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, + DCP-o-matic 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. + along with DCP-o-matic. If not, see . */ #include "update_checker.h" #include "version.h" -#include "safe_stringstream.h" -#include "config.h" #include "util.h" -#include "raw_convert.h" +#include #include #include #include #include +#include #define BUFFER_SIZE 1024 @@ -36,6 +36,7 @@ using std::string; using std::vector; using boost::is_any_of; using boost::ends_with; +using dcp::raw_convert; /** Singleton instance */ UpdateChecker* UpdateChecker::_instance = 0; @@ -55,24 +56,47 @@ UpdateChecker::UpdateChecker () , _curl (0) , _state (NOT_RUN) , _emits (0) + , _thread (0) , _to_do (0) + , _terminate (false) { _curl = curl_easy_init (); - curl_easy_setopt (_curl, CURLOPT_URL, "http://dcpomatic.com/update"); + curl_easy_setopt (_curl, CURLOPT_URL, "https://dcpomatic.com/update"); curl_easy_setopt (_curl, CURLOPT_WRITEFUNCTION, write_callback_wrapper); curl_easy_setopt (_curl, CURLOPT_WRITEDATA, this); curl_easy_setopt (_curl, CURLOPT_TIMEOUT, 20); string const agent = "dcpomatic/" + string (dcpomatic_version); curl_easy_setopt (_curl, CURLOPT_USERAGENT, agent.c_str ()); +} +void +UpdateChecker::start () +{ _thread = new boost::thread (boost::bind (&UpdateChecker::thread, this)); +#ifdef DCPOMATIC_LINUX + pthread_setname_np (_thread->native_handle(), "update-checker"); +#endif } UpdateChecker::~UpdateChecker () { - /* We are not cleaning up our thread, but hey well */ + { + boost::mutex::scoped_lock lm (_process_mutex); + _terminate = true; + } + + _condition.notify_all (); + if (_thread) { + /* Ideally this would be a DCPOMATIC_ASSERT(_thread->joinable()) but we + can't throw exceptions from a destructor. + */ + if (_thread->joinable ()) { + _thread->join (); + } + } + delete _thread; curl_easy_cleanup (_curl); delete[] _buffer; @@ -93,9 +117,14 @@ UpdateChecker::thread () while (true) { /* Block until there is something to do */ boost::mutex::scoped_lock lock (_process_mutex); - while (_to_do == 0) { + while (_to_do == 0 && !_terminate) { _condition.wait (lock); } + + if (_terminate) { + return; + } + --_to_do; lock.unlock (); @@ -132,7 +161,7 @@ UpdateChecker::thread () _stable = stable; } - if (Config::instance()->check_for_test_updates() && version_less_than (dcpomatic_version, test)) { + if (!test.empty() && version_less_than (dcpomatic_version, test)) { _test = test; } @@ -173,6 +202,7 @@ UpdateChecker::instance () { if (!_instance) { _instance = new UpdateChecker (); + _instance->start (); } return _instance;