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