| 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/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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |