xref: /aosp_15_r20/external/openscreen/cast/streaming/rpc_messenger.h (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
1*3f982cf4SFabien Sanglard // Copyright 2020 The Chromium Authors. All rights reserved.
2*3f982cf4SFabien Sanglard // Use of this source code is governed by a BSD-style license that can be
3*3f982cf4SFabien Sanglard // found in the LICENSE file.
4*3f982cf4SFabien Sanglard 
5*3f982cf4SFabien Sanglard #ifndef CAST_STREAMING_RPC_MESSENGER_H_
6*3f982cf4SFabien Sanglard #define CAST_STREAMING_RPC_MESSENGER_H_
7*3f982cf4SFabien Sanglard 
8*3f982cf4SFabien Sanglard #include <memory>
9*3f982cf4SFabien Sanglard #include <string>
10*3f982cf4SFabien Sanglard #include <utility>
11*3f982cf4SFabien Sanglard #include <vector>
12*3f982cf4SFabien Sanglard 
13*3f982cf4SFabien Sanglard #include "cast/streaming/remoting.pb.h"
14*3f982cf4SFabien Sanglard #include "util/flat_map.h"
15*3f982cf4SFabien Sanglard #include "util/weak_ptr.h"
16*3f982cf4SFabien Sanglard 
17*3f982cf4SFabien Sanglard namespace openscreen {
18*3f982cf4SFabien Sanglard namespace cast {
19*3f982cf4SFabien Sanglard 
20*3f982cf4SFabien Sanglard // Processes incoming and outgoing RPC messages and links them to desired
21*3f982cf4SFabien Sanglard // components on both end points. For outgoing messages, the messenger
22*3f982cf4SFabien Sanglard // must send an RPC message with associated handle value. On the messagee side,
23*3f982cf4SFabien Sanglard // the message is sent to a pre-registered component using that handle.
24*3f982cf4SFabien Sanglard // Before RPC communication starts, both sides need to negotiate the handle
25*3f982cf4SFabien Sanglard // value in the existing RPC communication channel using the special handles
26*3f982cf4SFabien Sanglard // |kAcquire*Handle|.
27*3f982cf4SFabien Sanglard //
28*3f982cf4SFabien Sanglard // NOTE: RpcMessenger doesn't actually send RPC messages to the remote. The session
29*3f982cf4SFabien Sanglard // messenger needs to set SendMessageCallback, and call ProcessMessageFromRemote
30*3f982cf4SFabien Sanglard // as appropriate. The RpcMessenger then distributes each RPC message to the
31*3f982cf4SFabien Sanglard // subscribed component.
32*3f982cf4SFabien Sanglard class RpcMessenger {
33*3f982cf4SFabien Sanglard  public:
34*3f982cf4SFabien Sanglard   using Handle = int;
35*3f982cf4SFabien Sanglard   using ReceiveMessageCallback =
36*3f982cf4SFabien Sanglard       std::function<void(std::unique_ptr<RpcMessage>)>;
37*3f982cf4SFabien Sanglard   using SendMessageCallback = std::function<void(std::vector<uint8_t>)>;
38*3f982cf4SFabien Sanglard 
39*3f982cf4SFabien Sanglard   explicit RpcMessenger(SendMessageCallback send_message_cb);
40*3f982cf4SFabien Sanglard   RpcMessenger(const RpcMessenger&) = delete;
41*3f982cf4SFabien Sanglard   RpcMessenger(RpcMessenger&&) noexcept;
42*3f982cf4SFabien Sanglard   RpcMessenger& operator=(const RpcMessenger&) = delete;
43*3f982cf4SFabien Sanglard   RpcMessenger& operator=(RpcMessenger&&);
44*3f982cf4SFabien Sanglard   ~RpcMessenger();
45*3f982cf4SFabien Sanglard 
46*3f982cf4SFabien Sanglard   // Get unique handle value for RPC message handles.
47*3f982cf4SFabien Sanglard   Handle GetUniqueHandle();
48*3f982cf4SFabien Sanglard 
49*3f982cf4SFabien Sanglard   // Register a component to receive messages via the given
50*3f982cf4SFabien Sanglard   // ReceiveMessageCallback. |handle| is a unique handle value provided by a
51*3f982cf4SFabien Sanglard   // prior call to GetUniqueHandle() and is used to reference the component in
52*3f982cf4SFabien Sanglard   // the RPC messages. The receiver can then use it to direct an RPC message
53*3f982cf4SFabien Sanglard   // back to a specific component.
54*3f982cf4SFabien Sanglard   void RegisterMessageReceiverCallback(Handle handle,
55*3f982cf4SFabien Sanglard                                        ReceiveMessageCallback callback);
56*3f982cf4SFabien Sanglard 
57*3f982cf4SFabien Sanglard   // Allows components to unregister in order to stop receiving message.
58*3f982cf4SFabien Sanglard   void UnregisterMessageReceiverCallback(Handle handle);
59*3f982cf4SFabien Sanglard 
60*3f982cf4SFabien Sanglard   // Distributes an incoming RPC message to the registered (if any) component.
61*3f982cf4SFabien Sanglard   // The |serialized_message| should be already base64-decoded and ready for
62*3f982cf4SFabien Sanglard   // deserialization by protobuf.
63*3f982cf4SFabien Sanglard   void ProcessMessageFromRemote(const uint8_t* message,
64*3f982cf4SFabien Sanglard                                 std::size_t message_len);
65*3f982cf4SFabien Sanglard   // This overload distributes an already-deserialized message to the
66*3f982cf4SFabien Sanglard   // registered component.
67*3f982cf4SFabien Sanglard   void ProcessMessageFromRemote(std::unique_ptr<RpcMessage> message);
68*3f982cf4SFabien Sanglard 
69*3f982cf4SFabien Sanglard   // Executes the |send_message_cb_| using |rpc|.
70*3f982cf4SFabien Sanglard   void SendMessageToRemote(const RpcMessage& rpc);
71*3f982cf4SFabien Sanglard 
72*3f982cf4SFabien Sanglard   // Checks if the handle is registered for receiving messages. Test-only.
73*3f982cf4SFabien Sanglard   bool IsRegisteredForTesting(Handle handle);
74*3f982cf4SFabien Sanglard 
75*3f982cf4SFabien Sanglard   // Weak pointer creator.
76*3f982cf4SFabien Sanglard   WeakPtr<RpcMessenger> GetWeakPtr();
77*3f982cf4SFabien Sanglard 
78*3f982cf4SFabien Sanglard   // Consumers of RPCMessenger may set the send message callback post-hoc
79*3f982cf4SFabien Sanglard   // in order to simulate different scenarios.
set_send_message_cb_for_testing(SendMessageCallback cb)80*3f982cf4SFabien Sanglard   void set_send_message_cb_for_testing(SendMessageCallback cb) {
81*3f982cf4SFabien Sanglard     send_message_cb_ = std::move(cb);
82*3f982cf4SFabien Sanglard   }
83*3f982cf4SFabien Sanglard 
84*3f982cf4SFabien Sanglard   // Predefined invalid handle value for RPC message.
85*3f982cf4SFabien Sanglard   static constexpr Handle kInvalidHandle = -1;
86*3f982cf4SFabien Sanglard 
87*3f982cf4SFabien Sanglard   // Predefined handle values for RPC messages related to initialization (before
88*3f982cf4SFabien Sanglard   // the receiver handle(s) are known).
89*3f982cf4SFabien Sanglard   static constexpr Handle kAcquireRendererHandle = 0;
90*3f982cf4SFabien Sanglard   static constexpr Handle kAcquireDemuxerHandle = 1;
91*3f982cf4SFabien Sanglard 
92*3f982cf4SFabien Sanglard   // The first handle to return from GetUniqueHandle().
93*3f982cf4SFabien Sanglard   static constexpr Handle kFirstHandle = 100;
94*3f982cf4SFabien Sanglard 
95*3f982cf4SFabien Sanglard  private:
96*3f982cf4SFabien Sanglard   // Next unique handle to return from GetUniqueHandle().
97*3f982cf4SFabien Sanglard   Handle next_handle_;
98*3f982cf4SFabien Sanglard 
99*3f982cf4SFabien Sanglard   // Maps of handle values to associated MessageReceivers.
100*3f982cf4SFabien Sanglard   FlatMap<Handle, ReceiveMessageCallback> receive_callbacks_;
101*3f982cf4SFabien Sanglard 
102*3f982cf4SFabien Sanglard   // Callback that is ran to send a serialized message.
103*3f982cf4SFabien Sanglard   SendMessageCallback send_message_cb_;
104*3f982cf4SFabien Sanglard 
105*3f982cf4SFabien Sanglard   WeakPtrFactory<RpcMessenger> weak_factory_{this};
106*3f982cf4SFabien Sanglard };
107*3f982cf4SFabien Sanglard 
108*3f982cf4SFabien Sanglard }  // namespace cast
109*3f982cf4SFabien Sanglard }  // namespace openscreen
110*3f982cf4SFabien Sanglard 
111*3f982cf4SFabien Sanglard #endif  // CAST_STREAMING_RPC_MESSENGER_H_
112