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