Merge.
[dcpomatic.git] / src / lib / update.h
1 /*
2     Copyright (C) 2014 Carl Hetherington <cth@carlh.net>
3
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18 */
19
20 #include <boost/signals2.hpp>
21 #include <boost/thread/mutex.hpp>
22 #include <boost/thread/condition.hpp>
23 #include <boost/thread.hpp>
24 #include <curl/curl.h>
25
26 class UpdateChecker
27 {
28 public:
29         UpdateChecker ();
30         ~UpdateChecker ();
31
32         void run ();
33
34         enum State {
35                 YES,
36                 FAILED,
37                 NO,
38                 NOT_RUN
39         };
40
41         State state () {
42                 boost::mutex::scoped_lock lm (_data_mutex);
43                 return _state;
44         }
45         
46         std::string stable () {
47                 boost::mutex::scoped_lock lm (_data_mutex);
48                 return _stable;
49         }
50
51         std::string test () {
52                 boost::mutex::scoped_lock lm (_data_mutex);
53                 return _test;
54         }
55         
56         /** @return true if the list signal emission was the first */
57         bool last_emit_was_first () const {
58                 boost::mutex::scoped_lock lm (_data_mutex);
59                 return _emits == 1;
60         }
61
62         size_t write_callback (void *, size_t, size_t);
63
64         boost::signals2::signal<void (void)> StateChanged;
65
66         static UpdateChecker* instance ();
67
68 private:        
69         static UpdateChecker* _instance;
70
71         void set_state (State);
72         void thread ();
73
74         char* _buffer;
75         int _offset;
76         CURL* _curl;
77
78         /** mutex to protect _state, _stable, _test and _emits */
79         mutable boost::mutex _data_mutex;
80         State _state;
81         std::string _stable;
82         std::string _test;
83         int _emits;
84
85         boost::thread* _thread;
86         boost::mutex _process_mutex;
87         boost::condition _condition;
88         int _to_do;
89 };