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

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

Issue 2837363002: [Media Router] Use DialMediaSinkService in MediaRouterMojoImpl (Closed)
Patch Set: resolve code review comments from Kevin Created 3 years, 7 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
1 // Copyright 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/media/router/discovery/dial/dial_media_sink_service.h" 5 #include "chrome/browser/media/router/discovery/dial/dial_media_sink_service.h"
6 6
7 #include "chrome/browser/media/router/discovery/dial/dial_device_data.h" 7 #include "chrome/browser/media/router/discovery/dial/dial_device_data.h"
8 #include "chrome/browser/profiles/profile.h" 8 #include "chrome/browser/profiles/profile.h"
9 #include "content/public/browser/browser_thread.h" 9 #include "content/public/browser/browser_thread.h"
10 #include "net/url_request/url_request_context_getter.h" 10 #include "net/url_request/url_request_context_getter.h"
11 11
12 using content::BrowserThread; 12 using content::BrowserThread;
13 13
14 namespace { 14 namespace {
15 // Time interval when media sink service sends sinks to MRP. 15 // Time interval when media sink service sends sinks to MRP.
16 const int kFetchCompleteTimeoutSecs = 3; 16 const int kFetchCompleteTimeoutSecs = 3;
17 } 17 }
18 18
19 namespace media_router { 19 namespace media_router {
20 20
21 DialMediaSinkService::DialMediaSinkService( 21 DialMediaSinkService::DialMediaSinkService(
22 const OnSinksDiscoveredCallback& callback, 22 const OnSinksDiscoveredCallback& callback,
23 net::URLRequestContextGetter* request_context) 23 net::URLRequestContextGetter* request_context)
24 : MediaSinkService(callback), request_context_(request_context) { 24 : MediaSinkService(callback),
25 DCHECK_CURRENTLY_ON(BrowserThread::IO); 25 dial_registry_(nullptr),
Kevin M 2017/05/08 18:22:19 Suggestion: use inline setters in header file. di
zhaobin 2017/05/08 20:13:47 Done.
26 request_context_(request_context) {
27 DCHECK_CURRENTLY_ON(BrowserThread::UI);
26 DCHECK(request_context_); 28 DCHECK(request_context_);
27 } 29 }
28 30
29 DialMediaSinkService::~DialMediaSinkService() {} 31 DialMediaSinkService::~DialMediaSinkService() {}
30 32
31 void DialMediaSinkService::Start() { 33 void DialMediaSinkService::Start() {
32 DCHECK_CURRENTLY_ON(BrowserThread::IO); 34 DCHECK_CURRENTLY_ON(BrowserThread::UI);
33 dial_registry()->RegisterObserver(this); 35 content::BrowserThread::PostTask(
34 dial_registry()->StartPeriodicDiscovery(); 36 content::BrowserThread::IO, FROM_HERE,
37 base::Bind(&DialMediaSinkService::StartOnIOThread, this));
35 } 38 }
36 39
37 void DialMediaSinkService::Stop() { 40 void DialMediaSinkService::Stop() {
38 DCHECK_CURRENTLY_ON(BrowserThread::IO); 41 DCHECK_CURRENTLY_ON(BrowserThread::UI);
39 dial_registry()->UnregisterObserver(this); 42 content::BrowserThread::PostTask(
40 } 43 content::BrowserThread::IO, FROM_HERE,
41 44 base::Bind(&DialMediaSinkService::StopOnIOThread, this));
42 DialRegistry* DialMediaSinkService::dial_registry() {
43 DCHECK_CURRENTLY_ON(BrowserThread::IO);
44 return DialRegistry::GetInstance();
45 } 45 }
46 46
47 DeviceDescriptionService* DialMediaSinkService::GetDescriptionService() { 47 DeviceDescriptionService* DialMediaSinkService::GetDescriptionService() {
48 DCHECK_CURRENTLY_ON(BrowserThread::IO); 48 DCHECK_CURRENTLY_ON(BrowserThread::IO);
49 if (!description_service_.get()) { 49 if (!description_service_.get()) {
50 description_service_.reset(new DeviceDescriptionService( 50 description_service_.reset(new DeviceDescriptionService(
51 base::Bind(&DialMediaSinkService::OnDeviceDescriptionAvailable, 51 base::Bind(&DialMediaSinkService::OnDeviceDescriptionAvailable,
52 base::Unretained(this)), 52 base::Unretained(this)),
53 base::Bind(&DialMediaSinkService::OnDeviceDescriptionError, 53 base::Bind(&DialMediaSinkService::OnDeviceDescriptionError,
54 base::Unretained(this)))); 54 base::Unretained(this))));
55 } 55 }
56 return description_service_.get(); 56 return description_service_.get();
57 } 57 }
58 58
59 void DialMediaSinkService::SetDialRegistryForTest(DialRegistry* dial_registry) {
60 dial_registry_ = dial_registry;
61 }
62
63 void DialMediaSinkService::SetDescriptionServiceForTest(
64 std::unique_ptr<DeviceDescriptionService> description_service) {
65 description_service_ = std::move(description_service);
66 }
67
68 void DialMediaSinkService::SetTimerForTest(std::unique_ptr<base::Timer> timer) {
69 finish_timer_ = std::move(timer);
70 }
71
72 void DialMediaSinkService::StartOnIOThread() {
73 DCHECK_CURRENTLY_ON(BrowserThread::IO);
74 if (!dial_registry_)
75 dial_registry_ = DialRegistry::GetInstance();
76
77 dial_registry_->RegisterObserver(this);
78 dial_registry_->OnListenerAdded();
79 }
80
81 void DialMediaSinkService::StopOnIOThread() {
82 DCHECK_CURRENTLY_ON(BrowserThread::IO);
83 if (!dial_registry_)
84 return;
85
86 dial_registry_->OnListenerRemoved();
87 dial_registry_->UnregisterObserver(this);
88 }
89
90 void DialMediaSinkService::OnFetchCompletedOnUIThread() {
91 DCHECK_CURRENTLY_ON(BrowserThread::UI);
92 if (current_sinks_ == mrp_sinks_) {
93 DVLOG(2) << "No update to sink list.";
94 return;
95 }
96
97 auto sinks = current_sinks_;
98 DVLOG(2) << "Send sinks to media router, [size]: " << sinks.size();
99 sink_discovery_callback_.Run(
100 std::vector<MediaSinkInternal>(sinks.begin(), sinks.end()));
101 mrp_sinks_ = std::move(sinks);
102 }
103
59 void DialMediaSinkService::OnDialDeviceEvent( 104 void DialMediaSinkService::OnDialDeviceEvent(
60 const DialRegistry::DeviceList& devices) { 105 const DialRegistry::DeviceList& devices) {
61 DCHECK_CURRENTLY_ON(BrowserThread::IO); 106 DCHECK_CURRENTLY_ON(BrowserThread::IO);
62 DVLOG(2) << "DialMediaSinkService::OnDialDeviceEvent found " << devices.size() 107 DVLOG(2) << "DialMediaSinkService::OnDialDeviceEvent found " << devices.size()
63 << " devices"; 108 << " devices";
64 109
65 // Add a finish timer. 110 // Add a finish timer.
66 finish_timer_.reset(new base::OneShotTimer()); 111 if (!finish_timer_)
Kevin M 2017/05/08 18:22:19 Could we move these conditional object creation ca
zhaobin 2017/05/08 20:13:47 Done.
112 finish_timer_.reset(new base::OneShotTimer());
113
67 base::TimeDelta finish_delay = 114 base::TimeDelta finish_delay =
68 base::TimeDelta::FromSeconds(kFetchCompleteTimeoutSecs); 115 base::TimeDelta::FromSeconds(kFetchCompleteTimeoutSecs);
69 finish_timer_->Start(FROM_HERE, finish_delay, this, 116 finish_timer_->Start(FROM_HERE, finish_delay,
70 &DialMediaSinkService::OnFetchCompleted); 117 base::Bind(&DialMediaSinkService::OnFetchCompleted,
118 base::Unretained(this)));
71 119
72 current_sinks_.clear(); 120 current_sinks_.clear();
73 current_devices_ = devices; 121 current_devices_ = devices;
74 122
75 GetDescriptionService()->GetDeviceDescriptions(devices, 123 GetDescriptionService()->GetDeviceDescriptions(devices,
76 request_context_.get()); 124 request_context_.get());
77 } 125 }
78 126
79 void DialMediaSinkService::OnDialError(DialRegistry::DialErrorCode type) { 127 void DialMediaSinkService::OnDialError(DialRegistry::DialErrorCode type) {
80 DCHECK_CURRENTLY_ON(BrowserThread::IO); 128 DCHECK_CURRENTLY_ON(BrowserThread::IO);
(...skipping 19 matching lines...) Expand all
100 extra_data.app_url = description_data.app_url; 148 extra_data.app_url = description_data.app_url;
101 extra_data.model_name = description_data.model_name; 149 extra_data.model_name = description_data.model_name;
102 std::string ip_address = device_data.device_description_url().host(); 150 std::string ip_address = device_data.device_description_url().host();
103 if (!extra_data.ip_address.AssignFromIPLiteral(ip_address)) { 151 if (!extra_data.ip_address.AssignFromIPLiteral(ip_address)) {
104 DVLOG(1) << "Invalid ip_address: " << ip_address; 152 DVLOG(1) << "Invalid ip_address: " << ip_address;
105 return; 153 return;
106 } 154 }
107 155
108 current_sinks_.insert(MediaSinkInternal(sink, extra_data)); 156 current_sinks_.insert(MediaSinkInternal(sink, extra_data));
109 157
110 if (finish_timer_) 158 if (finish_timer_ && finish_timer_->IsRunning())
111 return; 159 return;
112 160
113 // Start fetch timer again if device description comes back after 161 // Start fetch timer again if device description comes back after
114 // |finish_timer_| fires. 162 // |finish_timer_| fires.
163 if (!finish_timer_)
164 finish_timer_.reset(new base::OneShotTimer());
165
115 base::TimeDelta finish_delay = 166 base::TimeDelta finish_delay =
116 base::TimeDelta::FromSeconds(kFetchCompleteTimeoutSecs); 167 base::TimeDelta::FromSeconds(kFetchCompleteTimeoutSecs);
117 finish_timer_.reset(new base::OneShotTimer()); 168 finish_timer_->Start(FROM_HERE, finish_delay,
118 finish_timer_->Start(FROM_HERE, finish_delay, this, 169 base::Bind(&DialMediaSinkService::OnFetchCompleted,
119 &DialMediaSinkService::OnFetchCompleted); 170 base::Unretained(this)));
120 } 171 }
121 172
122 void DialMediaSinkService::OnDeviceDescriptionError( 173 void DialMediaSinkService::OnDeviceDescriptionError(
123 const DialDeviceData& device, 174 const DialDeviceData& device,
124 const std::string& error_message) { 175 const std::string& error_message) {
125 DCHECK_CURRENTLY_ON(BrowserThread::IO); 176 DCHECK_CURRENTLY_ON(BrowserThread::IO);
126 DVLOG(2) << "OnDescriptionFetchesError [message]: " << error_message; 177 DVLOG(2) << "OnDescriptionFetchesError [message]: " << error_message;
127 } 178 }
128 179
129 void DialMediaSinkService::OnFetchCompleted() { 180 void DialMediaSinkService::OnFetchCompleted() {
130 DCHECK_CURRENTLY_ON(BrowserThread::IO); 181 DCHECK_CURRENTLY_ON(BrowserThread::IO);
131 DCHECK(!sink_discovery_callback_.is_null()); 182 DCHECK(!sink_discovery_callback_.is_null());
132 183
133 finish_timer_.reset(); 184 content::BrowserThread::PostTask(
134 185 content::BrowserThread::UI, FROM_HERE,
135 auto sinks = current_sinks_; 186 base::Bind(&DialMediaSinkService::OnFetchCompletedOnUIThread, this));
136 if (sinks == mrp_sinks_) {
137 DVLOG(2) << "No update to sink list.";
138 return;
139 }
140
141 DVLOG(2) << "Send sinks to media router, [size]: " << sinks.size();
142 sink_discovery_callback_.Run(
143 std::vector<MediaSinkInternal>(sinks.begin(), sinks.end()));
144 mrp_sinks_ = std::move(sinks);
145 } 187 }
146 188
147 } // namespace media_router 189 } // namespace media_router
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698