You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
100 lines
3.8 KiB
100 lines
3.8 KiB
4 months ago
|
// 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 <functional>
|
||
|
#include <vector>
|
||
|
|
||
|
#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<void(bool)>;
|
||
|
|
||
|
// 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<PendingRequest> pending_remote_requests_;
|
||
|
};
|
||
|
|
||
|
} // namespace cast
|
||
|
} // namespace openscreen
|
||
|
|
||
|
#endif // CAST_COMMON_CHANNEL_CONNECTION_NAMESPACE_HANDLER_H_
|