summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2014-01-07 16:47:44 +0000
committerCarl Hetherington <cth@carlh.net>2014-01-07 16:47:44 +0000
commit16d5c07df7752d093df804d3f1141790f633c24b (patch)
tree7f26d3b870f5fc6cea3987c9088d01f21e7c02b3 /src/lib
parent185c57d06c9fe5416bb03fad0874ed813db2ffe8 (diff)
Various update bits.
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/config.cc8
-rw-r--r--src/lib/config.h19
-rw-r--r--src/lib/image_examiner.cc2
-rw-r--r--src/lib/update.cc109
-rw-r--r--src/lib/update.h26
5 files changed, 106 insertions, 58 deletions
diff --git a/src/lib/config.cc b/src/lib/config.cc
index 454b03e3a..5a9e1619a 100644
--- a/src/lib/config.cc
+++ b/src/lib/config.cc
@@ -68,6 +68,8 @@ Config::Config ()
, _kdm_email (
_("Dear Projectionist\n\nPlease find attached KDMs for $CPL_NAME.\n\nThe KDMs are valid from $START_TIME until $END_TIME.\n\nBest regards,\nDCP-o-matic")
)
+ , _check_for_updates (false)
+ , _check_for_test_updates (false)
{
_allowed_dcp_frame_rates.push_back (24);
_allowed_dcp_frame_rates.push_back (25);
@@ -180,6 +182,9 @@ Config::read ()
_mail_password = f.optional_string_child("MailPassword").get_value_or ("");
_kdm_from = f.string_child ("KDMFrom");
_kdm_email = f.string_child ("KDMEmail");
+
+ _check_for_updates = f.optional_bool_child("CheckForUpdates").get_value_or (false);
+ _check_for_test_updates = f.optional_bool_child("CheckForTestUpdates").get_value_or (false);
}
void
@@ -354,6 +359,9 @@ Config::write () const
root->add_child("KDMFrom")->add_child_text (_kdm_from);
root->add_child("KDMEmail")->add_child_text (_kdm_email);
+ root->add_child("CheckForUpdates")->add_child_text (_check_for_updates ? "1" : "0");
+ root->add_child("CheckForTestUpdates")->add_child_text (_check_for_test_updates ? "1" : "0");
+
doc.write_to_file_formatted (file(false).string ());
}
diff --git a/src/lib/config.h b/src/lib/config.h
index 67d293884..791e41e8f 100644
--- a/src/lib/config.h
+++ b/src/lib/config.h
@@ -171,6 +171,14 @@ public:
return _kdm_email;
}
+ bool check_for_updates () const {
+ return _check_for_updates;
+ }
+
+ bool check_for_test_updates () const {
+ return _check_for_test_updates;
+ }
+
/** @param n New number of local encoding threads */
void set_num_local_encoding_threads (int n) {
_num_local_encoding_threads = n;
@@ -284,6 +292,14 @@ public:
void set_kdm_email (std::string e) {
_kdm_email = e;
}
+
+ void set_check_for_updates (bool c) {
+ _check_for_updates = c;
+ }
+
+ void set_check_for_test_updates (bool c) {
+ _check_for_test_updates = c;
+ }
void write () const;
@@ -341,6 +357,9 @@ private:
std::string _mail_password;
std::string _kdm_from;
std::string _kdm_email;
+ /** true to check for updates on startup */
+ bool _check_for_updates;
+ bool _check_for_test_updates;
/** Singleton instance, or 0 */
static Config* _instance;
diff --git a/src/lib/image_examiner.cc b/src/lib/image_examiner.cc
index 17064fd45..12fe2b8a6 100644
--- a/src/lib/image_examiner.cc
+++ b/src/lib/image_examiner.cc
@@ -36,7 +36,7 @@ using boost::shared_ptr;
using boost::lexical_cast;
using boost::bad_lexical_cast;
-ImageExaminer::ImageExaminer (shared_ptr<const Film> film, shared_ptr<const ImageContent> content, shared_ptr<Job> job)
+ImageExaminer::ImageExaminer (shared_ptr<const Film> film, shared_ptr<const ImageContent> content, shared_ptr<Job>)
: _film (film)
, _image_content (content)
, _video_length (0)
diff --git a/src/lib/update.cc b/src/lib/update.cc
index d68979e60..6e5f92edc 100644
--- a/src/lib/update.cc
+++ b/src/lib/update.cc
@@ -47,7 +47,7 @@ UpdateChecker::UpdateChecker ()
, _offset (0)
, _curl (0)
, _state (NOT_RUN)
- , _startup (true)
+ , _emits (0)
{
curl_global_init (CURL_GLOBAL_ALL);
_curl = curl_easy_init ();
@@ -59,66 +59,78 @@ UpdateChecker::UpdateChecker ()
string const agent = "dcpomatic/" + string (dcpomatic_version);
curl_easy_setopt (_curl, CURLOPT_USERAGENT, agent.c_str ());
+
+ _thread = new boost::thread (boost::bind (&UpdateChecker::thread, this));
}
UpdateChecker::~UpdateChecker ()
{
+ /* We are not cleaning up our thread, but hey well */
+
curl_easy_cleanup (_curl);
curl_global_cleanup ();
delete[] _buffer;
}
void
-UpdateChecker::run (bool startup)
-try
+UpdateChecker::run ()
{
- boost::mutex::scoped_lock lm (_single_thread_mutex);
-
- {
- boost::mutex::scoped_lock lm (_data_mutex);
- _startup = startup;
- }
-
- _offset = 0;
-
- int r = curl_easy_perform (_curl);
- if (r != CURLE_OK) {
- set_state (FAILED);
- return;
- }
-
- _buffer[_offset] = '\0';
- stringstream s;
- s << _buffer;
- cxml::Document doc ("Update");
- doc.read_stream (s);
-
- {
- boost::mutex::scoped_lock lm (_data_mutex);
- _stable = doc.string_child ("Stable");
- }
-
- string current = string (dcpomatic_version);
- bool current_pre = false;
- if (boost::algorithm::ends_with (current, "pre")) {
- current = current.substr (0, current.length() - 3);
- current_pre = true;
- }
-
- float current_float = lexical_cast<float> (current);
- if (current_pre) {
- current_float -= 0.005;
- }
+ boost::mutex::scoped_lock lm (_process_mutex);
+ _condition.notify_one ();
+}
- if (current_float < lexical_cast<float> (_stable)) {
- set_state (YES);
- } else {
- set_state (NO);
+void
+UpdateChecker::thread ()
+{
+ while (1) {
+ boost::mutex::scoped_lock lock (_process_mutex);
+ _condition.wait (lock);
+ lock.unlock ();
+
+ try {
+ _offset = 0;
+
+ int r = curl_easy_perform (_curl);
+ if (r != CURLE_OK) {
+ set_state (FAILED);
+ return;
+ }
+
+ _buffer[_offset] = '\0';
+ stringstream s;
+ s << _buffer;
+ cxml::Document doc ("Update");
+ doc.read_stream (s);
+
+ {
+ boost::mutex::scoped_lock lm (_data_mutex);
+ _stable = doc.string_child ("Stable");
+ _test = doc.string_child ("Test");
+ }
+
+ string current = string (dcpomatic_version);
+ bool current_pre = false;
+ if (boost::algorithm::ends_with (current, "pre")) {
+ current = current.substr (0, current.length() - 3);
+ current_pre = true;
+ }
+
+ float current_float = lexical_cast<float> (current);
+ if (current_pre) {
+ current_float -= 0.005;
+ }
+
+ if (current_float < lexical_cast<float> (_stable)) {
+ set_state (YES);
+ } else {
+ set_state (NO);
+ }
+ } catch (...) {
+ set_state (FAILED);
+ }
}
-} catch (...) {
- set_state (FAILED);
}
-
+
size_t
UpdateChecker::write_callback (void* data, size_t size, size_t nmemb)
{
@@ -134,8 +146,9 @@ UpdateChecker::set_state (State s)
{
boost::mutex::scoped_lock lm (_data_mutex);
_state = s;
+ _emits++;
}
-
+
ui_signaller->emit (boost::bind (boost::ref (StateChanged)));
}
diff --git a/src/lib/update.h b/src/lib/update.h
index b879e9026..a1aefd0a1 100644
--- a/src/lib/update.h
+++ b/src/lib/update.h
@@ -19,6 +19,7 @@
#include <boost/signals2.hpp>
#include <boost/thread/mutex.hpp>
+#include <boost/thread/condition.hpp>
#include <curl/curl.h>
class UpdateChecker
@@ -27,7 +28,7 @@ public:
UpdateChecker ();
~UpdateChecker ();
- void run (bool);
+ void run ();
enum State {
YES,
@@ -46,10 +47,15 @@ public:
return _stable;
}
- /** @return true if this check was run at startup, otherwise false */
- bool startup () const {
+ std::string test () {
boost::mutex::scoped_lock lm (_data_mutex);
- return _startup;
+ return _test;
+ }
+
+ /** @return true if the list 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);
@@ -62,18 +68,20 @@ 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;
};