146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/invalidation/sync_system_resources.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cstdlib>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cstring>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
139ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h"
1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/invalidation/gcm_network_channel.h"
1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/invalidation/gcm_network_channel_delegate.h"
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/invalidation/invalidation_util.h"
2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/invalidation/push_client_channel.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google/cacheinvalidation/deps/callback.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google/cacheinvalidation/include/types.h"
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "jingle/notifier/listener/push_client.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncer {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncLogger::SyncLogger() {}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncLogger::~SyncLogger() {}
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncLogger::Log(LogLevel level, const char* file, int line,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const char* format, ...) {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  logging::LogSeverity log_severity = -2;  // VLOG(2)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool emit_log = false;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (level) {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case FINE_LEVEL:
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      log_severity = -2;  // VLOG(2)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      emit_log = VLOG_IS_ON(2);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case INFO_LEVEL:
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      log_severity = -1;  // VLOG(1)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      emit_log = VLOG_IS_ON(1);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WARNING_LEVEL:
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      log_severity = logging::LOG_WARNING;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      emit_log = LOG_IS_ON(WARNING);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case SEVERE_LEVEL:
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      log_severity = logging::LOG_ERROR;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      emit_log = LOG_IS_ON(ERROR);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (emit_log) {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    va_list ap;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    va_start(ap, format);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string result;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::StringAppendV(&result, format, ap);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    logging::LogMessage(file, line, log_severity).stream() << result;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    va_end(ap);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncLogger::SetSystemResources(invalidation::SystemResources* resources) {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Do nothing.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncInvalidationScheduler::SyncInvalidationScheduler()
674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    : created_on_loop_(base::MessageLoop::current()),
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_started_(false),
694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      is_stopped_(false),
704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      weak_factory_(this) {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(created_on_loop_);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncInvalidationScheduler::~SyncInvalidationScheduler() {
75b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  CHECK_EQ(created_on_loop_, base::MessageLoop::current());
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(is_stopped_);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncInvalidationScheduler::Start() {
80b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  CHECK_EQ(created_on_loop_, base::MessageLoop::current());
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(!is_started_);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_started_ = true;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_stopped_ = false;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  weak_factory_.InvalidateWeakPtrs();
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncInvalidationScheduler::Stop() {
88b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  CHECK_EQ(created_on_loop_, base::MessageLoop::current());
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_stopped_ = true;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_started_ = false;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  weak_factory_.InvalidateWeakPtrs();
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STLDeleteElements(&posted_tasks_);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  posted_tasks_.clear();
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncInvalidationScheduler::Schedule(invalidation::TimeDelta delay,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         invalidation::Closure* task) {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(invalidation::IsCallbackRepeatable(task));
99b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  CHECK_EQ(created_on_loop_, base::MessageLoop::current());
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!is_started_) {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete task;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  posted_tasks_.insert(task);
107b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::MessageLoop::current()->PostDelayedTask(
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE, base::Bind(&SyncInvalidationScheduler::RunPostedTask,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            weak_factory_.GetWeakPtr(), task),
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delay);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SyncInvalidationScheduler::IsRunningOnThread() const {
114b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return created_on_loop_ == base::MessageLoop::current();
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)invalidation::Time SyncInvalidationScheduler::GetCurrentTime() const {
118b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  CHECK_EQ(created_on_loop_, base::MessageLoop::current());
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::Time::Now();
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncInvalidationScheduler::SetSystemResources(
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    invalidation::SystemResources* resources) {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Do nothing.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncInvalidationScheduler::RunPostedTask(invalidation::Closure* task) {
128b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  CHECK_EQ(created_on_loop_, base::MessageLoop::current());
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  task->Run();
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  posted_tasks_.erase(task);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete task;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)SyncNetworkChannel::SyncNetworkChannel()
1356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    : last_network_status_(false),
13623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      received_messages_count_(0) {}
137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)SyncNetworkChannel::~SyncNetworkChannel() {
139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  STLDeleteElements(&network_status_receivers_);
140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void SyncNetworkChannel::SetMessageReceiver(
143a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    invalidation::MessageCallback* incoming_receiver) {
144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  incoming_receiver_.reset(incoming_receiver);
145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
146a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
147a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void SyncNetworkChannel::AddNetworkStatusReceiver(
148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    invalidation::NetworkStatusCallback* network_status_receiver) {
1496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  network_status_receiver->Run(last_network_status_);
150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  network_status_receivers_.push_back(network_status_receiver);
151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
153a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void SyncNetworkChannel::SetSystemResources(
154a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    invalidation::SystemResources* resources) {
155a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Do nothing.
156a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
157a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
158a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void SyncNetworkChannel::AddObserver(Observer* observer) {
159a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  observers_.AddObserver(observer);
160a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
161a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
162a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void SyncNetworkChannel::RemoveObserver(Observer* observer) {
163a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  observers_.RemoveObserver(observer);
164a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
165a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<SyncNetworkChannel> SyncNetworkChannel::CreatePushClientChannel(
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const notifier::NotifierOptions& notifier_options) {
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<notifier::PushClient> push_client(
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      notifier::PushClient::CreateDefaultOnIOThread(notifier_options));
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return scoped_ptr<SyncNetworkChannel>(
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      new PushClientChannel(push_client.Pass()));
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<SyncNetworkChannel> SyncNetworkChannel::CreateGCMNetworkChannel(
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_refptr<net::URLRequestContextGetter> request_context_getter,
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<GCMNetworkChannelDelegate> delegate) {
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return scoped_ptr<SyncNetworkChannel>(new GCMNetworkChannel(
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      request_context_getter, delegate.Pass()));
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void SyncNetworkChannel::NotifyNetworkStatusChange(bool online) {
1826d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Remember network state for future NetworkStatusReceivers.
1836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  last_network_status_ = online;
184a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Notify NetworkStatusReceivers in cacheinvalidation.
185a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  for (NetworkStatusReceiverList::const_iterator it =
186a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)           network_status_receivers_.begin();
187a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)       it != network_status_receivers_.end(); ++it) {
1886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    (*it)->Run(online);
189a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
1906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
1916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void SyncNetworkChannel::NotifyChannelStateChange(
1936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    InvalidatorState invalidator_state) {
194a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  FOR_EACH_OBSERVER(Observer, observers_,
1956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                    OnNetworkChannelStateChanged(invalidator_state));
196a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool SyncNetworkChannel::DeliverIncomingMessage(const std::string& message) {
199a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!incoming_receiver_) {
200a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    DLOG(ERROR) << "No receiver for incoming notification";
201a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return false;
202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
20323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  received_messages_count_++;
204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  incoming_receiver_->Run(message);
205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return true;
206a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
207a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
20823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)int SyncNetworkChannel::GetReceivedMessagesCount() const {
20923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  return received_messages_count_;
21023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
211a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncStorage::SyncStorage(StateWriter* state_writer,
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         invalidation::Scheduler* scheduler)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : state_writer_(state_writer),
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scheduler_(scheduler) {
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(state_writer_);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(scheduler_);
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncStorage::~SyncStorage() {}
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncStorage::WriteKey(const std::string& key, const std::string& value,
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           invalidation::WriteKeyCallback* done) {
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(state_writer_);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(ghc): actually write key,value associations, and don't invoke the
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // callback until the operation completes.
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  state_writer_->WriteState(value);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cached_state_ = value;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // According to the cache invalidation API folks, we can do this as
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // long as we make sure to clear the persistent state that we start
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // up the cache invalidation client with.  However, we musn't do it
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // right away, as we may be called under a lock that the callback
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // uses.
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scheduler_->Schedule(
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      invalidation::Scheduler::NoDelay(),
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      invalidation::NewPermanentCallback(
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          this, &SyncStorage::RunAndDeleteWriteKeyCallback,
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          done));
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncStorage::ReadKey(const std::string& key,
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          invalidation::ReadKeyCallback* done) {
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(scheduler_->IsRunningOnThread()) << "not running on scheduler thread";
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAndDeleteReadKeyCallback(done, cached_state_);
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncStorage::DeleteKey(const std::string& key,
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            invalidation::DeleteKeyCallback* done) {
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(ghc): Implement.
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LOG(WARNING) << "ignoring call to DeleteKey(" << key << ", callback)";
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncStorage::ReadAllKeys(invalidation::ReadAllKeysCallback* done) {
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(ghc): Implement.
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LOG(WARNING) << "ignoring call to ReadAllKeys(callback)";
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncStorage::SetSystemResources(
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    invalidation::SystemResources* resources) {
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Do nothing.
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncStorage::RunAndDeleteWriteKeyCallback(
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    invalidation::WriteKeyCallback* callback) {
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  callback->Run(
266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      invalidation::Status(invalidation::Status::SUCCESS, std::string()));
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete callback;
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncStorage::RunAndDeleteReadKeyCallback(
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    invalidation::ReadKeyCallback* callback, const std::string& value) {
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  callback->Run(std::make_pair(
273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      invalidation::Status(invalidation::Status::SUCCESS, std::string()),
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      value));
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete callback;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncSystemResources::SyncSystemResources(
279a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    SyncNetworkChannel* sync_network_channel,
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    StateWriter* state_writer)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : is_started_(false),
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      logger_(new SyncLogger()),
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      internal_scheduler_(new SyncInvalidationScheduler()),
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      listener_scheduler_(new SyncInvalidationScheduler()),
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      storage_(new SyncStorage(state_writer, internal_scheduler_.get())),
286a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      sync_network_channel_(sync_network_channel) {
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncSystemResources::~SyncSystemResources() {
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Stop();
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncSystemResources::Start() {
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  internal_scheduler_->Start();
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  listener_scheduler_->Start();
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_started_ = true;
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncSystemResources::Stop() {
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  internal_scheduler_->Stop();
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  listener_scheduler_->Stop();
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SyncSystemResources::IsStarted() const {
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return is_started_;
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncSystemResources::set_platform(const std::string& platform) {
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  platform_ = platform;
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string SyncSystemResources::platform() const {
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return platform_;
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncLogger* SyncSystemResources::logger() {
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return logger_.get();
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncStorage* SyncSystemResources::storage() {
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return storage_.get();
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
324a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)SyncNetworkChannel* SyncSystemResources::network() {
325a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return sync_network_channel_;
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncInvalidationScheduler* SyncSystemResources::internal_scheduler() {
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return internal_scheduler_.get();
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncInvalidationScheduler* SyncSystemResources::listener_scheduler() {
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return listener_scheduler_.get();
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace syncer
337