| // Copyright 2019 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CHROME_BROWSER_MEDIA_ROUTER_PROVIDERS_CAST_CAST_SESSION_CLIENT_H_ |
| #define CHROME_BROWSER_MEDIA_ROUTER_PROVIDERS_CAST_CAST_SESSION_CLIENT_H_ |
| |
| #include <memory> |
| #include <string> |
| |
| #include "base/memory/weak_ptr.h" |
| #include "base/values.h" |
| #include "chrome/browser/media/router/providers/cast/cast_internal_message_util.h" |
| #include "components/media_router/common/mojom/media_router.mojom.h" |
| #include "mojo/public/cpp/bindings/receiver.h" |
| #include "mojo/public/cpp/bindings/remote.h" |
| #include "third_party/abseil-cpp/absl/types/optional.h" |
| #include "third_party/blink/public/mojom/presentation/presentation.mojom.h" |
| |
| namespace media_router { |
| |
| // Represents a Cast SDK client connection to a Cast session. This class |
| // contains PresentationConnection Mojo pipes to send and receive messages |
| // from/to the corresponding SDK client hosted in a presentation controlling |
| // frame in Blink. |
| class CastSessionClient { |
| public: |
| CastSessionClient(const std::string& client_id, |
| const url::Origin& origin, |
| int frame_tree_node_id); |
| CastSessionClient(const CastSessionClient&) = delete; |
| CastSessionClient& operator=(const CastSessionClient&) = delete; |
| virtual ~CastSessionClient(); |
| |
| const std::string& client_id() const { return client_id_; } |
| const absl::optional<std::string>& session_id() const { return session_id_; } |
| const url::Origin& origin() const { return origin_; } |
| int frame_tree_node_id() const { return frame_tree_node_id_; } |
| |
| // Initializes the PresentationConnection Mojo message pipes and returns the |
| // handles of the two pipes to be held by Blink. Also transitions the |
| // connection state to CONNECTED. This method can only be called once, and |
| // must be called before |SendMessageToClient()|. |
| virtual mojom::RoutePresentationConnectionPtr Init() = 0; |
| |
| // Sends |message| to the Cast SDK client in Blink. |
| virtual void SendMessageToClient( |
| blink::mojom::PresentationConnectionMessagePtr message) = 0; |
| |
| // Sends a media status message to the client. If |request_id| is given, it |
| // is used to look up the sequence number of a previous request, which is |
| // included in the outgoing message. |
| virtual void SendMediaStatusToClient(const base::Value& media_status, |
| absl::optional<int> request_id) = 0; |
| |
| // Changes the PresentationConnection state to CLOSED/TERMINATED and resets |
| // PresentationConnection message pipes. |
| virtual void CloseConnection( |
| blink::mojom::PresentationConnectionCloseReason close_reason) = 0; |
| virtual void TerminateConnection() = 0; |
| |
| // Tests whether the specified origin and FrameTreeNode ID match this |
| // session's origin and FrameTreeNode ID to the extent required by this |
| // sesssion's auto-join policy. Depending on the value of |auto_join_policy_|, |
| // |origin|, |frame_tree_node_id_|, or both may be ignored. |
| // |
| // TODO(crbug.com/1291742): It appears the purpose of this method is to detect |
| // whether this session was created by an auto-join request. It might make |
| // more sense to record at session creation time whether a particular session |
| // was created by an auto-join request, in which case this method would no |
| // longer be needed. |
| virtual bool MatchesAutoJoinPolicy(url::Origin origin, |
| int frame_tree_node_id) const = 0; |
| |
| virtual void SendErrorCodeToClient( |
| int sequence_number, |
| CastInternalMessage::ErrorCode error_code, |
| absl::optional<std::string> description) = 0; |
| |
| // NOTE: This is current only called from SendErrorCodeToClient, but based on |
| // the old code this method based on, it seems likely it will have other |
| // callers once error handling for the Cast MRP is more fleshed out. |
| virtual void SendErrorToClient(int sequence_number, base::Value error) = 0; |
| |
| private: |
| std::string client_id_; |
| absl::optional<std::string> session_id_; |
| |
| // The origin and FrameTreeNode ID parameters originally passed to the |
| // CreateRoute method of the MediaRouteProvider Mojo interface. |
| url::Origin origin_; |
| int frame_tree_node_id_; |
| }; |
| |
| class CastSessionClientFactoryForTest { |
| public: |
| virtual std::unique_ptr<CastSessionClient> MakeClientForTest( |
| const std::string& client_id, |
| const url::Origin& origin, |
| int frame_tree_node_id) = 0; |
| }; |
| |
| } // namespace media_router |
| |
| #endif // CHROME_BROWSER_MEDIA_ROUTER_PROVIDERS_CAST_CAST_SESSION_CLIENT_H_ |