Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(128)

Unified Diff: chrome/browser/media/router/mojo/media_router_mojo_impl.cc

Issue 2728543009: [Media Router] Custom Controls 2 - add MediaRouter::GetRouteController() (Closed)
Patch Set: Address Mark's comments Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698