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

Side by Side Diff: chrome/browser/media/router/discovery/discovery_network_monitor.cc

Issue 2750453002: Add DiscoveryNetworkMonitor implementation (Closed)
Patch Set: Temporarily fix Windows and Mac compilation Created 3 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
OLDNEW
(Empty)
1 // Copyright (c) 2017 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 #include "chrome/browser/media/router/discovery/discovery_network_monitor.h"
6
7 #include <unordered_set>
8
9 #include "base/lazy_instance.h"
10 #include "base/logging.h"
11 #include "base/sha1.h"
12 #include "base/strings/string_number_conversions.h"
13 #include "base/strings/string_util.h"
14 #include "chrome/browser/media/router/discovery/discovery_network_list.h"
15 #include "net/base/network_interfaces.h"
16
17 namespace {
18
19 using content::BrowserThread;
20
21 std::string ComputeNetworkId(
22 const std::vector<DiscoveryNetworkInfo>& network_info_list) {
23 DCHECK_CURRENTLY_ON(BrowserThread::IO);
24
25 if (network_info_list.size() == 0) {
26 return DiscoveryNetworkMonitor::kNetworkIdDisconnected;
27 }
28 if (std::find_if(network_info_list.begin(), network_info_list.end(),
29 [](const DiscoveryNetworkInfo& network_info) {
30 return network_info.network_id.size() > 0;
31 }) == network_info_list.end()) {
32 return DiscoveryNetworkMonitor::kNetworkIdUnknown;
33 }
34
35 std::string combined_ids;
36 for (const auto& network_info : network_info_list) {
37 combined_ids = combined_ids + "!" + network_info.network_id;
38 }
39
40 std::string hash = base::SHA1HashString(combined_ids);
41 return base::ToLowerASCII(base::HexEncode(hash.data(), hash.length()));
42 }
43
44 std::vector<DiscoveryNetworkInfo> GetNetworkInfo() {
45 DCHECK_CURRENTLY_ON(BrowserThread::IO);
46 return GetDiscoveryNetworkInfoList();
47 }
48
49 base::LazyInstance<DiscoveryNetworkMonitor>::Leaky g_discovery_monitor;
50
51 } // namespace
52
53 // static
54 constexpr char const DiscoveryNetworkMonitor::kNetworkIdDisconnected[];
55 // static
56 constexpr char const DiscoveryNetworkMonitor::kNetworkIdUnknown[];
57
58 // static
59 DiscoveryNetworkMonitor* DiscoveryNetworkMonitor::GetInstance() {
60 return g_discovery_monitor.Pointer();
61 }
62
63 void DiscoveryNetworkMonitor::RebindNetworkChangeObserverForTest() {
64 net::NetworkChangeNotifier::AddNetworkChangeObserver(this);
65 }
66
67 void DiscoveryNetworkMonitor::SetNetworkInfoFunctionForTest(
68 NetworkInfoFunction strategy) {
69 network_info_function_ = strategy;
70 }
71
72 void DiscoveryNetworkMonitor::AddObserver(Observer* const observer) {
73 observers_->AddObserver(observer);
74 }
75
76 void DiscoveryNetworkMonitor::RemoveObserver(Observer* const observer) {
77 observers_->RemoveObserver(observer);
78 }
79
80 void DiscoveryNetworkMonitor::Refresh(NetworkRefreshCompleteCallback callback) {
81 BrowserThread::PostTaskAndReply(
82 BrowserThread::IO, FROM_HERE,
83 base::BindOnce(&DiscoveryNetworkMonitor::UpdateNetworkInfo,
84 base::Unretained(this)),
85 std::move(callback));
86 }
87
88 const std::string& DiscoveryNetworkMonitor::GetNetworkId() const {
89 DCHECK_CURRENTLY_ON(BrowserThread::IO);
90 return network_id_;
91 }
92
93 DiscoveryNetworkMonitor::DiscoveryNetworkMonitor()
94 : network_id_(kNetworkIdDisconnected),
95 observers_(new base::ObserverListThreadSafe<Observer>(
96 base::ObserverListThreadSafe<
97 Observer>::NotificationType::NOTIFY_EXISTING_ONLY)),
98 network_info_function_(&GetNetworkInfo) {
99 net::NetworkChangeNotifier::AddNetworkChangeObserver(this);
100 }
101
102 DiscoveryNetworkMonitor::~DiscoveryNetworkMonitor() {
103 net::NetworkChangeNotifier::RemoveNetworkChangeObserver(this);
104 }
105
106 void DiscoveryNetworkMonitor::OnNetworkChanged(
107 net::NetworkChangeNotifier::ConnectionType) {
108 BrowserThread::PostTask(
109 BrowserThread::IO, FROM_HERE,
110 base::Bind(&DiscoveryNetworkMonitor::UpdateNetworkInfo,
111 base::Unretained(this)));
112 }
113
114 void DiscoveryNetworkMonitor::UpdateNetworkInfo() {
115 DCHECK_CURRENTLY_ON(BrowserThread::IO);
116
117 auto network_info_list = network_info_function_();
118 auto network_id = ComputeNetworkId(network_info_list);
119
120 network_id_.swap(network_id);
121
122 if (network_id_ != network_id) {
123 observers_->Notify(FROM_HERE, &Observer::OnNetworksChanged,
124 base::ConstRef(*this));
125 }
126 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698