| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/ui/webui/media_router/query_result_manager.h" | 5 #include "chrome/browser/ui/webui/media_router/query_result_manager.h" |
| 6 | 6 |
| 7 #include "base/containers/hash_tables.h" | 7 #include "base/containers/hash_tables.h" |
| 8 #include "base/stl_util.h" | 8 #include "base/stl_util.h" |
| 9 #include "chrome/browser/media/router/media_router.h" | 9 #include "chrome/browser/media/router/media_router.h" |
| 10 #include "chrome/browser/media/router/media_sinks_observer.h" | 10 #include "chrome/browser/media/router/media_sinks_observer.h" |
| 11 #include "chrome/browser/media/router/media_sinks_search_request.h" |
| 11 | 12 |
| 12 namespace media_router { | 13 namespace media_router { |
| 13 | 14 |
| 14 // MediaSinkObserver that propagates results back to |result_manager|. | 15 // MediaSinkObserver that propagates results back to |result_manager|. |
| 15 // An instance of this class is associated with each registered MediaCastMode. | 16 // An instance of this class is associated with each registered MediaCastMode. |
| 16 class QueryResultManager::CastModeMediaSinksObserver | 17 class QueryResultManager::CastModeMediaSinksObserver |
| 17 : public MediaSinksObserver { | 18 : public MediaSinksObserver { |
| 18 public: | 19 public: |
| 19 CastModeMediaSinksObserver(MediaCastMode cast_mode, | 20 CastModeMediaSinksObserver(MediaCastMode cast_mode, |
| 20 const MediaSource& source, | 21 const MediaSource& source, |
| (...skipping 24 matching lines...) Expand all Loading... |
| 45 } | 46 } |
| 46 | 47 |
| 47 MediaCastMode cast_mode() const { return cast_mode_; } | 48 MediaCastMode cast_mode() const { return cast_mode_; } |
| 48 | 49 |
| 49 private: | 50 private: |
| 50 MediaCastMode cast_mode_; | 51 MediaCastMode cast_mode_; |
| 51 std::vector<MediaSink::Id> latest_sink_ids_; | 52 std::vector<MediaSink::Id> latest_sink_ids_; |
| 52 QueryResultManager* result_manager_; | 53 QueryResultManager* result_manager_; |
| 53 }; | 54 }; |
| 54 | 55 |
| 56 class QueryResultManager::SearchSinksRequest : public MediaSinksSearchRequest { |
| 57 public: |
| 58 SearchSinksRequest(const MediaSource& source, |
| 59 const MediaSink::Id& sink_id, |
| 60 QueryResultManager* result_manager) |
| 61 : MediaSinksSearchRequest(source, sink_id), |
| 62 result_manager_(result_manager) {} |
| 63 |
| 64 void OnResultsReceived(const std::vector<MediaSink>& result) override { |
| 65 result_manager_->NotifyOnSearchResults(sink_id(), result); |
| 66 } |
| 67 |
| 68 private: |
| 69 QueryResultManager* result_manager_; |
| 70 }; |
| 71 |
| 55 QueryResultManager::QueryResultManager(MediaRouter* router) : router_(router) { | 72 QueryResultManager::QueryResultManager(MediaRouter* router) : router_(router) { |
| 56 DCHECK(router_); | 73 DCHECK(router_); |
| 57 } | 74 } |
| 58 | 75 |
| 59 QueryResultManager::~QueryResultManager() { | 76 QueryResultManager::~QueryResultManager() { |
| 60 DCHECK(thread_checker_.CalledOnValidThread()); | 77 DCHECK(thread_checker_.CalledOnValidThread()); |
| 61 } | 78 } |
| 62 | 79 |
| 63 void QueryResultManager::AddObserver(Observer* observer) { | 80 void QueryResultManager::AddObserver(Observer* observer) { |
| 64 DCHECK(thread_checker_.CalledOnValidThread()); | 81 DCHECK(thread_checker_.CalledOnValidThread()); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 95 } | 112 } |
| 96 | 113 |
| 97 void QueryResultManager::StopSinksQuery(MediaCastMode cast_mode) { | 114 void QueryResultManager::StopSinksQuery(MediaCastMode cast_mode) { |
| 98 DCHECK(thread_checker_.CalledOnValidThread()); | 115 DCHECK(thread_checker_.CalledOnValidThread()); |
| 99 RemoveObserverForCastMode(cast_mode); | 116 RemoveObserverForCastMode(cast_mode); |
| 100 SetSourceForCastMode(cast_mode, MediaSource()); | 117 SetSourceForCastMode(cast_mode, MediaSource()); |
| 101 UpdateWithSinksQueryResult(cast_mode, std::vector<MediaSink>()); | 118 UpdateWithSinksQueryResult(cast_mode, std::vector<MediaSink>()); |
| 102 NotifyOnResultsUpdated(); | 119 NotifyOnResultsUpdated(); |
| 103 } | 120 } |
| 104 | 121 |
| 122 void QueryResultManager::StartSinkSearch(MediaCastMode cast_mode, |
| 123 const MediaSink::Id& sink_id) { |
| 124 DCHECK(thread_checker_.CalledOnValidThread()); |
| 125 |
| 126 auto source = GetSourceForCastMode(cast_mode); |
| 127 if (source.Empty()) { |
| 128 return; |
| 129 } |
| 130 auto observer = |
| 131 make_scoped_ptr(new SearchSinksRequest(source, sink_id, this)); |
| 132 router_->RegisterMediaSinksSearchRequest(std::move(observer)); |
| 133 } |
| 134 |
| 105 void QueryResultManager::SetSourceForCastMode( | 135 void QueryResultManager::SetSourceForCastMode( |
| 106 MediaCastMode cast_mode, const MediaSource& source) { | 136 MediaCastMode cast_mode, const MediaSource& source) { |
| 107 DCHECK(thread_checker_.CalledOnValidThread()); | 137 DCHECK(thread_checker_.CalledOnValidThread()); |
| 108 cast_mode_sources_[cast_mode] = source; | 138 cast_mode_sources_[cast_mode] = source; |
| 109 } | 139 } |
| 110 | 140 |
| 111 void QueryResultManager::RemoveObserverForCastMode(MediaCastMode cast_mode) { | 141 void QueryResultManager::RemoveObserverForCastMode(MediaCastMode cast_mode) { |
| 112 auto observers_it = sinks_observers_.find(cast_mode); | 142 auto observers_it = sinks_observers_.find(cast_mode); |
| 113 if (observers_it != sinks_observers_.end()) | 143 if (observers_it != sinks_observers_.end()) |
| 114 sinks_observers_.erase(observers_it); | 144 sinks_observers_.erase(observers_it); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 151 | 181 |
| 152 void QueryResultManager::GetSupportedCastModes(CastModeSet* cast_modes) const { | 182 void QueryResultManager::GetSupportedCastModes(CastModeSet* cast_modes) const { |
| 153 DCHECK(cast_modes); | 183 DCHECK(cast_modes); |
| 154 cast_modes->clear(); | 184 cast_modes->clear(); |
| 155 for (const auto& observer_pair : sinks_observers_) { | 185 for (const auto& observer_pair : sinks_observers_) { |
| 156 cast_modes->insert(observer_pair.first); | 186 cast_modes->insert(observer_pair.first); |
| 157 } | 187 } |
| 158 } | 188 } |
| 159 | 189 |
| 160 MediaSource QueryResultManager::GetSourceForCastMode( | 190 MediaSource QueryResultManager::GetSourceForCastMode( |
| 161 MediaCastMode cast_mode) const { | 191 MediaCastMode cast_mode) const { |
| 162 DCHECK(thread_checker_.CalledOnValidThread()); | 192 DCHECK(thread_checker_.CalledOnValidThread()); |
| 163 auto source_it = cast_mode_sources_.find(cast_mode); | 193 auto source_it = cast_mode_sources_.find(cast_mode); |
| 164 return source_it == cast_mode_sources_.end() ? | 194 return source_it == cast_mode_sources_.end() ? MediaSource() |
| 165 MediaSource() : source_it->second; | 195 : source_it->second; |
| 166 } | 196 } |
| 167 | 197 |
| 168 void QueryResultManager::NotifyOnResultsUpdated() { | 198 void QueryResultManager::NotifyOnResultsUpdated() { |
| 169 std::vector<MediaSinkWithCastModes> sinks; | 199 std::vector<MediaSinkWithCastModes> sinks; |
| 170 for (const auto& sink_pair : all_sinks_) { | 200 for (const auto& sink_pair : all_sinks_) { |
| 171 sinks.push_back(sink_pair.second); | 201 sinks.push_back(sink_pair.second); |
| 172 } | 202 } |
| 173 FOR_EACH_OBSERVER(QueryResultManager::Observer, observers_, | 203 FOR_EACH_OBSERVER(QueryResultManager::Observer, observers_, |
| 174 OnResultsUpdated(sinks)); | 204 OnResultsUpdated(sinks)); |
| 175 } | 205 } |
| 176 | 206 |
| 207 void QueryResultManager::NotifyOnSearchResults( |
| 208 const MediaSink::Id& sink_id, |
| 209 const std::vector<MediaSink>& sinks) { |
| 210 std::vector<MediaSinkWithCastModes> sinks_with_cast_modes; |
| 211 sinks_with_cast_modes.reserve(sinks.size()); |
| 212 for (const auto& sink : sinks) { |
| 213 sinks_with_cast_modes.push_back(MediaSinkWithCastModes(sink)); |
| 214 sinks_with_cast_modes.back().cast_modes.insert(TAB_MIRROR); |
| 215 sinks_with_cast_modes.back().cast_modes.insert(DESKTOP_MIRROR); |
| 216 } |
| 217 FOR_EACH_OBSERVER(QueryResultManager::Observer, observers_, |
| 218 OnSearchResultsReceived(sink_id, sinks_with_cast_modes)); |
| 219 } |
| 220 |
| 177 } // namespace media_router | 221 } // namespace media_router |
| OLD | NEW |