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