- add sources.
[platform/framework/web/crosswalk.git] / src / net / base / network_change_notifier_mac.h
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_