1 // Copyright (c) 2020 The Chromium Embedded Framework Authors. All rights 2 // reserved. Use of this source code is governed by a BSD-style license that 3 // can be found in the LICENSE file. 4 5 #ifndef CEF_LIBCEF_BROWSER_MEDIA_ROUTER_MEDIA_ROUTER_MANAGER_H_ 6 #define CEF_LIBCEF_BROWSER_MEDIA_ROUTER_MEDIA_ROUTER_MANAGER_H_ 7 #pragma once 8 9 #include "include/cef_media_router.h" 10 11 #include "base/memory/weak_ptr.h" 12 #include "base/observer_list.h" 13 #include "chrome/browser/ui/media_router/query_result_manager.h" 14 #include "components/media_router/browser/media_router.h" 15 #include "components/media_router/common/mojom/media_router.mojom.h" 16 17 namespace content { 18 class BrowserContext; 19 } 20 21 class CefMediaRoutesObserver; 22 class CefPresentationConnection; 23 class CefRouteMessageObserver; 24 25 // Manages CEF usage of MediaRouter. Owned by CefBrowserContext and only 26 // accessed on the UI thread. 27 class CefMediaRouterManager 28 : public media_router::QueryResultManager::Observer { 29 public: 30 using MediaRouteVector = std::vector<media_router::MediaRoute>; 31 using MediaSinkVector = std::vector<media_router::MediaSinkWithCastModes>; 32 using MediaMessageVector = std::vector<media_router::mojom::RouteMessagePtr>; 33 34 class Observer : public base::CheckedObserver { 35 public: 36 virtual void OnMediaRouterDestroyed() = 0; 37 38 virtual void OnMediaSinks(const MediaSinkVector& sinks) = 0; 39 virtual void OnMediaRoutes(const MediaRouteVector& routes) = 0; 40 41 virtual void OnMediaRouteMessages(const media_router::MediaRoute& route, 42 const MediaMessageVector& messages) = 0; 43 virtual void OnMediaRouteStateChange( 44 const media_router::MediaRoute& route, 45 const content::PresentationConnectionStateChangeInfo& info) = 0; 46 47 protected: ~Observer()48 ~Observer() override {} 49 }; 50 51 explicit CefMediaRouterManager(content::BrowserContext* browser_context); 52 53 CefMediaRouterManager(const CefMediaRouterManager&) = delete; 54 CefMediaRouterManager& operator=(const CefMediaRouterManager&) = delete; 55 56 ~CefMediaRouterManager() override; 57 58 // |observer| must outlive this object or be removed. 59 void AddObserver(Observer* observer); 60 void RemoveObserver(Observer* observer); 61 62 void NotifyCurrentSinks(); 63 void NotifyCurrentRoutes(); 64 65 using CreateRouteResultCallback = 66 base::OnceCallback<void(const media_router::RouteRequestResult& result)>; 67 68 void CreateRoute(const media_router::MediaSource::Id& source_id, 69 const media_router::MediaSink::Id& sink_id, 70 const url::Origin& origin, 71 CreateRouteResultCallback callback); 72 73 void SendRouteMessage(const media_router::MediaRoute::Id& route_id, 74 const std::string& message); 75 void TerminateRoute(const media_router::MediaRoute::Id& route_id); 76 77 // QueryResultManager::Observer methods. 78 void OnResultsUpdated(const MediaSinkVector& sinks) override; 79 80 private: 81 friend class CefMediaRoutesObserver; 82 friend class CefPresentationConnection; 83 friend class CefRouteMessageObserver; 84 85 // Do not keep a reference to the object returned by this method. 86 media_router::MediaRouter* GetMediaRouter() const; 87 88 void OnCreateRoute( 89 CreateRouteResultCallback callback, 90 media_router::mojom::RoutePresentationConnectionPtr connection, 91 const media_router::RouteRequestResult& result); 92 void OnRouteStateChange( 93 const media_router::MediaRoute& route, 94 const content::PresentationConnectionStateChangeInfo& info); 95 void OnMessagesReceived(const media_router::MediaRoute& route, 96 const MediaMessageVector& messages); 97 98 struct RouteState { 99 std::unique_ptr<CefPresentationConnection> presentation_connection_; 100 101 // Used if there is no RoutePresentationConnectionPtr. 102 std::unique_ptr<CefRouteMessageObserver> message_observer_; 103 base::CallbackListSubscription state_subscription_; 104 }; 105 void CreateRouteState( 106 const media_router::MediaRoute& route, 107 media_router::mojom::RoutePresentationConnectionPtr connection); 108 RouteState* GetRouteState(const media_router::MediaRoute::Id& route_id); 109 void RemoveRouteState(const media_router::MediaRoute::Id& route_id); 110 111 content::BrowserContext* const browser_context_; 112 113 base::ObserverList<Observer> observers_; 114 115 media_router::QueryResultManager query_result_manager_; 116 std::unique_ptr<CefMediaRoutesObserver> routes_observer_; 117 118 MediaRouteVector routes_; 119 MediaSinkVector sinks_; 120 121 using RouteStateMap = 122 std::map<media_router::MediaRoute::Id, std::unique_ptr<RouteState>>; 123 RouteStateMap route_state_map_; 124 125 base::WeakPtrFactory<CefMediaRouterManager> weak_ptr_factory_; 126 }; 127 128 #endif // CEF_LIBCEF_BROWSER_MEDIA_ROUTER_MEDIA_ROUTER_MANAGER_H_ 129