1 // Copyright (c) 2012 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 NET_BASE_NETWORK_CHANGE_NOTIFIER_MAC_H_ 6 #define NET_BASE_NETWORK_CHANGE_NOTIFIER_MAC_H_ 7 8 #include <SystemConfiguration/SystemConfiguration.h> 9 10 #include "base/basictypes.h" 11 #include "base/compiler_specific.h" 12 #include "base/mac/scoped_cftyperef.h" 13 #include "base/memory/scoped_ptr.h" 14 #include "base/synchronization/condition_variable.h" 15 #include "base/synchronization/lock.h" 16 #include "net/base/network_change_notifier.h" 17 #include "net/base/network_config_watcher_mac.h" 18 19 namespace net { 20 21 class NetworkChangeNotifierMac: public NetworkChangeNotifier { 22 public: 23 NetworkChangeNotifierMac(); 24 virtual ~NetworkChangeNotifierMac(); 25 26 // NetworkChangeNotifier implementation: 27 virtual ConnectionType GetCurrentConnectionType() const OVERRIDE; 28 29 // Forwarder just exists to keep the NetworkConfigWatcherMac API out of 30 // NetworkChangeNotifierMac's public API. 31 class Forwarder : public NetworkConfigWatcherMac::Delegate { 32 public: 33 explicit Forwarder(NetworkChangeNotifierMac* net_config_watcher) 34 : net_config_watcher_(net_config_watcher) {} 35 36 // NetworkConfigWatcherMac::Delegate implementation: 37 virtual void Init() OVERRIDE; 38 virtual void StartReachabilityNotifications() OVERRIDE; 39 virtual void SetDynamicStoreNotificationKeys( 40 SCDynamicStoreRef store) OVERRIDE; 41 virtual void OnNetworkConfigChange(CFArrayRef changed_keys) OVERRIDE; 42 43 private: 44 NetworkChangeNotifierMac* const net_config_watcher_; 45 DISALLOW_COPY_AND_ASSIGN(Forwarder); 46 }; 47 48 private: 49 class DnsConfigServiceThread; 50 51 // Methods directly called by the NetworkConfigWatcherMac::Delegate: 52 void StartReachabilityNotifications(); 53 void SetDynamicStoreNotificationKeys(SCDynamicStoreRef store); 54 void OnNetworkConfigChange(CFArrayRef changed_keys); 55 56 void SetInitialConnectionType(); 57 58 static void ReachabilityCallback(SCNetworkReachabilityRef target, 59 SCNetworkConnectionFlags flags, 60 void* notifier); 61 62 static NetworkChangeCalculatorParams NetworkChangeCalculatorParamsMac(); 63 64 // These must be constructed before config_watcher_ to ensure 65 // the lock is in a valid state when Forwarder::Init is called. 66 ConnectionType connection_type_; 67 bool connection_type_initialized_; 68 mutable base::Lock connection_type_lock_; 69 mutable base::ConditionVariable initial_connection_type_cv_; 70 base::ScopedCFTypeRef<SCNetworkReachabilityRef> reachability_; 71 base::ScopedCFTypeRef<CFRunLoopRef> run_loop_; 72 73 Forwarder forwarder_; 74 scoped_ptr<const NetworkConfigWatcherMac> config_watcher_; 75 76 scoped_ptr<DnsConfigServiceThread> dns_config_service_thread_; 77 78 DISALLOW_COPY_AND_ASSIGN(NetworkChangeNotifierMac); 79 }; 80 81 } // namespace net 82 83 #endif // NET_BASE_NETWORK_CHANGE_NOTIFIER_MAC_H_ 84