| Index: chrome/browser/media/router/media_router_mojo_impl.cc
|
| diff --git a/chrome/browser/media/router/media_router_mojo_impl.cc b/chrome/browser/media/router/media_router_mojo_impl.cc
|
| index 787dbdb50c214333bb4730b1eea55f83b2c4d415..2a0e28cb8e05378bdd1c9e1db8bc0717ff064fc7 100644
|
| --- a/chrome/browser/media/router/media_router_mojo_impl.cc
|
| +++ b/chrome/browser/media/router/media_router_mojo_impl.cc
|
| @@ -20,6 +20,7 @@
|
| #include "chrome/browser/media/router/media_router_type_converters.h"
|
| #include "chrome/browser/media/router/media_routes_observer.h"
|
| #include "chrome/browser/media/router/media_sinks_observer.h"
|
| +#include "chrome/browser/media/router/media_sinks_search_request.h"
|
| #include "chrome/browser/media/router/presentation_session_messages_observer.h"
|
| #include "chrome/browser/sessions/session_tab_helper.h"
|
| #include "extensions/browser/process_manager.h"
|
| @@ -73,6 +74,10 @@ MediaRouterMojoImpl::MediaSinksQuery::MediaSinksQuery() = default;
|
|
|
| MediaRouterMojoImpl::MediaSinksQuery::~MediaSinksQuery() = default;
|
|
|
| +MediaRouterMojoImpl::MediaSinksSearchQuery::MediaSinksSearchQuery() = default;
|
| +
|
| +MediaRouterMojoImpl::MediaSinksSearchQuery::~MediaSinksSearchQuery() = default;
|
| +
|
| MediaRouterMojoImpl::MediaRouterMojoImpl(
|
| extensions::EventPageTracker* event_page_tracker)
|
| : event_page_tracker_(event_page_tracker),
|
| @@ -191,6 +196,27 @@ void MediaRouterMojoImpl::OnSinksReceived(
|
| }
|
| }
|
|
|
| +void MediaRouterMojoImpl::OnSearchSinksReceived(
|
| + const mojo::String& sink_id,
|
| + mojo::Array<interfaces::MediaSinkPtr> sinks) {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + auto it = search_queries_.find(sink_id);
|
| + if (it == search_queries_.end()) {
|
| + return;
|
| + }
|
| +
|
| + auto& search_query = it->second;
|
| + std::vector<MediaSink> sink_list;
|
| + sink_list.reserve(sinks.size());
|
| + for (size_t i = 0; i < sinks.size(); ++i)
|
| + sink_list.push_back(sinks[i].To<MediaSink>());
|
| +
|
| + for (auto& observer : search_query->observers) {
|
| + observer->OnResultsReceived(sink_list);
|
| + }
|
| + search_queries_.erase(it);
|
| +}
|
| +
|
| void MediaRouterMojoImpl::OnRoutesUpdated(
|
| mojo::Array<interfaces::MediaRoutePtr> routes,
|
| const mojo::String& media_source,
|
| @@ -441,6 +467,35 @@ void MediaRouterMojoImpl::UnregisterMediaSinksObserver(
|
| }
|
| }
|
|
|
| +bool MediaRouterMojoImpl::RegisterMediaSinksSearchRequest(
|
| + scoped_ptr<MediaSinksSearchRequest> request) {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| +
|
| + auto& sink_id = request->sink_id();
|
| + auto source = request->source().id();
|
| + auto it = search_queries_.find(sink_id);
|
| + bool new_query = false;
|
| + if (it == search_queries_.end()) {
|
| + new_query = true;
|
| + bool is_true;
|
| + auto query = make_scoped_ptr(new MediaSinksSearchQuery);
|
| + std::tie(it, is_true) =
|
| + search_queries_.insert(std::make_pair(sink_id, std::move(query)));
|
| + } else {
|
| + DCHECK(std::find(it->second->observers.begin(), it->second->observers.end(),
|
| + request) == it->second->observers.end());
|
| + }
|
| +
|
| + auto& search_query = it->second;
|
| + search_query->observers.push_back(std::move(request));
|
| + if (new_query) {
|
| + SetWakeReason(MediaRouteProviderWakeReason::SEARCH_SINKS);
|
| + RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoSearchProviders,
|
| + base::Unretained(this), source, sink_id));
|
| + }
|
| + return true;
|
| +}
|
| +
|
| void MediaRouterMojoImpl::RegisterMediaRoutesObserver(
|
| MediaRoutesObserver* observer) {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| @@ -640,6 +695,12 @@ void MediaRouterMojoImpl::DoStopListeningForRouteMessages(
|
| media_route_provider_->StopListeningForRouteMessages(route_id);
|
| }
|
|
|
| +void MediaRouterMojoImpl::DoSearchProviders(const MediaSource::Id& source_id,
|
| + const MediaSink::Id& sink_id) {
|
| + DVLOG_WITH_INSTANCE(1) << "SearchProviders";
|
| + media_route_provider_->SearchProviders(source_id, sink_id);
|
| +}
|
| +
|
| void MediaRouterMojoImpl::OnRouteMessagesReceived(
|
| const MediaRoute::Id& route_id,
|
| mojo::Array<interfaces::RouteMessagePtr> messages,
|
|
|