• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 // An implementation of SyncNotifier that wraps InvalidationNotifier
6 // on its own thread.
7 
8 #ifndef COMPONENTS_INVALIDATION_NON_BLOCKING_INVALIDATOR_H_
9 #define COMPONENTS_INVALIDATION_NON_BLOCKING_INVALIDATOR_H_
10 
11 #include <string>
12 
13 #include "base/basictypes.h"
14 #include "base/callback.h"
15 #include "base/compiler_specific.h"
16 #include "base/memory/ref_counted.h"
17 #include "base/memory/weak_ptr.h"
18 #include "components/invalidation/invalidation_export.h"
19 #include "components/invalidation/invalidator_registrar.h"
20 #include "jingle/notifier/base/notifier_options.h"
21 #include "sync/internal_api/public/base/invalidator_state.h"
22 #include "sync/notifier/invalidation_state_tracker.h"
23 #include "sync/notifier/invalidator.h"
24 #include "sync/notifier/unacked_invalidation_set.h"
25 
26 namespace base {
27 class SingleThreadTaskRunner;
28 }  // namespace base
29 
30 namespace syncer {
31 class SyncNetworkChannel;
32 class GCMNetworkChannelDelegate;
33 
34 // Callback type for function that creates SyncNetworkChannel. This function
35 // gets passed into NonBlockingInvalidator constructor.
36 typedef base::Callback<scoped_ptr<SyncNetworkChannel>(void)>
37     NetworkChannelCreator;
38 
39 class INVALIDATION_EXPORT_PRIVATE NonBlockingInvalidator
40     : public Invalidator,
41       public InvalidationStateTracker {
42  public:
43   // |invalidation_state_tracker| must be initialized and must outlive |this|.
44   NonBlockingInvalidator(
45       NetworkChannelCreator network_channel_creator,
46       const std::string& invalidator_client_id,
47       const UnackedInvalidationsMap& saved_invalidations,
48       const std::string& invalidation_bootstrap_data,
49       InvalidationStateTracker* invalidation_state_tracker,
50       const std::string& client_info,
51       const scoped_refptr<net::URLRequestContextGetter>&
52           request_context_getter);
53 
54   virtual ~NonBlockingInvalidator();
55 
56   // Invalidator implementation.
57   virtual void RegisterHandler(InvalidationHandler* handler) OVERRIDE;
58   virtual void UpdateRegisteredIds(InvalidationHandler* handler,
59                                    const ObjectIdSet& ids) OVERRIDE;
60   virtual void UnregisterHandler(InvalidationHandler* handler) OVERRIDE;
61   virtual InvalidatorState GetInvalidatorState() const OVERRIDE;
62   virtual void UpdateCredentials(
63       const std::string& email, const std::string& token) OVERRIDE;
64   virtual void RequestDetailedStatus(
65       base::Callback<void(const base::DictionaryValue&)> callback) const
66       OVERRIDE;
67 
68   // Static functions to construct callback that creates network channel for
69   // SyncSystemResources. The goal is to pass network channel to invalidator at
70   // the same time not exposing channel specific parameters to invalidator and
71   // channel implementation to client of invalidator.
72   static NetworkChannelCreator MakePushClientChannelCreator(
73       const notifier::NotifierOptions& notifier_options);
74   static NetworkChannelCreator MakeGCMNetworkChannelCreator(
75       scoped_refptr<net::URLRequestContextGetter> request_context_getter,
76       scoped_ptr<GCMNetworkChannelDelegate> delegate);
77 
78   // These methods are forwarded to the invalidation_state_tracker_.
79   virtual void ClearAndSetNewClientId(const std::string& data) OVERRIDE;
80   virtual std::string GetInvalidatorClientId() const OVERRIDE;
81   virtual void SetBootstrapData(const std::string& data) OVERRIDE;
82   virtual std::string GetBootstrapData() const OVERRIDE;
83   virtual void SetSavedInvalidations(
84       const UnackedInvalidationsMap& states) OVERRIDE;
85   virtual UnackedInvalidationsMap GetSavedInvalidations() const OVERRIDE;
86   virtual void Clear() OVERRIDE;
87 
88  private:
89   void OnInvalidatorStateChange(InvalidatorState state);
90   void OnIncomingInvalidation(const ObjectIdInvalidationMap& invalidation_map);
91   std::string GetOwnerName() const;
92 
93   friend class NonBlockingInvalidatorTestDelegate;
94 
95   struct InitializeOptions;
96   class Core;
97 
98   InvalidatorRegistrar registrar_;
99   InvalidationStateTracker* invalidation_state_tracker_;
100 
101   // The real guts of NonBlockingInvalidator, which allows this class to live
102   // completely on the parent thread.
103   scoped_refptr<Core> core_;
104   scoped_refptr<base::SingleThreadTaskRunner> parent_task_runner_;
105   scoped_refptr<base::SingleThreadTaskRunner> network_task_runner_;
106 
107   base::WeakPtrFactory<NonBlockingInvalidator> weak_ptr_factory_;
108 
109   DISALLOW_COPY_AND_ASSIGN(NonBlockingInvalidator);
110 };
111 
112 }  // namespace syncer
113 
114 #endif  // COMPONENTS_INVALIDATION_NON_BLOCKING_INVALIDATOR_H_
115