| OLD | NEW |
| (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_ | |
| OLD | NEW |