| // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #ifndef NET_BASE_NETWORK_CHANGE_NOTIFIER_MAC_H_ | 
 | #define NET_BASE_NETWORK_CHANGE_NOTIFIER_MAC_H_ | 
 |  | 
 | #include <SystemConfiguration/SystemConfiguration.h> | 
 |  | 
 | #include <memory> | 
 |  | 
 | #include "base/compiler_specific.h" | 
 | #include "base/mac/scoped_cftyperef.h" | 
 | #include "base/macros.h" | 
 | #include "base/synchronization/condition_variable.h" | 
 | #include "base/synchronization/lock.h" | 
 | #include "net/base/network_change_notifier.h" | 
 | #include "net/base/network_config_watcher_mac.h" | 
 | #include "starboard/types.h" | 
 |  | 
 | namespace net { | 
 |  | 
 | class NetworkChangeNotifierMac: public NetworkChangeNotifier { | 
 |  public: | 
 |   NetworkChangeNotifierMac(); | 
 |   ~NetworkChangeNotifierMac() override; | 
 |  | 
 |   // NetworkChangeNotifier implementation: | 
 |   ConnectionType GetCurrentConnectionType() const override; | 
 |  | 
 |   // Forwarder just exists to keep the NetworkConfigWatcherMac API out of | 
 |   // NetworkChangeNotifierMac's public API. | 
 |   class Forwarder : public NetworkConfigWatcherMac::Delegate { | 
 |    public: | 
 |     explicit Forwarder(NetworkChangeNotifierMac* net_config_watcher) | 
 |         : net_config_watcher_(net_config_watcher) {} | 
 |  | 
 |     // NetworkConfigWatcherMac::Delegate implementation: | 
 |     void Init() override; | 
 |     void StartReachabilityNotifications() override; | 
 |     void SetDynamicStoreNotificationKeys(SCDynamicStoreRef store) override; | 
 |     void OnNetworkConfigChange(CFArrayRef changed_keys) override; | 
 |  | 
 |    private: | 
 |     NetworkChangeNotifierMac* const net_config_watcher_; | 
 |     DISALLOW_COPY_AND_ASSIGN(Forwarder); | 
 |   }; | 
 |  | 
 |  private: | 
 |   class DnsConfigServiceThread; | 
 |  | 
 |   // Called on the main thread on startup, afterwards on the notifier thread. | 
 |   static ConnectionType CalculateConnectionType(SCNetworkConnectionFlags flags); | 
 |  | 
 |   // Methods directly called by the NetworkConfigWatcherMac::Delegate: | 
 |   void StartReachabilityNotifications(); | 
 |   void SetDynamicStoreNotificationKeys(SCDynamicStoreRef store); | 
 |   void OnNetworkConfigChange(CFArrayRef changed_keys); | 
 |  | 
 |   void SetInitialConnectionType(); | 
 |  | 
 |   static void ReachabilityCallback(SCNetworkReachabilityRef target, | 
 |                                    SCNetworkConnectionFlags flags, | 
 |                                    void* notifier); | 
 |  | 
 |   static NetworkChangeCalculatorParams NetworkChangeCalculatorParamsMac(); | 
 |  | 
 |   // These must be constructed before config_watcher_ to ensure | 
 |   // the lock is in a valid state when Forwarder::Init is called. | 
 |   ConnectionType connection_type_; | 
 |   bool connection_type_initialized_; | 
 |   mutable base::Lock connection_type_lock_; | 
 |   mutable base::ConditionVariable initial_connection_type_cv_; | 
 |   base::ScopedCFTypeRef<SCNetworkReachabilityRef> reachability_; | 
 |   base::ScopedCFTypeRef<CFRunLoopRef> run_loop_; | 
 |  | 
 |   Forwarder forwarder_; | 
 |   std::unique_ptr<const NetworkConfigWatcherMac> config_watcher_; | 
 |  | 
 |   std::unique_ptr<DnsConfigServiceThread> dns_config_service_thread_; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(NetworkChangeNotifierMac); | 
 | }; | 
 |  | 
 | }  // namespace net | 
 |  | 
 | #endif  // NET_BASE_NETWORK_CHANGE_NOTIFIER_MAC_H_ |