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

Side by Side Diff: chrome/browser/media/router/media_router_mojo_impl.cc

Issue 1805813002: [Media Router] Wiring for searching route providers for new sinks. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 9 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 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/media/router/media_router_mojo_impl.h" 5 #include "chrome/browser/media/router/media_router_mojo_impl.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/guid.h" 11 #include "base/guid.h"
12 #include "base/logging.h" 12 #include "base/logging.h"
13 #include "base/memory/scoped_vector.h" 13 #include "base/memory/scoped_vector.h"
14 #include "base/observer_list.h" 14 #include "base/observer_list.h"
15 #include "base/stl_util.h" 15 #include "base/stl_util.h"
16 #include "base/strings/stringprintf.h" 16 #include "base/strings/stringprintf.h"
17 #include "chrome/browser/media/router/issues_observer.h" 17 #include "chrome/browser/media/router/issues_observer.h"
18 #include "chrome/browser/media/router/media_router_factory.h" 18 #include "chrome/browser/media/router/media_router_factory.h"
19 #include "chrome/browser/media/router/media_router_metrics.h" 19 #include "chrome/browser/media/router/media_router_metrics.h"
20 #include "chrome/browser/media/router/media_router_type_converters.h" 20 #include "chrome/browser/media/router/media_router_type_converters.h"
21 #include "chrome/browser/media/router/media_routes_observer.h" 21 #include "chrome/browser/media/router/media_routes_observer.h"
22 #include "chrome/browser/media/router/media_sinks_observer.h" 22 #include "chrome/browser/media/router/media_sinks_observer.h"
23 #include "chrome/browser/media/router/media_sinks_search_request.h"
23 #include "chrome/browser/media/router/presentation_session_messages_observer.h" 24 #include "chrome/browser/media/router/presentation_session_messages_observer.h"
24 #include "chrome/browser/sessions/session_tab_helper.h" 25 #include "chrome/browser/sessions/session_tab_helper.h"
25 #include "extensions/browser/process_manager.h" 26 #include "extensions/browser/process_manager.h"
26 27
27 #define DVLOG_WITH_INSTANCE(level) \ 28 #define DVLOG_WITH_INSTANCE(level) \
28 DVLOG(level) << "MR #" << instance_id_ << ": " 29 DVLOG(level) << "MR #" << instance_id_ << ": "
29 30
30 #define DLOG_WITH_INSTANCE(level) DLOG(level) << "MR #" << instance_id_ << ": " 31 #define DLOG_WITH_INSTANCE(level) DLOG(level) << "MR #" << instance_id_ << ": "
31 32
32 namespace media_router { 33 namespace media_router {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 } // namespace 67 } // namespace
67 68
68 MediaRouterMojoImpl::MediaRoutesQuery::MediaRoutesQuery() = default; 69 MediaRouterMojoImpl::MediaRoutesQuery::MediaRoutesQuery() = default;
69 70
70 MediaRouterMojoImpl::MediaRoutesQuery::~MediaRoutesQuery() = default; 71 MediaRouterMojoImpl::MediaRoutesQuery::~MediaRoutesQuery() = default;
71 72
72 MediaRouterMojoImpl::MediaSinksQuery::MediaSinksQuery() = default; 73 MediaRouterMojoImpl::MediaSinksQuery::MediaSinksQuery() = default;
73 74
74 MediaRouterMojoImpl::MediaSinksQuery::~MediaSinksQuery() = default; 75 MediaRouterMojoImpl::MediaSinksQuery::~MediaSinksQuery() = default;
75 76
77 MediaRouterMojoImpl::MediaSinksSearchQuery::MediaSinksSearchQuery() = default;
78
79 MediaRouterMojoImpl::MediaSinksSearchQuery::~MediaSinksSearchQuery() = default;
80
76 MediaRouterMojoImpl::MediaRouterMojoImpl( 81 MediaRouterMojoImpl::MediaRouterMojoImpl(
77 extensions::EventPageTracker* event_page_tracker) 82 extensions::EventPageTracker* event_page_tracker)
78 : event_page_tracker_(event_page_tracker), 83 : event_page_tracker_(event_page_tracker),
79 instance_id_(base::GenerateGUID()), 84 instance_id_(base::GenerateGUID()),
80 availability_(interfaces::MediaRouter::SinkAvailability::UNAVAILABLE), 85 availability_(interfaces::MediaRouter::SinkAvailability::UNAVAILABLE),
81 wakeup_attempt_count_(0), 86 wakeup_attempt_count_(0),
82 current_wake_reason_(MediaRouteProviderWakeReason::TOTAL_COUNT), 87 current_wake_reason_(MediaRouteProviderWakeReason::TOTAL_COUNT),
83 weak_factory_(this) { 88 weak_factory_(this) {
84 DCHECK(event_page_tracker_); 89 DCHECK(event_page_tracker_);
85 } 90 }
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
184 189
185 if (!sinks_query->observers.might_have_observers()) { 190 if (!sinks_query->observers.might_have_observers()) {
186 DVLOG_WITH_INSTANCE(1) 191 DVLOG_WITH_INSTANCE(1)
187 << "Received sink list without any active observers: " << media_source; 192 << "Received sink list without any active observers: " << media_source;
188 } else { 193 } else {
189 FOR_EACH_OBSERVER(MediaSinksObserver, sinks_query->observers, 194 FOR_EACH_OBSERVER(MediaSinksObserver, sinks_query->observers,
190 OnSinksReceived(cached_sink_list)); 195 OnSinksReceived(cached_sink_list));
191 } 196 }
192 } 197 }
193 198
199 void MediaRouterMojoImpl::OnSearchSinksReceived(
200 const mojo::String& sink_id,
201 mojo::Array<interfaces::MediaSinkPtr> sinks) {
202 DCHECK(thread_checker_.CalledOnValidThread());
203 auto it = search_queries_.find(sink_id);
204 if (it == search_queries_.end()) {
205 return;
206 }
207
208 auto& search_query = it->second;
209 std::vector<MediaSink> sink_list;
210 sink_list.reserve(sinks.size());
211 for (size_t i = 0; i < sinks.size(); ++i)
212 sink_list.push_back(sinks[i].To<MediaSink>());
213
214 for (auto& observer : search_query->observers) {
215 observer->OnResultsReceived(sink_list);
216 }
217 search_queries_.erase(it);
218 }
219
194 void MediaRouterMojoImpl::OnRoutesUpdated( 220 void MediaRouterMojoImpl::OnRoutesUpdated(
195 mojo::Array<interfaces::MediaRoutePtr> routes, 221 mojo::Array<interfaces::MediaRoutePtr> routes,
196 const mojo::String& media_source, 222 const mojo::String& media_source,
197 mojo::Array<mojo::String> joinable_route_ids) { 223 mojo::Array<mojo::String> joinable_route_ids) {
198 DCHECK(thread_checker_.CalledOnValidThread()); 224 DCHECK(thread_checker_.CalledOnValidThread());
199 225
200 DVLOG_WITH_INSTANCE(1) << "OnRoutesUpdated"; 226 DVLOG_WITH_INSTANCE(1) << "OnRoutesUpdated";
201 auto it = routes_queries_.find(media_source); 227 auto it = routes_queries_.find(media_source);
202 if (it == routes_queries_.end() || 228 if (it == routes_queries_.end() ||
203 !(it->second->observers.might_have_observers())) { 229 !(it->second->observers.might_have_observers())) {
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after
434 // The |sinks_queries_| entry will be removed in the immediate or deferred 460 // The |sinks_queries_| entry will be removed in the immediate or deferred
435 // |DoStopObservingMediaSinks| call. 461 // |DoStopObservingMediaSinks| call.
436 RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoStopObservingMediaSinks, 462 RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoStopObservingMediaSinks,
437 base::Unretained(this), source_id)); 463 base::Unretained(this), source_id));
438 } else { 464 } else {
439 sinks_queries_.erase(source_id); 465 sinks_queries_.erase(source_id);
440 } 466 }
441 } 467 }
442 } 468 }
443 469
470 bool MediaRouterMojoImpl::RegisterMediaSinksSearchRequest(
471 scoped_ptr<MediaSinksSearchRequest> request) {
472 DCHECK(thread_checker_.CalledOnValidThread());
473
474 auto& sink_id = request->sink_id();
475 auto source = request->source().id();
476 auto it = search_queries_.find(sink_id);
477 bool new_query = false;
478 if (it == search_queries_.end()) {
479 new_query = true;
480 bool is_true;
481 auto query = make_scoped_ptr(new MediaSinksSearchQuery);
482 std::tie(it, is_true) =
483 search_queries_.insert(std::make_pair(sink_id, std::move(query)));
484 } else {
485 DCHECK(std::find(it->second->observers.begin(), it->second->observers.end(),
486 request) == it->second->observers.end());
487 }
488
489 auto& search_query = it->second;
490 search_query->observers.push_back(std::move(request));
491 if (new_query) {
492 SetWakeReason(MediaRouteProviderWakeReason::SEARCH_SINKS);
493 RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoSearchProviders,
494 base::Unretained(this), source, sink_id));
495 }
496 return true;
497 }
498
444 void MediaRouterMojoImpl::RegisterMediaRoutesObserver( 499 void MediaRouterMojoImpl::RegisterMediaRoutesObserver(
445 MediaRoutesObserver* observer) { 500 MediaRoutesObserver* observer) {
446 DCHECK(thread_checker_.CalledOnValidThread()); 501 DCHECK(thread_checker_.CalledOnValidThread());
447 const MediaSource::Id source_id = observer->source_id(); 502 const MediaSource::Id source_id = observer->source_id();
448 auto* routes_query = routes_queries_.get(source_id); 503 auto* routes_query = routes_queries_.get(source_id);
449 if (!routes_query) { 504 if (!routes_query) {
450 routes_query = new MediaRoutesQuery; 505 routes_query = new MediaRoutesQuery;
451 routes_queries_.add(source_id, make_scoped_ptr(routes_query)); 506 routes_queries_.add(source_id, make_scoped_ptr(routes_query));
452 } else { 507 } else {
453 DCHECK(!routes_query->observers.HasObserver(observer)); 508 DCHECK(!routes_query->observers.HasObserver(observer));
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
633 void MediaRouterMojoImpl::DoStopListeningForRouteMessages( 688 void MediaRouterMojoImpl::DoStopListeningForRouteMessages(
634 const MediaRoute::Id& route_id) { 689 const MediaRoute::Id& route_id) {
635 DVLOG_WITH_INSTANCE(1) << "StopListeningForRouteMessages"; 690 DVLOG_WITH_INSTANCE(1) << "StopListeningForRouteMessages";
636 691
637 // No need to erase |route_ids_listening_for_messages_| entry here. 692 // No need to erase |route_ids_listening_for_messages_| entry here.
638 // It will be removed when there are no more observers by the time 693 // It will be removed when there are no more observers by the time
639 // |OnRouteMessagesReceived| is invoked. 694 // |OnRouteMessagesReceived| is invoked.
640 media_route_provider_->StopListeningForRouteMessages(route_id); 695 media_route_provider_->StopListeningForRouteMessages(route_id);
641 } 696 }
642 697
698 void MediaRouterMojoImpl::DoSearchProviders(const MediaSource::Id& source_id,
699 const MediaSink::Id& sink_id) {
700 DVLOG_WITH_INSTANCE(1) << "SearchProviders";
701 media_route_provider_->SearchProviders(source_id, sink_id);
702 }
703
643 void MediaRouterMojoImpl::OnRouteMessagesReceived( 704 void MediaRouterMojoImpl::OnRouteMessagesReceived(
644 const MediaRoute::Id& route_id, 705 const MediaRoute::Id& route_id,
645 mojo::Array<interfaces::RouteMessagePtr> messages, 706 mojo::Array<interfaces::RouteMessagePtr> messages,
646 bool error) { 707 bool error) {
647 DVLOG(1) << "OnRouteMessagesReceived"; 708 DVLOG(1) << "OnRouteMessagesReceived";
648 709
649 // If |messages| is null, then no more messages will come from this route. 710 // If |messages| is null, then no more messages will come from this route.
650 // We can stop listening. 711 // We can stop listening.
651 if (error) { 712 if (error) {
652 DVLOG(2) << "Encountered error in OnRouteMessagesReceived for " << route_id; 713 DVLOG(2) << "Encountered error in OnRouteMessagesReceived for " << route_id;
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
885 if (current_wake_reason_ == MediaRouteProviderWakeReason::TOTAL_COUNT) 946 if (current_wake_reason_ == MediaRouteProviderWakeReason::TOTAL_COUNT)
886 current_wake_reason_ = reason; 947 current_wake_reason_ = reason;
887 } 948 }
888 949
889 void MediaRouterMojoImpl::ClearWakeReason() { 950 void MediaRouterMojoImpl::ClearWakeReason() {
890 DCHECK(current_wake_reason_ != MediaRouteProviderWakeReason::TOTAL_COUNT); 951 DCHECK(current_wake_reason_ != MediaRouteProviderWakeReason::TOTAL_COUNT);
891 current_wake_reason_ = MediaRouteProviderWakeReason::TOTAL_COUNT; 952 current_wake_reason_ = MediaRouteProviderWakeReason::TOTAL_COUNT;
892 } 953 }
893 954
894 } // namespace media_router 955 } // namespace media_router
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698