Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(59)

Side by Side Diff: chrome/common/net/network_change_observer_proxy.h

Issue 2802015: Massively simplify the NetworkChangeNotifier infrastructure:... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2010 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 #ifndef CHROME_COMMON_NET_NETWORK_CHANGE_OBSERVER_PROXY_H_
6 #define CHROME_COMMON_NET_NETWORK_CHANGE_OBSERVER_PROXY_H_
7
8 // NetworkChangeObserverProxy is a class that listens to a
9 // NetworkChangeNotifier on one thread (the source thread, which is
10 // usually the Chrome IO thread) and emits events to a target observer
11 // on another thread (the target thread).
12 //
13 // How to use:
14 //
15 // In the target thread, create the observer proxy:
16 //
17 // NetworkChangeNotifierThread* source_thread = ...;
18 // NetworkChangeObserverProxy* proxy =
19 // new NetworkChangeObserverProxy(source_thread,
20 // MessageLoop::current());
21 //
22 // Both source_thread and its owned NetworkChangeNotifier must be
23 // guaranteed to outlive the target (current) thread.
24 //
25 // Then, attach the target observer:
26 //
27 // proxy->Attach(target_observer);
28 //
29 // target_observer will then begin to receive events on the target
30 // thread.
31 //
32 // If you call Attach(), you *must* call Detach() before releasing:
33 //
34 // proxy->Detach();
35 // proxy->Release(); // omit if proxy is a scoped_refptr
36 // proxy = NULL;
37 //
38 // The proxy may be destroyed on either the source or the target
39 // thread (depending on which one ends up holding the last reference).
40
41 #include "base/basictypes.h"
42 #include "base/message_loop.h"
43 #include "base/ref_counted.h"
44 #include "net/base/network_change_notifier.h"
45
46 namespace chrome_common_net {
47
48 class NetworkChangeNotifierThread;
49
50 // TODO(akalin): Remove use of private inheritance.
51 class NetworkChangeObserverProxy
52 : public base::RefCountedThreadSafe<NetworkChangeObserverProxy>,
53 private net::NetworkChangeNotifier::Observer {
54 public:
55 // All public methods (including the constructor) must be called on
56 // the target thread.
57
58 // Does not take ownership of any arguments.
59 NetworkChangeObserverProxy(
60 const NetworkChangeNotifierThread* source_thread,
61 MessageLoop* target_message_loop);
62
63 // After this method is called, |target_observer| will start
64 // receiving events on the target thread. Once called, Detach()
65 // must be called before releasing and you cannot call Attach()
66 // again until you have done so. Does not take ownership of
67 // |target_observer|.
68 void Attach(net::NetworkChangeNotifier::Observer* target_observer);
69
70 // After this method is called, the target observer will stop
71 // receiving events. You can call Attach() again after this method
72 // is called.
73 void Detach();
74
75 protected:
76 // May be called on either the source or the target thread. Marked
77 // protected instead of private so that this class can be subclassed
78 // for unit tests.
79 virtual ~NetworkChangeObserverProxy();
80
81 private:
82 friend class base::RefCountedThreadSafe<NetworkChangeObserverProxy>;
83
84 // Adds ourselves as an observer of
85 // |source_network_change_notifier_|. Must be called on the source
86 // thread.
87 void Observe();
88
89 // Removes ourselves as an observer of
90 // |source_network_change_notifier_|. Must be called on the source
91 // thread.
92 void Unobserve();
93
94 // net::NetworkChangeNotifier::Observer implementation.
95 //
96 // Called on the source thread. Posts
97 // TargetObserverOnIPAddressChanged() on the target thread.
98 virtual void OnIPAddressChanged();
99
100 // Called on the target thread. Invokes OnIPAddressChanged() on
101 // |target_observer_|.
102 void TargetObserverOnIPAddressChanged();
103
104 const NetworkChangeNotifierThread* source_thread_;
105 MessageLoop* const target_message_loop_;
106 // |target_observer_| is used only by the target thread.
107 net::NetworkChangeNotifier::Observer* target_observer_;
108
109 DISALLOW_COPY_AND_ASSIGN(NetworkChangeObserverProxy);
110 };
111
112 } // namespace chrome_common_net
113
114 #endif // CHROME_COMMON_NET_NETWORK_CHANGE_OBSERVER_PROXY_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698