• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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