1 // Copyright 2019 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CAST_COMMON_CHANNEL_CONNECTION_NAMESPACE_HANDLER_H_ 6 #define CAST_COMMON_CHANNEL_CONNECTION_NAMESPACE_HANDLER_H_ 7 8 #include <functional> 9 #include <vector> 10 11 #include "cast/common/channel/cast_message_handler.h" 12 #include "cast/common/channel/proto/cast_channel.pb.h" 13 #include "cast/common/channel/virtual_connection.h" 14 #include "util/json/json_serialization.h" 15 16 namespace openscreen { 17 namespace cast { 18 19 class VirtualConnectionRouter; 20 21 // Handles CastMessages in the connection namespace by opening and closing 22 // VirtualConnections on the socket on which the messages were received. 23 // 24 // This is meant to be used in either/both the initiator or responder role: 25 // 26 // 1. Initiators call Open/CloseRemoteConnection() to establish/close a virtual 27 // connection with a remote peer. Internally, OpenRemoteConnection() sends a 28 // CONNECT request to the remote peer, and the remote peer is expected to 29 // respond with a either a CONNECTED response or a CLOSE response. 30 // 31 // 2. Responders simply handle CONNECT or CLOSE requests, allowing or 32 // disallowing connections based on the VirtualConnectionPolicy, and 33 // ConnectionNamespaceHandler will report new/closed connections to the local 34 // VirtualConnectionRouter to enable/disable message routing. 35 class ConnectionNamespaceHandler : public CastMessageHandler { 36 public: 37 class VirtualConnectionPolicy { 38 public: 39 virtual ~VirtualConnectionPolicy() = default; 40 41 virtual bool IsConnectionAllowed( 42 const VirtualConnection& virtual_conn) const = 0; 43 }; 44 45 using RemoteConnectionResultCallback = std::function<void(bool)>; 46 47 // Both |vc_router| and |vc_policy| should outlive this object. 48 ConnectionNamespaceHandler(VirtualConnectionRouter* vc_router, 49 VirtualConnectionPolicy* vc_policy); 50 ~ConnectionNamespaceHandler() override; 51 52 // Requests a virtual connection be established. The |result_callback| is 53 // later invoked with true/false to indicate success, based on a response from 54 // the remote. 55 void OpenRemoteConnection(VirtualConnection conn, 56 RemoteConnectionResultCallback result_callback); 57 58 // Closes the virtual connection, notifying the remote by sending it a CLOSE 59 // message. 60 void CloseRemoteConnection(VirtualConnection conn); 61 62 // CastMessageHandler overrides. 63 void OnMessage(VirtualConnectionRouter* router, 64 CastSocket* socket, 65 ::cast::channel::CastMessage message) override; 66 67 private: 68 void HandleConnect(CastSocket* socket, 69 ::cast::channel::CastMessage message, 70 Json::Value parsed_message); 71 void HandleClose(CastSocket* socket, 72 ::cast::channel::CastMessage message, 73 Json::Value parsed_message); 74 void HandleConnectedResponse(CastSocket* socket, 75 ::cast::channel::CastMessage message, 76 Json::Value parsed_message); 77 78 void SendConnect(VirtualConnection virtual_conn); 79 void SendClose(VirtualConnection virtual_conn); 80 void SendConnectedResponse(const VirtualConnection& virtual_conn, 81 int max_protocol_version); 82 83 bool RemoveConnection(const VirtualConnection& conn, 84 VirtualConnection::CloseReason reason); 85 86 VirtualConnectionRouter* const vc_router_; 87 VirtualConnectionPolicy* const vc_policy_; 88 89 struct PendingRequest { 90 VirtualConnection conn; 91 RemoteConnectionResultCallback result_callback; 92 }; 93 std::vector<PendingRequest> pending_remote_requests_; 94 }; 95 96 } // namespace cast 97 } // namespace openscreen 98 99 #endif // CAST_COMMON_CHANNEL_CONNECTION_NAMESPACE_HANDLER_H_ 100