Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(384)

Side by Side Diff: chrome/service/cloud_print/cloud_print_proxy_backend.cc

Issue 1900033005: Simplify some CloudPrintProxy code. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: nit Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chrome/service/cloud_print/cloud_print_proxy_backend.h ('k') | pdf/document_loader.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/service/cloud_print/cloud_print_proxy_backend.h" 5 #include "chrome/service/cloud_print/cloud_print_proxy_backend.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <map> 9 #include <map>
10 #include <vector> 10 #include <vector>
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
56 // 56 //
57 // The Do* methods are the various entry points from CloudPrintProxyBackend 57 // The Do* methods are the various entry points from CloudPrintProxyBackend
58 // It calls us on a dedicated thread to actually perform synchronous 58 // It calls us on a dedicated thread to actually perform synchronous
59 // (and potentially blocking) operations. 59 // (and potentially blocking) operations.
60 void DoInitializeWithToken(const std::string& cloud_print_token); 60 void DoInitializeWithToken(const std::string& cloud_print_token);
61 void DoInitializeWithRobotToken(const std::string& robot_oauth_refresh_token, 61 void DoInitializeWithRobotToken(const std::string& robot_oauth_refresh_token,
62 const std::string& robot_email); 62 const std::string& robot_email);
63 void DoInitializeWithRobotAuthCode(const std::string& robot_oauth_auth_code, 63 void DoInitializeWithRobotAuthCode(const std::string& robot_oauth_auth_code,
64 const std::string& robot_email); 64 const std::string& robot_email);
65 65
66 // Called on the CloudPrintProxyBackend core_thread_ to perform 66 // Called on the CloudPrintProxyBackend |core_thread_| to perform shutdown.
67 // shutdown.
68 void DoShutdown(); 67 void DoShutdown();
69 void DoRegisterSelectedPrinters( 68 void DoRegisterSelectedPrinters(
70 const printing::PrinterList& printer_list); 69 const printing::PrinterList& printer_list);
71 void DoUnregisterPrinters(); 70 void DoUnregisterPrinters();
72 71
73 // CloudPrintAuth::Client implementation. 72 // CloudPrintAuth::Client implementation.
74 void OnAuthenticationComplete(const std::string& access_token, 73 void OnAuthenticationComplete(const std::string& access_token,
75 const std::string& robot_oauth_refresh_token, 74 const std::string& robot_oauth_refresh_token,
76 const std::string& robot_email, 75 const std::string& robot_email,
77 const std::string& user_email) override; 76 const std::string& user_email) override;
78 void OnInvalidCredentials() override; 77 void OnInvalidCredentials() override;
79 78
80 // CloudPrintConnector::Client implementation. 79 // CloudPrintConnector::Client implementation.
81 void OnAuthFailed() override; 80 void OnAuthFailed() override;
82 void OnXmppPingUpdated(int ping_timeout) override; 81 void OnXmppPingUpdated(int ping_timeout) override;
83 82
84 // notifier::PushClientObserver implementation. 83 // notifier::PushClientObserver implementation.
85 void OnNotificationsEnabled() override; 84 void OnNotificationsEnabled() override;
86 void OnNotificationsDisabled( 85 void OnNotificationsDisabled(
87 notifier::NotificationsDisabledReason reason) override; 86 notifier::NotificationsDisabledReason reason) override;
88 void OnIncomingNotification( 87 void OnIncomingNotification(
89 const notifier::Notification& notification) override; 88 const notifier::Notification& notification) override;
90 void OnPingResponse() override; 89 void OnPingResponse() override;
91 90
92 private: 91 private:
93 friend class base::RefCountedThreadSafe<Core>; 92 friend class base::RefCountedThreadSafe<Core>;
94 93
95 ~Core() override {} 94 ~Core() override {}
96 95
96 CloudPrintProxyFrontend* frontend() { return backend_->frontend_; }
97
98 bool PostFrontendTask(const tracked_objects::Location& from_here,
99 const base::Closure& task);
100
101 bool CurrentlyOnFrontendThread() const;
102 bool CurrentlyOnCoreThread() const;
103
97 void CreateAuthAndConnector(); 104 void CreateAuthAndConnector();
98 void DestroyAuthAndConnector(); 105 void DestroyAuthAndConnector();
99 106
100 // NotifyXXX is how the Core communicates with the frontend across 107 // NotifyXXX is how the Core communicates with the frontend across
101 // threads. 108 // threads.
102 void NotifyPrinterListAvailable( 109 void NotifyPrinterListAvailable(
103 const printing::PrinterList& printer_list); 110 const printing::PrinterList& printer_list);
104 void NotifyAuthenticated( 111 void NotifyAuthenticated(
105 const std::string& robot_oauth_refresh_token, 112 const std::string& robot_oauth_refresh_token,
106 const std::string& robot_email, 113 const std::string& robot_email,
(...skipping 13 matching lines...) Expand all
120 // Schedules a task to poll for jobs. Does nothing if a task is already 127 // Schedules a task to poll for jobs. Does nothing if a task is already
121 // scheduled. 128 // scheduled.
122 void ScheduleJobPoll(); 129 void ScheduleJobPoll();
123 void PingXmppServer(); 130 void PingXmppServer();
124 void ScheduleXmppPing(); 131 void ScheduleXmppPing();
125 void CheckXmppPingStatus(); 132 void CheckXmppPingStatus();
126 133
127 CloudPrintTokenStore* GetTokenStore(); 134 CloudPrintTokenStore* GetTokenStore();
128 135
129 // Our parent CloudPrintProxyBackend 136 // Our parent CloudPrintProxyBackend
130 CloudPrintProxyBackend* backend_; 137 CloudPrintProxyBackend* const backend_;
131 138
132 // Cloud Print authenticator. 139 // Cloud Print authenticator.
133 scoped_refptr<CloudPrintAuth> auth_; 140 scoped_refptr<CloudPrintAuth> auth_;
134 141
135 // Cloud Print connector. 142 // Cloud Print connector.
136 scoped_refptr<CloudPrintConnector> connector_; 143 scoped_refptr<CloudPrintConnector> connector_;
137 144
138 // OAuth client info. 145 // OAuth client info.
139 gaia::OAuthClientInfo oauth_client_info_; 146 gaia::OAuthClientInfo oauth_client_info_;
140 // Notification (xmpp) handler. 147 // Notification (xmpp) handler.
(...skipping 30 matching lines...) Expand all
171 DCHECK(frontend_); 178 DCHECK(frontend_);
172 core_ = new Core(this, settings, oauth_client_info, enable_job_poll); 179 core_ = new Core(this, settings, oauth_client_info, enable_job_poll);
173 } 180 }
174 181
175 CloudPrintProxyBackend::~CloudPrintProxyBackend() { DCHECK(!core_.get()); } 182 CloudPrintProxyBackend::~CloudPrintProxyBackend() { DCHECK(!core_.get()); }
176 183
177 bool CloudPrintProxyBackend::InitializeWithToken( 184 bool CloudPrintProxyBackend::InitializeWithToken(
178 const std::string& cloud_print_token) { 185 const std::string& cloud_print_token) {
179 if (!core_thread_.Start()) 186 if (!core_thread_.Start())
180 return false; 187 return false;
181 core_thread_.task_runner()->PostTask( 188 PostCoreTask(FROM_HERE,
182 FROM_HERE, 189 base::Bind(&CloudPrintProxyBackend::Core::DoInitializeWithToken,
183 base::Bind(&CloudPrintProxyBackend::Core::DoInitializeWithToken, 190 core_.get(), cloud_print_token));
184 core_.get(), cloud_print_token));
185 return true; 191 return true;
186 } 192 }
187 193
188 bool CloudPrintProxyBackend::InitializeWithRobotToken( 194 bool CloudPrintProxyBackend::InitializeWithRobotToken(
189 const std::string& robot_oauth_refresh_token, 195 const std::string& robot_oauth_refresh_token,
190 const std::string& robot_email) { 196 const std::string& robot_email) {
191 if (!core_thread_.Start()) 197 if (!core_thread_.Start())
192 return false; 198 return false;
193 core_thread_.task_runner()->PostTask( 199 PostCoreTask(
194 FROM_HERE, 200 FROM_HERE,
195 base::Bind(&CloudPrintProxyBackend::Core::DoInitializeWithRobotToken, 201 base::Bind(&CloudPrintProxyBackend::Core::DoInitializeWithRobotToken,
196 core_.get(), robot_oauth_refresh_token, robot_email)); 202 core_.get(), robot_oauth_refresh_token, robot_email));
197 return true; 203 return true;
198 } 204 }
199 205
200 bool CloudPrintProxyBackend::InitializeWithRobotAuthCode( 206 bool CloudPrintProxyBackend::InitializeWithRobotAuthCode(
201 const std::string& robot_oauth_auth_code, 207 const std::string& robot_oauth_auth_code,
202 const std::string& robot_email) { 208 const std::string& robot_email) {
203 if (!core_thread_.Start()) 209 if (!core_thread_.Start())
204 return false; 210 return false;
205 core_thread_.task_runner()->PostTask( 211 PostCoreTask(
206 FROM_HERE, 212 FROM_HERE,
207 base::Bind(&CloudPrintProxyBackend::Core::DoInitializeWithRobotAuthCode, 213 base::Bind(&CloudPrintProxyBackend::Core::DoInitializeWithRobotAuthCode,
208 core_.get(), robot_oauth_auth_code, robot_email)); 214 core_.get(), robot_oauth_auth_code, robot_email));
209 return true; 215 return true;
210 } 216 }
211 217
212 void CloudPrintProxyBackend::Shutdown() { 218 void CloudPrintProxyBackend::Shutdown() {
213 core_thread_.task_runner()->PostTask( 219 PostCoreTask(FROM_HERE, base::Bind(&CloudPrintProxyBackend::Core::DoShutdown,
214 FROM_HERE, 220 core_.get()));
215 base::Bind(&CloudPrintProxyBackend::Core::DoShutdown, core_.get()));
216 core_thread_.Stop(); 221 core_thread_.Stop();
217 core_ = NULL; // Releases reference to core_. 222 core_ = nullptr; // Releases reference to |core_|.
218 } 223 }
219 224
220 void CloudPrintProxyBackend::UnregisterPrinters() { 225 void CloudPrintProxyBackend::UnregisterPrinters() {
221 core_thread_.task_runner()->PostTask( 226 PostCoreTask(FROM_HERE,
222 FROM_HERE, base::Bind(&CloudPrintProxyBackend::Core::DoUnregisterPrinters, 227 base::Bind(&CloudPrintProxyBackend::Core::DoUnregisterPrinters,
223 core_.get())); 228 core_.get()));
229 }
230
231 bool CloudPrintProxyBackend::PostCoreTask(
232 const tracked_objects::Location& from_here,
233 const base::Closure& task) {
234 return core_thread_.task_runner()->PostTask(from_here, task);
224 } 235 }
225 236
226 CloudPrintProxyBackend::Core::Core( 237 CloudPrintProxyBackend::Core::Core(
227 CloudPrintProxyBackend* backend, 238 CloudPrintProxyBackend* backend,
228 const ConnectorSettings& settings, 239 const ConnectorSettings& settings,
229 const gaia::OAuthClientInfo& oauth_client_info, 240 const gaia::OAuthClientInfo& oauth_client_info,
230 bool enable_job_poll) 241 bool enable_job_poll)
231 : backend_(backend), 242 : backend_(backend),
232 oauth_client_info_(oauth_client_info), 243 oauth_client_info_(oauth_client_info),
233 notifications_enabled_(false), 244 notifications_enabled_(false),
234 job_poll_scheduled_(false), 245 job_poll_scheduled_(false),
235 enable_job_poll_(enable_job_poll), 246 enable_job_poll_(enable_job_poll),
236 xmpp_ping_scheduled_(false), 247 xmpp_ping_scheduled_(false),
237 pending_xmpp_pings_(0) { 248 pending_xmpp_pings_(0) {
238 settings_.CopyFrom(settings); 249 settings_.CopyFrom(settings);
239 } 250 }
240 251
252 bool CloudPrintProxyBackend::Core::PostFrontendTask(
253 const tracked_objects::Location& from_here,
254 const base::Closure& task) {
255 return backend_->frontend_loop_->task_runner()->PostTask(from_here, task);
256 }
257
258 bool CloudPrintProxyBackend::Core::CurrentlyOnFrontendThread() const {
259 return base::MessageLoop::current() == backend_->frontend_loop_;
260 }
261
262 bool CloudPrintProxyBackend::Core::CurrentlyOnCoreThread() const {
263 return base::MessageLoop::current() == backend_->core_thread_.message_loop();
264 }
265
241 void CloudPrintProxyBackend::Core::CreateAuthAndConnector() { 266 void CloudPrintProxyBackend::Core::CreateAuthAndConnector() {
242 if (!auth_.get()) { 267 if (!auth_.get()) {
243 auth_ = new CloudPrintAuth(this, settings_.server_url(), oauth_client_info_, 268 auth_ = new CloudPrintAuth(this, settings_.server_url(), oauth_client_info_,
244 settings_.proxy_id()); 269 settings_.proxy_id());
245 } 270 }
246 271
247 if (!connector_.get()) { 272 if (!connector_.get()) {
248 connector_ = new CloudPrintConnector(this, settings_); 273 connector_ = new CloudPrintConnector(this, settings_);
249 } 274 }
250 } 275 }
251 276
252 void CloudPrintProxyBackend::Core::DestroyAuthAndConnector() { 277 void CloudPrintProxyBackend::Core::DestroyAuthAndConnector() {
253 auth_ = NULL; 278 auth_ = NULL;
254 connector_ = NULL; 279 connector_ = NULL;
255 } 280 }
256 281
257 void CloudPrintProxyBackend::Core::DoInitializeWithToken( 282 void CloudPrintProxyBackend::Core::DoInitializeWithToken(
258 const std::string& cloud_print_token) { 283 const std::string& cloud_print_token) {
259 DCHECK(base::MessageLoop::current() == backend_->core_thread_.message_loop()); 284 DCHECK(CurrentlyOnCoreThread());
260 CreateAuthAndConnector(); 285 CreateAuthAndConnector();
261 auth_->AuthenticateWithToken(cloud_print_token); 286 auth_->AuthenticateWithToken(cloud_print_token);
262 } 287 }
263 288
264 void CloudPrintProxyBackend::Core::DoInitializeWithRobotToken( 289 void CloudPrintProxyBackend::Core::DoInitializeWithRobotToken(
265 const std::string& robot_oauth_refresh_token, 290 const std::string& robot_oauth_refresh_token,
266 const std::string& robot_email) { 291 const std::string& robot_email) {
267 DCHECK(base::MessageLoop::current() == backend_->core_thread_.message_loop()); 292 DCHECK(CurrentlyOnCoreThread());
268 CreateAuthAndConnector(); 293 CreateAuthAndConnector();
269 auth_->AuthenticateWithRobotToken(robot_oauth_refresh_token, robot_email); 294 auth_->AuthenticateWithRobotToken(robot_oauth_refresh_token, robot_email);
270 } 295 }
271 296
272 void CloudPrintProxyBackend::Core::DoInitializeWithRobotAuthCode( 297 void CloudPrintProxyBackend::Core::DoInitializeWithRobotAuthCode(
273 const std::string& robot_oauth_auth_code, 298 const std::string& robot_oauth_auth_code,
274 const std::string& robot_email) { 299 const std::string& robot_email) {
275 DCHECK(base::MessageLoop::current() == backend_->core_thread_.message_loop()); 300 DCHECK(CurrentlyOnCoreThread());
276 CreateAuthAndConnector(); 301 CreateAuthAndConnector();
277 auth_->AuthenticateWithRobotAuthCode(robot_oauth_auth_code, robot_email); 302 auth_->AuthenticateWithRobotAuthCode(robot_oauth_auth_code, robot_email);
278 } 303 }
279 304
280 void CloudPrintProxyBackend::Core::OnAuthenticationComplete( 305 void CloudPrintProxyBackend::Core::OnAuthenticationComplete(
281 const std::string& access_token, 306 const std::string& access_token,
282 const std::string& robot_oauth_refresh_token, 307 const std::string& robot_oauth_refresh_token,
283 const std::string& robot_email, 308 const std::string& robot_email,
284 const std::string& user_email) { 309 const std::string& user_email) {
285 CloudPrintTokenStore* token_store = GetTokenStore(); 310 CloudPrintTokenStore* token_store = GetTokenStore();
286 bool first_time = token_store->token().empty(); 311 bool first_time = token_store->token().empty();
287 token_store->SetToken(access_token); 312 token_store->SetToken(access_token);
288 robot_email_ = robot_email; 313 robot_email_ = robot_email;
289 // Let the frontend know that we have authenticated. 314 // Let the frontend know that we have authenticated.
290 backend_->frontend_loop_->task_runner()->PostTask( 315 PostFrontendTask(FROM_HERE, base::Bind(&Core::NotifyAuthenticated, this,
291 FROM_HERE, 316 robot_oauth_refresh_token, robot_email,
292 base::Bind(&Core::NotifyAuthenticated, this, robot_oauth_refresh_token, 317 user_email));
293 robot_email, user_email));
294 if (first_time) { 318 if (first_time) {
295 InitNotifications(robot_email, access_token); 319 InitNotifications(robot_email, access_token);
296 } else { 320 } else {
297 // If we are refreshing a token, update the XMPP token too. 321 // If we are refreshing a token, update the XMPP token too.
298 DCHECK(push_client_.get()); 322 DCHECK(push_client_.get());
299 push_client_->UpdateCredentials(robot_email, access_token); 323 push_client_->UpdateCredentials(robot_email, access_token);
300 } 324 }
301 // Start cloud print connector if needed. 325 // Start cloud print connector if needed.
302 if (!connector_->IsRunning()) { 326 if (!connector_->IsRunning()) {
303 if (!connector_->Start()) { 327 if (!connector_->Start()) {
304 // Let the frontend know that we do not have a print system. 328 // Let the frontend know that we do not have a print system.
305 backend_->frontend_loop_->task_runner()->PostTask( 329 PostFrontendTask(FROM_HERE,
306 FROM_HERE, base::Bind(&Core::NotifyPrintSystemUnavailable, this)); 330 base::Bind(&Core::NotifyPrintSystemUnavailable, this));
307 } 331 }
308 } 332 }
309 } 333 }
310 334
311 void CloudPrintProxyBackend::Core::OnInvalidCredentials() { 335 void CloudPrintProxyBackend::Core::OnInvalidCredentials() {
312 DCHECK(base::MessageLoop::current() == backend_->core_thread_.message_loop()); 336 DCHECK(CurrentlyOnCoreThread());
313 VLOG(1) << "CP_CONNECTOR: Auth Error"; 337 VLOG(1) << "CP_CONNECTOR: Auth Error";
314 backend_->frontend_loop_->task_runner()->PostTask( 338 PostFrontendTask(FROM_HERE,
315 FROM_HERE, base::Bind(&Core::NotifyAuthenticationFailed, this)); 339 base::Bind(&Core::NotifyAuthenticationFailed, this));
316 } 340 }
317 341
318 void CloudPrintProxyBackend::Core::OnAuthFailed() { 342 void CloudPrintProxyBackend::Core::OnAuthFailed() {
319 VLOG(1) << "CP_CONNECTOR: Authentication failed in connector."; 343 VLOG(1) << "CP_CONNECTOR: Authentication failed in connector.";
320 // Let's stop connecter and refresh token. We'll restart connecter once 344 // Let's stop connecter and refresh token. We'll restart connecter once
321 // new token available. 345 // new token available.
322 if (connector_->IsRunning()) 346 if (connector_->IsRunning())
323 connector_->Stop(); 347 connector_->Stop();
324 348
325 // Refresh Auth token. 349 // Refresh Auth token.
326 auth_->RefreshAccessToken(); 350 auth_->RefreshAccessToken();
327 } 351 }
328 352
329 void CloudPrintProxyBackend::Core::OnXmppPingUpdated(int ping_timeout) { 353 void CloudPrintProxyBackend::Core::OnXmppPingUpdated(int ping_timeout) {
330 settings_.SetXmppPingTimeoutSec(ping_timeout); 354 settings_.SetXmppPingTimeoutSec(ping_timeout);
331 backend_->frontend_loop_->task_runner()->PostTask( 355 PostFrontendTask(
332 FROM_HERE, base::Bind(&Core::NotifyXmppPingUpdated, this, ping_timeout)); 356 FROM_HERE, base::Bind(&Core::NotifyXmppPingUpdated, this, ping_timeout));
333 } 357 }
334 358
335 void CloudPrintProxyBackend::Core::InitNotifications( 359 void CloudPrintProxyBackend::Core::InitNotifications(
336 const std::string& robot_email, 360 const std::string& robot_email,
337 const std::string& access_token) { 361 const std::string& access_token) {
338 DCHECK(base::MessageLoop::current() == backend_->core_thread_.message_loop()); 362 DCHECK(CurrentlyOnCoreThread());
339 363
340 pending_xmpp_pings_ = 0; 364 pending_xmpp_pings_ = 0;
341 notifier::NotifierOptions notifier_options; 365 notifier::NotifierOptions notifier_options;
342 notifier_options.request_context_getter = 366 notifier_options.request_context_getter =
343 g_service_process->GetServiceURLRequestContextGetter(); 367 g_service_process->GetServiceURLRequestContextGetter();
344 notifier_options.auth_mechanism = "X-OAUTH2"; 368 notifier_options.auth_mechanism = "X-OAUTH2";
345 notifier_options.try_ssltcp_first = true; 369 notifier_options.try_ssltcp_first = true;
346 notifier_options.xmpp_host_port = net::HostPortPair::FromString( 370 notifier_options.xmpp_host_port = net::HostPortPair::FromString(
347 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( 371 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
348 switches::kCloudPrintXmppEndpoint)); 372 switches::kCloudPrintXmppEndpoint));
349 push_client_ = notifier::PushClient::CreateDefault(notifier_options); 373 push_client_ = notifier::PushClient::CreateDefault(notifier_options);
350 push_client_->AddObserver(this); 374 push_client_->AddObserver(this);
351 notifier::Subscription subscription; 375 notifier::Subscription subscription;
352 subscription.channel = kCloudPrintPushNotificationsSource; 376 subscription.channel = kCloudPrintPushNotificationsSource;
353 subscription.from = kCloudPrintPushNotificationsSource; 377 subscription.from = kCloudPrintPushNotificationsSource;
354 push_client_->UpdateSubscriptions( 378 push_client_->UpdateSubscriptions(
355 notifier::SubscriptionList(1, subscription)); 379 notifier::SubscriptionList(1, subscription));
356 push_client_->UpdateCredentials(robot_email, access_token); 380 push_client_->UpdateCredentials(robot_email, access_token);
357 } 381 }
358 382
359 void CloudPrintProxyBackend::Core::DoShutdown() { 383 void CloudPrintProxyBackend::Core::DoShutdown() {
360 DCHECK(base::MessageLoop::current() == backend_->core_thread_.message_loop()); 384 DCHECK(CurrentlyOnCoreThread());
361 VLOG(1) << "CP_CONNECTOR: Shutdown connector, id: " << settings_.proxy_id(); 385 VLOG(1) << "CP_CONNECTOR: Shutdown connector, id: " << settings_.proxy_id();
362 386
363 if (connector_->IsRunning()) 387 if (connector_->IsRunning())
364 connector_->Stop(); 388 connector_->Stop();
365 389
366 // Important to delete the PushClient on this thread. 390 // Important to delete the PushClient on this thread.
367 if (push_client_.get()) { 391 if (push_client_.get()) {
368 push_client_->RemoveObserver(this); 392 push_client_->RemoveObserver(this);
369 } 393 }
370 push_client_.reset(); 394 push_client_.reset();
371 notifications_enabled_ = false; 395 notifications_enabled_ = false;
372 notifications_enabled_since_ = base::TimeTicks(); 396 notifications_enabled_since_ = base::TimeTicks();
373 token_store_.reset(); 397 token_store_.reset();
374 398
375 DestroyAuthAndConnector(); 399 DestroyAuthAndConnector();
376 } 400 }
377 401
378 void CloudPrintProxyBackend::Core::DoUnregisterPrinters() { 402 void CloudPrintProxyBackend::Core::DoUnregisterPrinters() {
379 DCHECK(base::MessageLoop::current() == backend_->core_thread_.message_loop()); 403 DCHECK(CurrentlyOnCoreThread());
380 404
381 std::string access_token = GetTokenStore()->token(); 405 std::string access_token = GetTokenStore()->token();
382 406
383 std::list<std::string> printer_ids; 407 std::list<std::string> printer_ids;
384 connector_->GetPrinterIds(&printer_ids); 408 connector_->GetPrinterIds(&printer_ids);
385 409
386 backend_->frontend_loop_->task_runner()->PostTask( 410 PostFrontendTask(FROM_HERE, base::Bind(&Core::NotifyUnregisterPrinters, this,
387 FROM_HERE, base::Bind(&Core::NotifyUnregisterPrinters, this, access_token, 411 access_token, printer_ids));
388 printer_ids));
389 } 412 }
390 413
391 void CloudPrintProxyBackend::Core::HandlePrinterNotification( 414 void CloudPrintProxyBackend::Core::HandlePrinterNotification(
392 const std::string& notification) { 415 const std::string& notification) {
393 DCHECK(base::MessageLoop::current() == backend_->core_thread_.message_loop()); 416 DCHECK(CurrentlyOnCoreThread());
394 417
395 size_t pos = notification.rfind(kNotificationUpdateSettings); 418 size_t pos = notification.rfind(kNotificationUpdateSettings);
396 if (pos == std::string::npos) { 419 if (pos == std::string::npos) {
397 VLOG(1) << "CP_CONNECTOR: Handle printer notification, id: " 420 VLOG(1) << "CP_CONNECTOR: Handle printer notification, id: "
398 << notification; 421 << notification;
399 connector_->CheckForJobs(kJobFetchReasonNotified, notification); 422 connector_->CheckForJobs(kJobFetchReasonNotified, notification);
400 } else { 423 } else {
401 DCHECK(pos == notification.length() - strlen(kNotificationUpdateSettings)); 424 DCHECK(pos == notification.length() - strlen(kNotificationUpdateSettings));
402 std::string printer_id = notification.substr(0, pos); 425 std::string printer_id = notification.substr(0, pos);
403 VLOG(1) << "CP_CONNECTOR: Update printer settings, id: " << printer_id; 426 VLOG(1) << "CP_CONNECTOR: Update printer settings, id: " << printer_id;
404 connector_->UpdatePrinterSettings(printer_id); 427 connector_->UpdatePrinterSettings(printer_id);
405 } 428 }
406 } 429 }
407 430
408 void CloudPrintProxyBackend::Core::PollForJobs() { 431 void CloudPrintProxyBackend::Core::PollForJobs() {
409 VLOG(1) << "CP_CONNECTOR: Polling for jobs."; 432 VLOG(1) << "CP_CONNECTOR: Polling for jobs.";
410 DCHECK(base::MessageLoop::current() == backend_->core_thread_.message_loop()); 433 DCHECK(CurrentlyOnCoreThread());
411 // Check all printers for jobs. 434 // Check all printers for jobs.
412 connector_->CheckForJobs(kJobFetchReasonPoll, std::string()); 435 connector_->CheckForJobs(kJobFetchReasonPoll, std::string());
413 436
414 job_poll_scheduled_ = false; 437 job_poll_scheduled_ = false;
415 // If we don't have notifications and job polling is enabled, poll again 438 // If we don't have notifications and job polling is enabled, poll again
416 // after a while. 439 // after a while.
417 if (!notifications_enabled_ && enable_job_poll_) 440 if (!notifications_enabled_ && enable_job_poll_)
418 ScheduleJobPoll(); 441 ScheduleJobPoll();
419 } 442 }
420 443
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
470 if (pending_xmpp_pings_ >= kMaxFailedXmppPings) { 493 if (pending_xmpp_pings_ >= kMaxFailedXmppPings) {
471 UMA_HISTOGRAM_COUNTS_100("CloudPrint.XmppPingTry", 99); // Max on fail. 494 UMA_HISTOGRAM_COUNTS_100("CloudPrint.XmppPingTry", 99); // Max on fail.
472 // Reconnect to XMPP. 495 // Reconnect to XMPP.
473 pending_xmpp_pings_ = 0; 496 pending_xmpp_pings_ = 0;
474 push_client_.reset(); 497 push_client_.reset();
475 InitNotifications(robot_email_, GetTokenStore()->token()); 498 InitNotifications(robot_email_, GetTokenStore()->token());
476 } 499 }
477 } 500 }
478 501
479 CloudPrintTokenStore* CloudPrintProxyBackend::Core::GetTokenStore() { 502 CloudPrintTokenStore* CloudPrintProxyBackend::Core::GetTokenStore() {
480 DCHECK(base::MessageLoop::current() == backend_->core_thread_.message_loop()); 503 DCHECK(CurrentlyOnCoreThread());
481 if (!token_store_.get()) 504 if (!token_store_.get())
482 token_store_.reset(new CloudPrintTokenStore); 505 token_store_.reset(new CloudPrintTokenStore);
483 return token_store_.get(); 506 return token_store_.get();
484 } 507 }
485 508
486 void CloudPrintProxyBackend::Core::NotifyAuthenticated( 509 void CloudPrintProxyBackend::Core::NotifyAuthenticated(
487 const std::string& robot_oauth_refresh_token, 510 const std::string& robot_oauth_refresh_token,
488 const std::string& robot_email, 511 const std::string& robot_email,
489 const std::string& user_email) { 512 const std::string& user_email) {
490 DCHECK(base::MessageLoop::current() == backend_->frontend_loop_); 513 DCHECK(CurrentlyOnFrontendThread());
491 backend_->frontend_ 514 frontend()->OnAuthenticated(robot_oauth_refresh_token, robot_email,
492 ->OnAuthenticated(robot_oauth_refresh_token, robot_email, user_email); 515 user_email);
493 } 516 }
494 517
495 void CloudPrintProxyBackend::Core::NotifyAuthenticationFailed() { 518 void CloudPrintProxyBackend::Core::NotifyAuthenticationFailed() {
496 DCHECK(base::MessageLoop::current() == backend_->frontend_loop_); 519 DCHECK(CurrentlyOnFrontendThread());
497 backend_->frontend_->OnAuthenticationFailed(); 520 frontend()->OnAuthenticationFailed();
498 } 521 }
499 522
500 void CloudPrintProxyBackend::Core::NotifyPrintSystemUnavailable() { 523 void CloudPrintProxyBackend::Core::NotifyPrintSystemUnavailable() {
501 DCHECK(base::MessageLoop::current() == backend_->frontend_loop_); 524 DCHECK(CurrentlyOnFrontendThread());
502 backend_->frontend_->OnPrintSystemUnavailable(); 525 frontend()->OnPrintSystemUnavailable();
503 } 526 }
504 527
505 void CloudPrintProxyBackend::Core::NotifyUnregisterPrinters( 528 void CloudPrintProxyBackend::Core::NotifyUnregisterPrinters(
506 const std::string& auth_token, 529 const std::string& auth_token,
507 const std::list<std::string>& printer_ids) { 530 const std::list<std::string>& printer_ids) {
508 DCHECK(base::MessageLoop::current() == backend_->frontend_loop_); 531 DCHECK(CurrentlyOnFrontendThread());
509 backend_->frontend_->OnUnregisterPrinters(auth_token, printer_ids); 532 frontend()->OnUnregisterPrinters(auth_token, printer_ids);
510 } 533 }
511 534
512 void CloudPrintProxyBackend::Core::NotifyXmppPingUpdated(int ping_timeout) { 535 void CloudPrintProxyBackend::Core::NotifyXmppPingUpdated(int ping_timeout) {
513 DCHECK(base::MessageLoop::current() == backend_->frontend_loop_); 536 DCHECK(CurrentlyOnFrontendThread());
514 backend_->frontend_->OnXmppPingUpdated(ping_timeout); 537 frontend()->OnXmppPingUpdated(ping_timeout);
515 } 538 }
516 539
517 void CloudPrintProxyBackend::Core::OnNotificationsEnabled() { 540 void CloudPrintProxyBackend::Core::OnNotificationsEnabled() {
518 DCHECK(base::MessageLoop::current() == backend_->core_thread_.message_loop()); 541 DCHECK(CurrentlyOnCoreThread());
519 notifications_enabled_ = true; 542 notifications_enabled_ = true;
520 notifications_enabled_since_ = base::TimeTicks::Now(); 543 notifications_enabled_since_ = base::TimeTicks::Now();
521 VLOG(1) << "Notifications for connector " << settings_.proxy_id() 544 VLOG(1) << "Notifications for connector " << settings_.proxy_id()
522 << " were enabled at " 545 << " were enabled at "
523 << notifications_enabled_since_.ToInternalValue(); 546 << notifications_enabled_since_.ToInternalValue();
524 // Notifications just got re-enabled. In this case we want to schedule 547 // Notifications just got re-enabled. In this case we want to schedule
525 // a poll once for jobs we might have missed when we were dark. 548 // a poll once for jobs we might have missed when we were dark.
526 // Note that ScheduleJobPoll will not schedule again if a job poll task is 549 // Note that ScheduleJobPoll will not schedule again if a job poll task is
527 // already scheduled. 550 // already scheduled.
528 ScheduleJobPoll(); 551 ScheduleJobPoll();
529 552
530 // Schedule periodic ping for XMPP notification channel. 553 // Schedule periodic ping for XMPP notification channel.
531 ScheduleXmppPing(); 554 ScheduleXmppPing();
532 } 555 }
533 556
534 void CloudPrintProxyBackend::Core::OnNotificationsDisabled( 557 void CloudPrintProxyBackend::Core::OnNotificationsDisabled(
535 notifier::NotificationsDisabledReason reason) { 558 notifier::NotificationsDisabledReason reason) {
536 DCHECK(base::MessageLoop::current() == backend_->core_thread_.message_loop()); 559 DCHECK(CurrentlyOnCoreThread());
537 notifications_enabled_ = false; 560 notifications_enabled_ = false;
538 LOG(ERROR) << "Notifications for connector " << settings_.proxy_id() 561 LOG(ERROR) << "Notifications for connector " << settings_.proxy_id()
539 << " disabled."; 562 << " disabled.";
540 notifications_enabled_since_ = base::TimeTicks(); 563 notifications_enabled_since_ = base::TimeTicks();
541 // We just lost notifications. This this case we want to schedule a 564 // We just lost notifications. This this case we want to schedule a
542 // job poll if enable_job_poll_ is true. 565 // job poll if enable_job_poll_ is true.
543 if (enable_job_poll_) 566 if (enable_job_poll_)
544 ScheduleJobPoll(); 567 ScheduleJobPoll();
545 } 568 }
546 569
547 570
548 void CloudPrintProxyBackend::Core::OnIncomingNotification( 571 void CloudPrintProxyBackend::Core::OnIncomingNotification(
549 const notifier::Notification& notification) { 572 const notifier::Notification& notification) {
573 DCHECK(CurrentlyOnCoreThread());
574
550 // Since we got some notification from the server, 575 // Since we got some notification from the server,
551 // reset pending ping counter to 0. 576 // reset pending ping counter to 0.
552 pending_xmpp_pings_ = 0; 577 pending_xmpp_pings_ = 0;
553 578
554 DCHECK(base::MessageLoop::current() == backend_->core_thread_.message_loop());
555 VLOG(1) << "CP_CONNECTOR: Incoming notification."; 579 VLOG(1) << "CP_CONNECTOR: Incoming notification.";
556 if (base::EqualsCaseInsensitiveASCII(kCloudPrintPushNotificationsSource, 580 if (base::EqualsCaseInsensitiveASCII(kCloudPrintPushNotificationsSource,
557 notification.channel)) 581 notification.channel))
558 HandlePrinterNotification(notification.data); 582 HandlePrinterNotification(notification.data);
559 } 583 }
560 584
561 void CloudPrintProxyBackend::Core::OnPingResponse() { 585 void CloudPrintProxyBackend::Core::OnPingResponse() {
562 UMA_HISTOGRAM_COUNTS_100("CloudPrint.XmppPingTry", pending_xmpp_pings_); 586 UMA_HISTOGRAM_COUNTS_100("CloudPrint.XmppPingTry", pending_xmpp_pings_);
563 pending_xmpp_pings_ = 0; 587 pending_xmpp_pings_ = 0;
564 VLOG(1) << "CP_CONNECTOR: Ping response received."; 588 VLOG(1) << "CP_CONNECTOR: Ping response received.";
565 } 589 }
566 590
567 } // namespace cloud_print 591 } // namespace cloud_print
OLDNEW
« no previous file with comments | « chrome/service/cloud_print/cloud_print_proxy_backend.h ('k') | pdf/document_loader.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698