1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 // 5 // Simple system resources class that uses the current message loop 6 // for scheduling. Assumes the current message loop is already 7 // running. 8 9 #ifndef COMPONENTS_INVALIDATION_SYNC_SYSTEM_RESOURCES_H_ 10 #define COMPONENTS_INVALIDATION_SYNC_SYSTEM_RESOURCES_H_ 11 12 #include <set> 13 #include <string> 14 #include <vector> 15 16 #include "base/compiler_specific.h" 17 #include "base/memory/scoped_ptr.h" 18 #include "base/memory/weak_ptr.h" 19 #include "base/message_loop/message_loop.h" 20 #include "base/threading/non_thread_safe.h" 21 #include "base/values.h" 22 #include "components/invalidation/invalidation_export.h" 23 #include "components/invalidation/invalidator_state.h" 24 #include "components/invalidation/state_writer.h" 25 #include "google/cacheinvalidation/include/system-resources.h" 26 #include "jingle/notifier/base/notifier_options.h" 27 28 namespace syncer { 29 30 class GCMNetworkChannelDelegate; 31 32 class SyncLogger : public invalidation::Logger { 33 public: 34 SyncLogger(); 35 36 virtual ~SyncLogger(); 37 38 // invalidation::Logger implementation. 39 virtual void Log(LogLevel level, const char* file, int line, 40 const char* format, ...) OVERRIDE; 41 42 virtual void SetSystemResources( 43 invalidation::SystemResources* resources) OVERRIDE; 44 }; 45 46 class SyncInvalidationScheduler : public invalidation::Scheduler { 47 public: 48 SyncInvalidationScheduler(); 49 50 virtual ~SyncInvalidationScheduler(); 51 52 // Start and stop the scheduler. 53 void Start(); 54 void Stop(); 55 56 // invalidation::Scheduler implementation. 57 virtual void Schedule(invalidation::TimeDelta delay, 58 invalidation::Closure* task) OVERRIDE; 59 60 virtual bool IsRunningOnThread() const OVERRIDE; 61 62 virtual invalidation::Time GetCurrentTime() const OVERRIDE; 63 64 virtual void SetSystemResources( 65 invalidation::SystemResources* resources) OVERRIDE; 66 67 private: 68 // Runs the task, deletes it, and removes it from |posted_tasks_|. 69 void RunPostedTask(invalidation::Closure* task); 70 71 // Holds all posted tasks that have not yet been run. 72 std::set<invalidation::Closure*> posted_tasks_; 73 74 const base::MessageLoop* created_on_loop_; 75 bool is_started_; 76 bool is_stopped_; 77 78 base::WeakPtrFactory<SyncInvalidationScheduler> weak_factory_; 79 }; 80 81 // SyncNetworkChannel implements common tasks needed to interact with 82 // invalidation library: 83 // - registering message and network status callbacks 84 // - notifying observers about network channel state change 85 // Implementation of particular network protocol should implement 86 // SendMessage and call NotifyStateChange and DeliverIncomingMessage. 87 class INVALIDATION_EXPORT_PRIVATE SyncNetworkChannel 88 : public NON_EXPORTED_BASE(invalidation::NetworkChannel) { 89 public: 90 class Observer { 91 public: 92 // Called when network channel state changes. Possible states are: 93 // - INVALIDATIONS_ENABLED : connection is established and working 94 // - TRANSIENT_INVALIDATION_ERROR : no network, connection lost, etc. 95 // - INVALIDATION_CREDENTIALS_REJECTED : Issues with auth token 96 virtual void OnNetworkChannelStateChanged( 97 InvalidatorState invalidator_state) = 0; 98 }; 99 100 SyncNetworkChannel(); 101 102 virtual ~SyncNetworkChannel(); 103 104 // invalidation::NetworkChannel implementation. 105 // SyncNetworkChannel doesn't implement SendMessage. It is responsibility of 106 // subclass to implement it. 107 virtual void SetMessageReceiver( 108 invalidation::MessageCallback* incoming_receiver) OVERRIDE; 109 virtual void AddNetworkStatusReceiver( 110 invalidation::NetworkStatusCallback* network_status_receiver) OVERRIDE; 111 virtual void SetSystemResources( 112 invalidation::SystemResources* resources) OVERRIDE; 113 114 // Subclass should implement UpdateCredentials to pass new token to channel 115 // library. 116 virtual void UpdateCredentials(const std::string& email, 117 const std::string& token) = 0; 118 119 // Return value from GetInvalidationClientType will be passed to 120 // invalidation::CreateInvalidationClient. Subclass should return one of the 121 // values from ipc::invalidation::ClientType enum from types.proto. 122 virtual int GetInvalidationClientType() = 0; 123 124 // Subclass should implement RequestDetailedStatus to provide debugging 125 // information. 126 virtual void RequestDetailedStatus( 127 base::Callback<void(const base::DictionaryValue&)> callback) = 0; 128 129 // Classes interested in network channel state changes should implement 130 // SyncNetworkChannel::Observer and register here. 131 void AddObserver(Observer* observer); 132 void RemoveObserver(Observer* observer); 133 134 // Helper functions that know how to construct network channels from channel 135 // specific parameters. 136 static scoped_ptr<SyncNetworkChannel> CreatePushClientChannel( 137 const notifier::NotifierOptions& notifier_options); 138 static scoped_ptr<SyncNetworkChannel> CreateGCMNetworkChannel( 139 scoped_refptr<net::URLRequestContextGetter> request_context_getter, 140 scoped_ptr<GCMNetworkChannelDelegate> delegate); 141 142 // Get the count of how many valid received messages were received. 143 int GetReceivedMessagesCount() const; 144 145 protected: 146 // Subclass should call NotifyNetworkStatusChange to notify about network 147 // changes. This triggers cacheinvalidation to try resending failed message 148 // ahead of schedule when client comes online or IP address changes. 149 void NotifyNetworkStatusChange(bool online); 150 151 // Subclass should notify about connection state through 152 // NotifyChannelStateChange. If communication doesn't work and it is possible 153 // that invalidations from server will not reach this client then channel 154 // should call this function with TRANSIENT_INVALIDATION_ERROR. 155 void NotifyChannelStateChange(InvalidatorState invalidator_state); 156 157 // Subclass should call DeliverIncomingMessage for message to reach 158 // invalidations library. 159 bool DeliverIncomingMessage(const std::string& message); 160 161 private: 162 typedef std::vector<invalidation::NetworkStatusCallback*> 163 NetworkStatusReceiverList; 164 165 // Callbacks into invalidation library 166 scoped_ptr<invalidation::MessageCallback> incoming_receiver_; 167 NetworkStatusReceiverList network_status_receivers_; 168 169 // Last network status for new network status receivers. 170 bool last_network_status_; 171 172 int received_messages_count_; 173 174 ObserverList<Observer> observers_; 175 }; 176 177 class SyncStorage : public invalidation::Storage { 178 public: 179 SyncStorage(StateWriter* state_writer, invalidation::Scheduler* scheduler); 180 181 virtual ~SyncStorage(); 182 183 void SetInitialState(const std::string& value) { 184 cached_state_ = value; 185 } 186 187 // invalidation::Storage implementation. 188 virtual void WriteKey(const std::string& key, const std::string& value, 189 invalidation::WriteKeyCallback* done) OVERRIDE; 190 191 virtual void ReadKey(const std::string& key, 192 invalidation::ReadKeyCallback* done) OVERRIDE; 193 194 virtual void DeleteKey(const std::string& key, 195 invalidation::DeleteKeyCallback* done) OVERRIDE; 196 197 virtual void ReadAllKeys( 198 invalidation::ReadAllKeysCallback* key_callback) OVERRIDE; 199 200 virtual void SetSystemResources( 201 invalidation::SystemResources* resources) OVERRIDE; 202 203 private: 204 // Runs the given storage callback with SUCCESS status and deletes it. 205 void RunAndDeleteWriteKeyCallback( 206 invalidation::WriteKeyCallback* callback); 207 208 // Runs the given callback with the given value and deletes it. 209 void RunAndDeleteReadKeyCallback( 210 invalidation::ReadKeyCallback* callback, const std::string& value); 211 212 StateWriter* state_writer_; 213 invalidation::Scheduler* scheduler_; 214 std::string cached_state_; 215 }; 216 217 class INVALIDATION_EXPORT_PRIVATE SyncSystemResources 218 : public NON_EXPORTED_BASE(invalidation::SystemResources) { 219 public: 220 SyncSystemResources(SyncNetworkChannel* sync_network_channel, 221 StateWriter* state_writer); 222 223 virtual ~SyncSystemResources(); 224 225 // invalidation::SystemResources implementation. 226 virtual void Start() OVERRIDE; 227 virtual void Stop() OVERRIDE; 228 virtual bool IsStarted() const OVERRIDE; 229 virtual void set_platform(const std::string& platform); 230 virtual std::string platform() const OVERRIDE; 231 virtual SyncLogger* logger() OVERRIDE; 232 virtual SyncStorage* storage() OVERRIDE; 233 virtual SyncNetworkChannel* network() OVERRIDE; 234 virtual SyncInvalidationScheduler* internal_scheduler() OVERRIDE; 235 virtual SyncInvalidationScheduler* listener_scheduler() OVERRIDE; 236 237 private: 238 bool is_started_; 239 std::string platform_; 240 scoped_ptr<SyncLogger> logger_; 241 scoped_ptr<SyncInvalidationScheduler> internal_scheduler_; 242 scoped_ptr<SyncInvalidationScheduler> listener_scheduler_; 243 scoped_ptr<SyncStorage> storage_; 244 // sync_network_channel_ is owned by SyncInvalidationListener. 245 SyncNetworkChannel* sync_network_channel_; 246 }; 247 248 } // namespace syncer 249 250 #endif // COMPONENTS_INVALIDATION_SYNC_SYSTEM_RESOURCES_H_ 251