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 82bf5d61afcd190d2b1eff7d8f50206112bf1dd8..669e9c29f99b059d4552bec2c6943c2516dcb237 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" |
@@ -217,6 +218,8 @@ void MediaRouterMojoImpl::OnRoutesUpdated( |
for (auto& observer : it->second->observers) |
observer.OnRoutesUpdated(routes, joinable_route_ids); |
+ |
+ RemoveInvalidMediaRouteControllers(routes); |
} |
void MediaRouterMojoImpl::RouteResponseReceived( |
@@ -385,6 +388,23 @@ void MediaRouterMojoImpl::SearchSinks( |
search_input, domain, sink_callback)); |
} |
+MediaRouteController* MediaRouterMojoImpl::GetControllerForRoute( |
+ const MediaRoute::Id& route_id) { |
+ auto it = route_controllers_.find(route_id); |
+ if (it != route_controllers_.end()) |
+ return it->second.get(); |
+ route_controllers_[route_id] = base::MakeUnique<MediaRouteController>( |
+ route_id, media_route_provider_.get(), |
+ base::Bind(&MediaRouterMojoImpl::DestroyMediaRouteController, |
+ base::Unretained(this), route_id)); |
+ return route_controllers_[route_id].get(); |
+} |
+ |
+void MediaRouterMojoImpl::DestroyMediaRouteController( |
+ const MediaRoute::Id& route_id) { |
+ route_controllers_.erase(route_id); |
+} |
+ |
bool MediaRouterMojoImpl::RegisterMediaSinksObserver( |
MediaSinksObserver* observer) { |
DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
@@ -935,4 +955,20 @@ void MediaRouterMojoImpl::DoUpdateMediaSinks( |
media_route_provider_->UpdateMediaSinks(source_id); |
} |
+void MediaRouterMojoImpl::RemoveInvalidMediaRouteControllers( |
+ 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()) { |
+ it = route_controllers_.erase(it); |
+ } else { |
+ ++it; |
+ } |
+ } |
+} |
+ |
} // namespace media_router |