Chromium Code Reviews| 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 |