12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2012 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)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Simple system resources class that uses the current message loop
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for scheduling.  Assumes the current message loop is already
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// running.
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SYNC_NOTIFIER_SYNC_SYSTEM_RESOURCES_H_
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SYNC_NOTIFIER_SYNC_SYSTEM_RESOURCES_H_
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
199ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/non_thread_safe.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google/cacheinvalidation/include/system-resources.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "sync/base/sync_export.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/notifier/push_client_channel.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/notifier/state_writer.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace notifier {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PushClient;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace notifier
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncer {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SyncLogger : public invalidation::Logger {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SyncLogger();
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SyncLogger();
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // invalidation::Logger implementation.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Log(LogLevel level, const char* file, int line,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const char* format, ...) OVERRIDE;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetSystemResources(
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      invalidation::SystemResources* resources) OVERRIDE;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SyncInvalidationScheduler : public invalidation::Scheduler {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SyncInvalidationScheduler();
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SyncInvalidationScheduler();
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start and stop the scheduler.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Start();
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Stop();
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // invalidation::Scheduler implementation.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Schedule(invalidation::TimeDelta delay,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        invalidation::Closure* task) OVERRIDE;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsRunningOnThread() const OVERRIDE;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual invalidation::Time GetCurrentTime() const OVERRIDE;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetSystemResources(
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      invalidation::SystemResources* resources) OVERRIDE;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtrFactory<SyncInvalidationScheduler> weak_factory_;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Holds all posted tasks that have not yet been run.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<invalidation::Closure*> posted_tasks_;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  const base::MessageLoop* created_on_loop_;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_started_;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_stopped_;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Runs the task, deletes it, and removes it from |posted_tasks_|.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RunPostedTask(invalidation::Closure* task);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SyncStorage : public invalidation::Storage {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SyncStorage(StateWriter* state_writer, invalidation::Scheduler* scheduler);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SyncStorage();
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetInitialState(const std::string& value) {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cached_state_ = value;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // invalidation::Storage implementation.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void WriteKey(const std::string& key, const std::string& value,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        invalidation::WriteKeyCallback* done) OVERRIDE;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ReadKey(const std::string& key,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       invalidation::ReadKeyCallback* done) OVERRIDE;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DeleteKey(const std::string& key,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         invalidation::DeleteKeyCallback* done) OVERRIDE;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ReadAllKeys(
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      invalidation::ReadAllKeysCallback* key_callback) OVERRIDE;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetSystemResources(
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      invalidation::SystemResources* resources) OVERRIDE;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Runs the given storage callback with SUCCESS status and deletes it.
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RunAndDeleteWriteKeyCallback(
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      invalidation::WriteKeyCallback* callback);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Runs the given callback with the given value and deletes it.
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RunAndDeleteReadKeyCallback(
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      invalidation::ReadKeyCallback* callback, const std::string& value);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StateWriter* state_writer_;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  invalidation::Scheduler* scheduler_;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string cached_state_;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SYNC_EXPORT_PRIVATE SyncSystemResources
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public NON_EXPORTED_BASE(invalidation::SystemResources) {
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SyncSystemResources(scoped_ptr<notifier::PushClient> push_client,
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      StateWriter* state_writer);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SyncSystemResources();
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // invalidation::SystemResources implementation.
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Start() OVERRIDE;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Stop() OVERRIDE;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsStarted() const OVERRIDE;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void set_platform(const std::string& platform);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual std::string platform() const OVERRIDE;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual SyncLogger* logger() OVERRIDE;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual SyncStorage* storage() OVERRIDE;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual PushClientChannel* network() OVERRIDE;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual SyncInvalidationScheduler* internal_scheduler() OVERRIDE;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual SyncInvalidationScheduler* listener_scheduler() OVERRIDE;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_started_;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string platform_;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<SyncLogger> logger_;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<SyncInvalidationScheduler> internal_scheduler_;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<SyncInvalidationScheduler> listener_scheduler_;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<SyncStorage> storage_;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PushClientChannel push_client_channel_;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace syncer
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // SYNC_NOTIFIER_SYNC_SYSTEM_RESOURCES_H_
153