// 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 CAST_COMMON_CHANNEL_CONNECTION_NAMESPACE_HANDLER_H_ #define CAST_COMMON_CHANNEL_CONNECTION_NAMESPACE_HANDLER_H_ #include #include #include "cast/common/channel/cast_message_handler.h" #include "cast/common/channel/proto/cast_channel.pb.h" #include "cast/common/channel/virtual_connection.h" #include "util/json/json_serialization.h" namespace openscreen { namespace cast { class VirtualConnectionRouter; // Handles CastMessages in the connection namespace by opening and closing // VirtualConnections on the socket on which the messages were received. // // This is meant to be used in either/both the initiator or responder role: // // 1. Initiators call Open/CloseRemoteConnection() to establish/close a virtual // connection with a remote peer. Internally, OpenRemoteConnection() sends a // CONNECT request to the remote peer, and the remote peer is expected to // respond with a either a CONNECTED response or a CLOSE response. // // 2. Responders simply handle CONNECT or CLOSE requests, allowing or // disallowing connections based on the VirtualConnectionPolicy, and // ConnectionNamespaceHandler will report new/closed connections to the local // VirtualConnectionRouter to enable/disable message routing. class ConnectionNamespaceHandler : public CastMessageHandler { public: class VirtualConnectionPolicy { public: virtual ~VirtualConnectionPolicy() = default; virtual bool IsConnectionAllowed( const VirtualConnection& virtual_conn) const = 0; }; using RemoteConnectionResultCallback = std::function; // Both |vc_router| and |vc_policy| should outlive this object. ConnectionNamespaceHandler(VirtualConnectionRouter* vc_router, VirtualConnectionPolicy* vc_policy); ~ConnectionNamespaceHandler() override; // Requests a virtual connection be established. The |result_callback| is // later invoked with true/false to indicate success, based on a response from // the remote. void OpenRemoteConnection(VirtualConnection conn, RemoteConnectionResultCallback result_callback); // Closes the virtual connection, notifying the remote by sending it a CLOSE // message. void CloseRemoteConnection(VirtualConnection conn); // CastMessageHandler overrides. void OnMessage(VirtualConnectionRouter* router, CastSocket* socket, ::cast::channel::CastMessage message) override; private: void HandleConnect(CastSocket* socket, ::cast::channel::CastMessage message, Json::Value parsed_message); void HandleClose(CastSocket* socket, ::cast::channel::CastMessage message, Json::Value parsed_message); void HandleConnectedResponse(CastSocket* socket, ::cast::channel::CastMessage message, Json::Value parsed_message); void SendConnect(VirtualConnection virtual_conn); void SendClose(VirtualConnection virtual_conn); void SendConnectedResponse(const VirtualConnection& virtual_conn, int max_protocol_version); bool RemoveConnection(const VirtualConnection& conn, VirtualConnection::CloseReason reason); VirtualConnectionRouter* const vc_router_; VirtualConnectionPolicy* const vc_policy_; struct PendingRequest { VirtualConnection conn; RemoteConnectionResultCallback result_callback; }; std::vector pending_remote_requests_; }; } // namespace cast } // namespace openscreen #endif // CAST_COMMON_CHANNEL_CONNECTION_NAMESPACE_HANDLER_H_