146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#ifndef COMPONENTS_NETWORK_TIME_NETWORK_TIME_TRACKER_H_ 646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#define COMPONENTS_NETWORK_TIME_NETWORK_TIME_TRACKER_H_ 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/threading/thread_checker.h" 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class PrefRegistrySimple; 13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class PrefService; 14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace base { 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class TickClock; 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace network_time { 2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// A class that receives network time updates and can provide the network time 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// for a corresponding local time. This class is not thread safe. 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class NetworkTimeTracker { 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static void RegisterPrefs(PrefRegistrySimple* registry); 264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NetworkTimeTracker(scoped_ptr<base::TickClock> tick_clock, 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PrefService* pref_service); 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ~NetworkTimeTracker(); 304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Returns the network time corresponding to |time_ticks| if network time 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // is available. Returns false if no network time is available yet. Can also 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // return the error range if |uncertainty| isn't NULL. 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool GetNetworkTime(base::TimeTicks time_ticks, 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Time* network_time, 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeDelta* uncertainty) const; 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Calculates corresponding time ticks according to the given parameters. 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // The provided |network_time| is precise at the given |resolution| and 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // represent the time between now and up to |latency| + (now - |post_time|) 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // ago. 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void UpdateNetworkTime(base::Time network_time, 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::TimeDelta resolution, 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::TimeDelta latency, 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::TimeTicks post_time); 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool received_network_time() const { 484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return received_network_time_; 494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // For querying current time ticks. 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<base::TickClock> tick_clock_; 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PrefService* pref_service_; 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Network time based on last call to UpdateNetworkTime(). 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Time network_time_; 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // The estimated local time from |tick_clock| that corresponds with 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // |network_time|. Assumes the actual network time measurement was performed 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // midway through the latency time, and does not account for suspect/resume 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // events since the network time was measured. 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // See UpdateNetworkTime(..) implementation for details. 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeTicks network_time_ticks_; 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Uncertainty of |network_time_| based on added inaccuracies/resolution. 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // See UpdateNetworkTime(..) implementation for details. 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeDelta network_time_uncertainty_; 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::ThreadChecker thread_checker_; 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool received_network_time_; 744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(NetworkTimeTracker); 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} // namespace network_time 7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 8046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#endif // COMPONENTS_NETWORK_TIME_NETWORK_TIME_TRACKER_H_ 81