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

Unified Diff: chrome/service/cloud_print/cloud_print_proxy_backend.cc

Issue 11232048: Adding XMPP ping functionality to CLoudPrint. XMPP ping and timeout is controlled thorugh Service S… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: comments addressed Created 8 years, 2 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/service/cloud_print/cloud_print_consts.h ('k') | chrome/service/cloud_print/connector_settings.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/service/cloud_print/cloud_print_proxy_backend.cc
diff --git a/chrome/service/cloud_print/cloud_print_proxy_backend.cc b/chrome/service/cloud_print/cloud_print_proxy_backend.cc
index 16d7211f39ed6a2a3b007e7def6bdd0e6addfc67..44df7b60d6adbcfadfe0461ca6a3e5b5a748a6fe 100644
--- a/chrome/service/cloud_print/cloud_print_proxy_backend.cc
+++ b/chrome/service/cloud_print/cloud_print_proxy_backend.cc
@@ -8,10 +8,12 @@
#include <vector>
#include "base/bind.h"
+#include "base/command_line.h"
#include "base/compiler_specific.h"
#include "base/file_util.h"
#include "base/rand_util.h"
#include "base/values.h"
+#include "chrome/common/chrome_switches.h"
#include "chrome/service/cloud_print/cloud_print_auth.h"
#include "chrome/service/cloud_print/cloud_print_connector.h"
#include "chrome/service/cloud_print/cloud_print_consts.h"
@@ -88,6 +90,7 @@ class CloudPrintProxyBackend::Core
notifier::NotificationsDisabledReason reason) OVERRIDE;
virtual void OnIncomingNotification(
const notifier::Notification& notification) OVERRIDE;
+ virtual void OnPingResponse() OVERRIDE;
private:
friend class base::RefCountedThreadSafe<Core>;
@@ -119,6 +122,10 @@ class CloudPrintProxyBackend::Core
// Schedules a task to poll for jobs. Does nothing if a task is already
// scheduled.
void ScheduleJobPoll();
+ void PingXmppServer();
+ void ScheduleXmppPing();
+ void CheckXmppPingStatus();
+
CloudPrintTokenStore* GetTokenStore();
// Our parent CloudPrintProxyBackend
@@ -143,8 +150,13 @@ class CloudPrintProxyBackend::Core
bool job_poll_scheduled_;
// Indicates whether we should poll for jobs when we lose XMPP connection.
bool enable_job_poll_;
+ // Indicates whether a task to ping xmpp server has been scheduled.
+ bool xmpp_ping_scheduled_;
+ // Number of XMPP pings pending reply from the server.
+ int pending_xmpp_pings_;
// Connector settings.
ConnectorSettings settings_;
+ std::string robot_email_;
scoped_ptr<CloudPrintTokenStore> token_store_;
DISALLOW_COPY_AND_ASSIGN(Core);
@@ -240,7 +252,9 @@ CloudPrintProxyBackend::Core::Core(
oauth_client_info_(oauth_client_info),
notifications_enabled_(false),
job_poll_scheduled_(false),
- enable_job_poll_(enable_job_poll) {
+ enable_job_poll_(enable_job_poll),
+ xmpp_ping_scheduled_(false),
+ pending_xmpp_pings_(0) {
settings_.CopyFrom(settings);
}
@@ -305,6 +319,7 @@ void CloudPrintProxyBackend::Core::OnAuthenticationComplete(
CloudPrintTokenStore* token_store = GetTokenStore();
bool first_time = token_store->token().empty();
token_store->SetToken(access_token);
+ robot_email_ = robot_email;
// Let the frontend know that we have authenticated.
backend_->frontend_loop_->PostTask(
FROM_HERE,
@@ -350,6 +365,7 @@ void CloudPrintProxyBackend::Core::InitNotifications(
const std::string& access_token) {
DCHECK(MessageLoop::current() == backend_->core_thread_.message_loop());
+ pending_xmpp_pings_ = 0;
notifier::NotifierOptions notifier_options;
notifier_options.request_context_getter =
g_service_process->GetServiceURLRequestContextGetter();
@@ -430,6 +446,53 @@ void CloudPrintProxyBackend::Core::ScheduleJobPoll() {
}
}
+void CloudPrintProxyBackend::Core::PingXmppServer() {
+ xmpp_ping_scheduled_ = false;
+
+ if (!push_client_.get())
+ return;
+
+ push_client_->SendPing();
+
+ pending_xmpp_pings_++;
+ if (pending_xmpp_pings_ >= kMaxFailedXmppPings) {
+ // Check ping status when we close to the limit.
+ MessageLoop::current()->PostDelayedTask(
+ FROM_HERE,
+ base::Bind(&CloudPrintProxyBackend::Core::CheckXmppPingStatus, this),
+ base::TimeDelta::FromSeconds(kXmppPingCheckIntervalSecs));
+ }
+
+ // Schedule next ping if needed.
+ if (notifications_enabled_)
+ ScheduleXmppPing();
+}
+
+void CloudPrintProxyBackend::Core::ScheduleXmppPing() {
+ if (!settings_.xmpp_ping_enabled())
+ return;
+
+ if (!xmpp_ping_scheduled_) {
+ base::TimeDelta interval = base::TimeDelta::FromSeconds(
+ base::RandInt(settings_.xmpp_ping_timeout_sec() * 0.9,
+ settings_.xmpp_ping_timeout_sec() * 1.1));
+ MessageLoop::current()->PostDelayedTask(
+ FROM_HERE,
+ base::Bind(&CloudPrintProxyBackend::Core::PingXmppServer, this),
+ interval);
+ xmpp_ping_scheduled_ = true;
+ }
+}
+
+void CloudPrintProxyBackend::Core::CheckXmppPingStatus() {
+ if (pending_xmpp_pings_ >= kMaxFailedXmppPings) {
+ // Reconnect to XMPP.
+ pending_xmpp_pings_ = 0;
+ push_client_.reset();
+ InitNotifications(robot_email_, GetTokenStore()->token());
+ }
+}
+
CloudPrintTokenStore* CloudPrintProxyBackend::Core::GetTokenStore() {
DCHECK(MessageLoop::current() == backend_->core_thread_.message_loop());
if (!token_store_.get())
@@ -476,6 +539,9 @@ void CloudPrintProxyBackend::Core::OnNotificationsEnabled() {
// Note that ScheduleJobPoll will not schedule again if a job poll task is
// already scheduled.
ScheduleJobPoll();
+
+ // Schedule periodic ping for XMPP notification channel.
+ ScheduleXmppPing();
}
void CloudPrintProxyBackend::Core::OnNotificationsDisabled(
@@ -494,6 +560,10 @@ void CloudPrintProxyBackend::Core::OnNotificationsDisabled(
void CloudPrintProxyBackend::Core::OnIncomingNotification(
const notifier::Notification& notification) {
+ // Since we got some notification from the server,
+ // reset pending ping counter to 0.
+ pending_xmpp_pings_ = 0;
+
DCHECK(MessageLoop::current() == backend_->core_thread_.message_loop());
VLOG(1) << "CP_CONNECTOR: Incoming notification.";
if (0 == base::strcasecmp(kCloudPrintPushNotificationsSource,
@@ -501,3 +571,8 @@ void CloudPrintProxyBackend::Core::OnIncomingNotification(
HandlePrinterNotification(notification.data);
}
+void CloudPrintProxyBackend::Core::OnPingResponse() {
+ pending_xmpp_pings_ = 0;
+ VLOG(1) << "CP_CONNECTOR: Ping response received.";
+}
+
« no previous file with comments | « chrome/service/cloud_print/cloud_print_consts.h ('k') | chrome/service/cloud_print/connector_settings.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698