OLD | NEW |
---|---|
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), request_context_(request_context) { |
25 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 25 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
26 DCHECK(request_context_); | 26 DCHECK(request_context_); |
27 } | 27 } |
28 | 28 |
29 DialMediaSinkService::~DialMediaSinkService() {} | 29 DialMediaSinkService::~DialMediaSinkService() {} |
30 | 30 |
31 void DialMediaSinkService::Start() { | 31 void DialMediaSinkService::Start() { |
32 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 32 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
33 dial_registry()->RegisterObserver(this); | 33 content::BrowserThread::PostTask( |
34 dial_registry()->StartPeriodicDiscovery(); | 34 content::BrowserThread::IO, FROM_HERE, |
35 base::Bind(&DialMediaSinkService::StartOnIOThread, this)); | |
35 } | 36 } |
36 | 37 |
37 void DialMediaSinkService::Stop() { | 38 void DialMediaSinkService::Stop() { |
38 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 39 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
39 dial_registry()->UnregisterObserver(this); | 40 content::BrowserThread::PostTask( |
41 content::BrowserThread::IO, FROM_HERE, | |
42 base::Bind(&DialMediaSinkService::StopOnIOThread, this)); | |
40 } | 43 } |
41 | 44 |
42 DialRegistry* DialMediaSinkService::dial_registry() { | 45 DialRegistry* DialMediaSinkService::dial_registry() { |
43 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 46 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
44 return DialRegistry::GetInstance(); | 47 return DialRegistry::GetInstance(); |
45 } | 48 } |
46 | 49 |
47 DeviceDescriptionService* DialMediaSinkService::GetDescriptionService() { | 50 DeviceDescriptionService* DialMediaSinkService::GetDescriptionService() { |
48 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 51 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
49 if (!description_service_.get()) { | 52 if (!description_service_.get()) { |
50 description_service_.reset(new DeviceDescriptionService( | 53 description_service_.reset(new DeviceDescriptionService( |
51 base::Bind(&DialMediaSinkService::OnDeviceDescriptionAvailable, | 54 base::Bind(&DialMediaSinkService::OnDeviceDescriptionAvailable, |
52 base::Unretained(this)), | 55 base::Unretained(this)), |
53 base::Bind(&DialMediaSinkService::OnDeviceDescriptionError, | 56 base::Bind(&DialMediaSinkService::OnDeviceDescriptionError, |
54 base::Unretained(this)))); | 57 base::Unretained(this)))); |
55 } | 58 } |
56 return description_service_.get(); | 59 return description_service_.get(); |
57 } | 60 } |
58 | 61 |
62 void DialMediaSinkService::StartOnIOThread() { | |
63 DCHECK_CURRENTLY_ON(BrowserThread::IO); | |
64 dial_registry()->RegisterObserver(this); | |
65 dial_registry()->OnListenerAdded(); | |
66 } | |
67 | |
68 void DialMediaSinkService::StopOnIOThread() { | |
69 DCHECK_CURRENTLY_ON(BrowserThread::IO); | |
70 dial_registry()->OnListenerRemoved(); | |
71 dial_registry()->UnregisterObserver(this); | |
72 } | |
73 | |
74 void DialMediaSinkService::OnFetchCompletedOnUIThread() { | |
75 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
76 auto sinks = current_sinks_; | |
Kevin M
2017/05/03 21:07:27
Can you just work with current_sinks_ and mrp_sink
zhaobin
2017/05/04 23:52:35
Done.
| |
77 if (sinks == mrp_sinks_) { | |
78 DVLOG(2) << "No update to sink list."; | |
79 return; | |
80 } | |
81 | |
82 DVLOG(2) << "Send sinks to media router, [size]: " << sinks.size(); | |
83 sink_discovery_callback_.Run( | |
84 std::vector<MediaSinkInternal>(sinks.begin(), sinks.end())); | |
85 mrp_sinks_ = std::move(sinks); | |
86 } | |
87 | |
59 void DialMediaSinkService::OnDialDeviceEvent( | 88 void DialMediaSinkService::OnDialDeviceEvent( |
60 const DialRegistry::DeviceList& devices) { | 89 const DialRegistry::DeviceList& devices) { |
61 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 90 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
62 DVLOG(2) << "DialMediaSinkService::OnDialDeviceEvent found " << devices.size() | 91 DVLOG(2) << "DialMediaSinkService::OnDialDeviceEvent found " << devices.size() |
63 << " devices"; | 92 << " devices"; |
64 | 93 |
65 // Add a finish timer. | 94 // Add a finish timer. |
66 finish_timer_.reset(new base::OneShotTimer()); | 95 finish_timer_.reset(new base::OneShotTimer()); |
Kevin M
2017/05/03 21:07:27
Can we reuse the finish_timer object instead of al
zhaobin
2017/05/04 23:52:35
Done.
| |
67 base::TimeDelta finish_delay = | 96 base::TimeDelta finish_delay = |
68 base::TimeDelta::FromSeconds(kFetchCompleteTimeoutSecs); | 97 base::TimeDelta::FromSeconds(kFetchCompleteTimeoutSecs); |
69 finish_timer_->Start(FROM_HERE, finish_delay, this, | 98 finish_timer_->Start(FROM_HERE, finish_delay, this, |
70 &DialMediaSinkService::OnFetchCompleted); | 99 &DialMediaSinkService::OnFetchCompleted); |
71 | 100 |
72 current_sinks_.clear(); | 101 current_sinks_.clear(); |
73 current_devices_ = devices; | 102 current_devices_ = devices; |
74 | 103 |
75 GetDescriptionService()->GetDeviceDescriptions(devices, | 104 GetDescriptionService()->GetDeviceDescriptions(devices, |
76 request_context_.get()); | 105 request_context_.get()); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
124 const std::string& error_message) { | 153 const std::string& error_message) { |
125 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 154 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
126 DVLOG(2) << "OnDescriptionFetchesError [message]: " << error_message; | 155 DVLOG(2) << "OnDescriptionFetchesError [message]: " << error_message; |
127 } | 156 } |
128 | 157 |
129 void DialMediaSinkService::OnFetchCompleted() { | 158 void DialMediaSinkService::OnFetchCompleted() { |
130 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 159 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
131 DCHECK(!sink_discovery_callback_.is_null()); | 160 DCHECK(!sink_discovery_callback_.is_null()); |
132 | 161 |
133 finish_timer_.reset(); | 162 finish_timer_.reset(); |
134 | 163 content::BrowserThread::PostTask( |
135 auto sinks = current_sinks_; | 164 content::BrowserThread::UI, FROM_HERE, |
136 if (sinks == mrp_sinks_) { | 165 base::Bind(&DialMediaSinkService::OnFetchCompletedOnUIThread, this)); |
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 } | 166 } |
146 | 167 |
147 } // namespace media_router | 168 } // namespace media_router |
OLD | NEW |