annotate Plugin/GoogleUpdater.cpp @ 8:da3228ac9227

reduce the number of sources
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 13 Jun 2019 17:19:44 +0200
parents 520cba9a0d42
children 25292488ff8f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1 /**
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2 * Google Cloud Platform credentials for DICOMweb and Orthanc
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3 * Copyright (C) 2019 Osimis S.A., Belgium
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4 *
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
5 * This program is free software: you can redistribute it and/or
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
6 * modify it under the terms of the GNU General Public License as
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
7 * published by the Free Software Foundation, either version 3 of the
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
8 * License, or (at your option) any later version.
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
9 *
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
10 * In addition, as a special exception, the copyright holders of this
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
11 * program give permission to link the code of its release with the
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
12 * OpenSSL project's "OpenSSL" library (or with modified versions of it
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
13 * that use the same license as the "OpenSSL" library), and distribute
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
14 * the linked executables. You must obey the GNU General Public License
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
15 * in all respects for all of the code used other than "OpenSSL". If you
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
16 * modify file(s) with this exception, you may extend this exception to
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
17 * your version of the file(s), but you are not obligated to do so. If
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
18 * you do not wish to do so, delete this exception statement from your
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
19 * version. If you delete this exception statement from all source files
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
20 * in the program, then also delete it here.
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
21 *
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
22 * This program is distributed in the hope that it will be useful, but
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
23 * WITHOUT ANY WARRANTY; without even the implied warranty of
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
25 * General Public License for more details.
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
26 *
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
27 * You should have received a copy of the GNU General Public License
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
28 * along with this program. If not, see <http://www.gnu.org/licenses/>.
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
29 **/
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
30
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
31
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
32 #include "GoogleUpdater.h"
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
33
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
34 #include "GoogleConfiguration.h"
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
35
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
36 #include <google/cloud/storage/internal/curl_handle_factory.h>
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
37 #include <google/cloud/storage/oauth2/google_credentials.h>
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
38
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
39
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
40 namespace
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
41 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
42 class CurlBuilder : public google::cloud::storage::internal::CurlRequestBuilder
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
43 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
44 private:
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
45 class HandleFactory : public google::cloud::storage::internal::DefaultCurlHandleFactory
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
46 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
47 public:
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
48 google::cloud::storage::internal::CurlPtr CreateHandle() override
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
49 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
50 google::cloud::storage::internal::CurlPtr handle
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
51 (google::cloud::storage::internal::DefaultCurlHandleFactory::CreateHandle());
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
52
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
53 const GoogleConfiguration& configuration = GoogleConfiguration::GetInstance();
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
54
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
55 long timeout = static_cast<long>(configuration.GetTimeoutSeconds());
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
56
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
57 if ((!configuration.GetCaInfo().empty() &&
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
58 curl_easy_setopt(handle.get(), CURLOPT_CAINFO, configuration.GetCaInfo().c_str()) != CURLE_OK) ||
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
59 curl_easy_setopt(handle.get(), CURLOPT_SSL_VERIFYHOST, 2) != CURLE_OK ||
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
60 curl_easy_setopt(handle.get(), CURLOPT_SSL_VERIFYPEER, 1) != CURLE_OK ||
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
61 curl_easy_setopt(handle.get(), CURLOPT_TIMEOUT, timeout) != CURLE_OK)
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
62 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
63 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError,
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
64 "Cannot initialize a libcurl handle");
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
65 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
66
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
67 return handle;
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
68 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
69
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
70 google::cloud::storage::internal::CurlMulti CreateMultiHandle() override
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
71 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
72 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented);
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
73 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
74 };
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
75
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
76 public:
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
77 CurlBuilder(std::string base_url,
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
78 std::shared_ptr<google::cloud::storage::internal::CurlHandleFactory> factory) :
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
79 CurlRequestBuilder(base_url, std::make_shared<HandleFactory>())
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
80 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
81 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
82 };
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
83 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
84
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
85
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
86
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
87 static boost::posix_time::ptime GetNow()
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
88 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
89 return boost::posix_time::second_clock::local_time();
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
90 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
91
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
92
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
93 void GoogleUpdater::Worker(const State* state,
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
94 const GoogleAccount* account,
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
95 long refreshIntervalSeconds)
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
96 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
97 std::shared_ptr<google::cloud::storage::oauth2::Credentials> credentials;
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
98
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
99 switch (account->GetType())
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
100 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
101 case GoogleAccount::Type_ServiceAccount:
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
102 credentials = std::make_shared<google::cloud::storage::oauth2::ServiceAccountCredentials
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
103 <CurlBuilder>>(account->GetServiceAccount());
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
104 break;
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
105
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
106 case GoogleAccount::Type_AuthorizedUser:
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
107 credentials = std::make_shared<google::cloud::storage::oauth2::AuthorizedUserCredentials
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
108 <CurlBuilder>>(account->GetAuthorizedUser());
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
109 break;
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
110
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
111 default:
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
112 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented);
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
113 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
114
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
115 if (credentials.get() == NULL)
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
116 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
117 LOG(ERROR) << "Cannot initialize the token updater for Google Cloud Platform account: "
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
118 << account->GetName();
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
119 return;
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
120 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
121
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
122 const std::string dicomWebPluginRoot = GoogleConfiguration::GetInstance().GetDicomWebPluginRoot();
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
123 const std::string baseGoogleUrl = GoogleConfiguration::GetInstance().GetBaseGoogleUrl();
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
124
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
125 std::string lastToken;
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
126 std::unique_ptr<boost::posix_time::ptime> lastUpdate;
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
127
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
128 while (*state == State_Running)
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
129 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
130 if (lastUpdate.get() == NULL ||
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
131 (GetNow() - *lastUpdate).total_seconds() >= refreshIntervalSeconds)
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
132 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
133 google::cloud::StatusOr<std::string> token = credentials->AuthorizationHeader();
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
134 if (!token)
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
135 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
136 LOG(WARNING) << "Cannot generate Google Cloud Platform token for account: " << account->GetName();
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
137 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
138 else if (*token != lastToken &&
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
139 account->UpdateServerDefinition(dicomWebPluginRoot, baseGoogleUrl, *token))
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
140 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
141 lastToken = *token;
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
142 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
143
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
144 lastUpdate.reset(new boost::posix_time::ptime(GetNow()));
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
145 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
146
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
147 boost::this_thread::sleep(boost::posix_time::milliseconds(100));
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
148 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
149 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
150
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
151
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
152 GoogleUpdater::~GoogleUpdater()
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
153 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
154 if (state_ == State_Running)
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
155 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
156 LOG(ERROR) << "GoogleUpdater::Stop() should have been manually called";
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
157 Stop();
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
158 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
159 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
160
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
161
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
162 void GoogleUpdater::Start()
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
163 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
164 if (state_ != State_Setup)
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
165 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
166 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls);
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
167 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
168
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
169 state_ = State_Running;
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
170
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
171 const GoogleConfiguration& configuration = GoogleConfiguration::GetInstance();
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
172
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
173 workers_.resize(configuration.GetAccountsCount());
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
174
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
175 for (size_t i = 0; i < workers_.size(); i++)
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
176 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
177 workers_[i] = new boost::thread(Worker, &state_, &configuration.GetAccount(i),
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
178 configuration.GetRefreshIntervalSeconds());
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
179 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
180 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
181
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
182
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
183 void GoogleUpdater::Stop()
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
184 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
185 if (state_ == State_Running)
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
186 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
187 state_ = State_Done;
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
188
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
189 for (size_t i = 0; i < workers_.size(); i++)
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
190 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
191 if (workers_[i] != NULL)
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
192 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
193 if (workers_[i]->joinable())
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
194 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
195 workers_[i]->join();
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
196 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
197
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
198 delete workers_[i];
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
199 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
200 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
201
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
202 workers_.clear();
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
203 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
204 }