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 ae0ce93801a7f0296b1c1e681699ed6d8169747f..ea2589accf295145a7885fd93b7a2a77c16edf7c 100644 |
| --- a/chrome/browser/media/router/mojo/media_router_mojo_impl.cc |
| +++ b/chrome/browser/media/router/mojo/media_router_mojo_impl.cc |
| @@ -21,6 +21,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" |
| @@ -231,6 +232,7 @@ void MediaRouterMojoImpl::OnRoutesUpdated( |
| << "Received routes update without any active observers: " |
| << media_source; |
| } |
| + RemoveInvalidRouteControllers(routes); |
| } |
| void MediaRouterMojoImpl::RouteResponseReceived( |
| @@ -399,6 +401,28 @@ void MediaRouterMojoImpl::SearchSinks( |
| search_input, domain, sink_callback)); |
| } |
| +scoped_refptr<MediaRouteController> MediaRouterMojoImpl::GetRouteController( |
| + const MediaRoute::Id& route_id) { |
| + auto it = route_controllers_.find(route_id); |
| + if (it != route_controllers_.end()) |
| + return scoped_refptr<MediaRouteController>(it->second); |
| + |
| + mojom::MediaControllerPtr media_controller; |
|
mark a. foltz
2017/03/30 23:03:28
Can you prefix Mojo variables with mojo_ for reada
takumif
2017/04/04 03:19:50
Done.
|
| + mojom::MediaControllerRequest media_controller_request = |
| + mojo::MakeRequest(&media_controller); |
| + scoped_refptr<MediaRouteController> route_controller = |
| + new MediaRouteController(route_id, std::move(media_controller), this); |
| + |
| + media_route_provider_->CreateMediaRouteController( |
|
mark a. foltz
2017/03/30 23:03:28
What guarantees that the event page is alive? Mos
takumif
2017/04/04 03:19:51
These requests should be queued as well. I can't s
|
| + route_id, std::move(media_controller_request), |
| + base::Bind(&MediaRouterMojoImpl::OnMediaControllerCreated, |
| + base::Unretained(this), route_id)); |
| + media_route_provider_->SetMediaRouteStatusObserver( |
| + route_id, route_controller->BindObserverPtr()); |
| + route_controllers_.insert({route_id, route_controller.get()}); |
| + return route_controller; |
|
mark a. foltz
2017/03/30 23:03:28
What state is this in before OnMediaControllerCrea
takumif
2017/04/04 03:19:50
Before DoCreateMediaRouteController() is called, r
|
| +} |
| + |
| bool MediaRouterMojoImpl::RegisterMediaSinksObserver( |
| MediaSinksObserver* observer) { |
| DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| @@ -592,6 +616,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, |
| @@ -980,4 +1012,34 @@ 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()) { |
| + const MediaRoute::Id& route_id = it->first; |
| + if (std::find_if(routes.begin(), routes.end(), |
| + [&route_id](const MediaRoute& route) { |
| + return route.media_route_id() == route_id; |
| + }) == routes.end()) { |
| + MediaRouteController* controller = it->second; |
| + it = route_controllers_.erase(it); |
| + // Invalidate() will result in another erase() call, which will be no-op. |
| + controller->Invalidate(); |
|
mark a. foltz
2017/03/30 23:03:28
Doesn't this call back into DetachRouteController(
takumif
2017/04/04 03:19:50
Yes. Added OnRouteInvalid().
|
| + } else { |
| + ++it; |
| + } |
| + } |
| +} |
| + |
| +void MediaRouterMojoImpl::OnMediaControllerCreated( |
|
mark a. foltz
2017/03/30 23:03:28
Shouldn't this return a boolean per the mojom?
takumif
2017/04/04 03:19:51
No, this is the callback that gets called, so it d
|
| + 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(); |
| +} |
| + |
| } // namespace media_router |