Chromium Code Reviews| Index: chrome/browser/media/router/mojo/media_router_mojo_impl.cc |
| diff --git a/chrome/browser/media/router/mojo/media_router_mojo_impl.cc b/chrome/browser/media/router/mojo/media_router_mojo_impl.cc |
| index fa14895861f721762f1fcdfc6c2283e0294c037b..826b7273498b3d6df591b8cb1ff59359295a0074 100644 |
| --- a/chrome/browser/media/router/mojo/media_router_mojo_impl.cc |
| +++ b/chrome/browser/media/router/mojo/media_router_mojo_impl.cc |
| @@ -20,6 +20,7 @@ |
| #include "chrome/browser/media/router/media_routes_observer.h" |
| #include "chrome/browser/media/router/media_sinks_observer.h" |
| #include "chrome/browser/media/router/media_source_helper.h" |
| +#include "chrome/browser/media/router/mojo/media_route_controller.h" |
| #include "chrome/browser/media/router/mojo/media_route_provider_util_win.h" |
| #include "chrome/browser/media/router/mojo/media_router_mojo_metrics.h" |
| #include "chrome/browser/media/router/route_message.h" |
| @@ -230,6 +231,7 @@ void MediaRouterMojoImpl::OnRoutesUpdated( |
| << "Received routes update without any active observers: " |
| << media_source; |
| } |
| + RemoveInvalidRouteControllers(routes); |
| } |
| void MediaRouterMojoImpl::RouteResponseReceived( |
| @@ -398,6 +400,30 @@ void MediaRouterMojoImpl::SearchSinks( |
| search_input, domain, sink_callback)); |
| } |
| +scoped_refptr<MediaRouteController> MediaRouterMojoImpl::GetRouteController( |
| + const MediaRoute::Id& route_id) { |
| + if (!IsRouteValid(route_id)) |
| + return nullptr; |
| + |
| + auto it = route_controllers_.find(route_id); |
| + if (it != route_controllers_.end()) |
| + return scoped_refptr<MediaRouteController>(it->second); |
| + |
| + scoped_refptr<MediaRouteController> route_controller = |
| + new MediaRouteController(route_id, this); |
| + route_controllers_.insert({route_id, route_controller.get()}); |
| + |
| + RunOrDefer( |
| + base::Bind(&MediaRouterMojoImpl::DoCreateMediaRouteController, |
|
imcheng
2017/04/05 07:18:02
As discussed, a flaw of doing this is that the Moj
takumif
2017/04/06 19:38:32
I tried using OnceClosures again and somehow got i
|
| + base::Unretained(this), route_id, |
| + base::Bind(&MediaRouterMojoImpl::OnMediaControllerCreated, |
| + base::Unretained(this), route_id))); |
| + RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoSetMediaRouteStatusObserver, |
| + base::Unretained(this), route_id)); |
| + |
| + return route_controller; |
| +} |
| + |
| bool MediaRouterMojoImpl::RegisterMediaSinksObserver( |
| MediaSinksObserver* observer) { |
| DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| @@ -591,6 +617,14 @@ void MediaRouterMojoImpl::UnregisterRouteMessageObserver( |
| } |
| } |
| +void MediaRouterMojoImpl::DetachRouteController( |
| + const MediaRoute::Id& route_id, |
| + MediaRouteController* controller) { |
| + auto it = route_controllers_.find(route_id); |
| + if (it != route_controllers_.end() && it->second == controller) |
| + route_controllers_.erase(it); |
| +} |
| + |
| void MediaRouterMojoImpl::DoCreateRoute( |
| const MediaSource::Id& source_id, |
| const MediaSink::Id& sink_id, |
| @@ -702,6 +736,29 @@ void MediaRouterMojoImpl::DoSearchSinks( |
| sink_id, source_id, std::move(sink_search_criteria), sink_callback); |
| } |
| +void MediaRouterMojoImpl::DoCreateMediaRouteController( |
| + const MediaRoute::Id& route_id, |
| + base::Callback<void(bool)> callback) { |
| + DVLOG_WITH_INSTANCE(1) << "DoCreateMediaRouteController"; |
| + auto it = route_controllers_.find(route_id); |
| + if (it == route_controllers_.end()) |
| + return; |
| + |
| + media_route_provider_->CreateMediaRouteController( |
| + route_id, it->second->GetMediaControllerRequest(), callback); |
| +} |
| + |
| +void MediaRouterMojoImpl::DoSetMediaRouteStatusObserver( |
| + const MediaRoute::Id& route_id) { |
| + DVLOG_WITH_INSTANCE(1) << "DoSetMediaRouteStatusObserver"; |
| + auto it = route_controllers_.find(route_id); |
| + if (it == route_controllers_.end()) |
| + return; |
| + |
| + media_route_provider_->SetMediaRouteStatusObserver( |
| + route_id, it->second->BindObserverPtr()); |
| +} |
| + |
| void MediaRouterMojoImpl::OnRouteMessagesReceived( |
| const std::string& route_id, |
| const std::vector<RouteMessage>& messages) { |
| @@ -979,4 +1036,28 @@ void MediaRouterMojoImpl::DoUpdateMediaSinks( |
| media_route_provider_->UpdateMediaSinks(source_id); |
| } |
| +void MediaRouterMojoImpl::RemoveInvalidRouteControllers( |
| + const std::vector<MediaRoute>& routes) { |
| + auto it = route_controllers_.begin(); |
| + while (it != route_controllers_.end()) { |
| + if (IsRouteValid(it->first)) { |
| + ++it; |
| + } else { |
| + it->second->OnRouteInvalid(); |
| + it = route_controllers_.erase(it); |
| + } |
| + } |
| +} |
| + |
| +void MediaRouterMojoImpl::OnMediaControllerCreated( |
| + const MediaRoute::Id& route_id, |
| + bool success) { |
| + if (success) |
| + return; |
| + |
| + auto it = route_controllers_.find(route_id); |
| + if (it != route_controllers_.end()) |
| + it->second->Invalidate(); |
|
imcheng
2017/04/05 07:18:02
Erase the controller from the mapping here; this c
takumif
2017/04/06 19:38:32
Done.
|
| +} |
| + |
| } // namespace media_router |