// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROMEOS_ASH_COMPONENTS_TETHER_SECURE_CHANNEL_HOST_CONNECTION_H_
#define CHROMEOS_ASH_COMPONENTS_TETHER_SECURE_CHANNEL_HOST_CONNECTION_H_
#include "base/uuid.h"
#include "chromeos/ash/components/tether/host_connection.h"
#include "chromeos/ash/components/tether/tether_host_fetcher.h"
#include "chromeos/ash/services/device_sync/public/cpp/device_sync_client.h"
#include "chromeos/ash/services/secure_channel/public/cpp/client/client_channel.h"
#include "chromeos/ash/services/secure_channel/public/cpp/client/connection_attempt.h"
#include "chromeos/ash/services/secure_channel/public/cpp/client/secure_channel_client.h"
namespace ash::tether {
class SecureChannelHostConnection
: public HostConnection,
public secure_channel::ClientChannel::Observer {
public:
class Factory : public HostConnection::Factory {
public:
Factory(raw_ptr<device_sync::DeviceSyncClient> device_sync_client,
raw_ptr<secure_channel::SecureChannelClient> secure_channel_client,
raw_ptr<TetherHostFetcher> tether_host_fetcher);
~Factory() override;
Factory(Factory&) = delete;
Factory& operator=(Factory&) = delete;
// HostConnection::Factory:
void ScanForTetherHostAndCreateConnection(
const std::string& device_id,
ConnectionPriority connection_priority,
raw_ptr<HostConnection::PayloadListener> payload_listener,
HostConnection::OnDisconnectionCallback on_disconnection,
HostConnection::Factory::OnConnectionCreatedCallback
on_connection_created) override;
void Create(const TetherHost& tether_host,
ConnectionPriority connection_priority,
raw_ptr<HostConnection::PayloadListener> payload_listener,
HostConnection::OnDisconnectionCallback on_disconnection,
HostConnection::Factory::OnConnectionCreatedCallback
on_connection_created) override;
private:
class ConnectionAttemptDelegateImpl
: public secure_channel::ConnectionAttempt::Delegate {
public:
using OnConnectionAttemptDelegateFinishedCallback =
base::OnceCallback<void(
std::unique_ptr<HostConnection> host_connection)>;
ConnectionAttemptDelegateImpl(
const multidevice::RemoteDeviceRef& local_device,
const multidevice::RemoteDeviceRef& remote_device,
secure_channel::SecureChannelClient* secure_channel_client,
HostConnection::PayloadListener* payload_listener,
HostConnection::OnDisconnectionCallback on_disconnection);
~ConnectionAttemptDelegateImpl() override;
void Start(
secure_channel::ConnectionPriority connection_priority,
OnConnectionAttemptDelegateFinishedCallback on_connection_created);
private:
// secure_channel::ConnectionAttempt::Delegate:
void OnConnectionAttemptFailure(
secure_channel::mojom::ConnectionAttemptFailureReason reason)
override;
void OnConnection(
std::unique_ptr<secure_channel::ClientChannel> channel) override;
const multidevice::RemoteDeviceRef local_device_;
const multidevice::RemoteDeviceRef remote_device_;
raw_ptr<HostConnection::PayloadListener> payload_listener_;
HostConnection::OnDisconnectionCallback on_disconnection_;
std::unique_ptr<secure_channel::ConnectionAttempt> connection_attempt_;
raw_ptr<secure_channel::SecureChannelClient> secure_channel_client_;
OnConnectionAttemptDelegateFinishedCallback
on_connection_attempt_delegate_finished_;
};
void OnConnectionAttemptFinished(
base::Uuid connection_attempt_id,
HostConnection::Factory::OnConnectionCreatedCallback
on_connection_created,
std::unique_ptr<HostConnection> host_connection);
std::map<base::Uuid, std::unique_ptr<ConnectionAttemptDelegateImpl>>
active_connection_attempts_;
raw_ptr<device_sync::DeviceSyncClient> device_sync_client_;
raw_ptr<secure_channel::SecureChannelClient> secure_channel_client_;
raw_ptr<TetherHostFetcher> tether_host_fetcher_;
base::WeakPtrFactory<Factory> weak_ptr_factory_{this};
};
~SecureChannelHostConnection() override;
SecureChannelHostConnection(SecureChannelHostConnection&) = delete;
SecureChannelHostConnection& operator=(SecureChannelHostConnection&) = delete;
// HostConnection:
void SendMessage(std::unique_ptr<MessageWrapper> message,
OnMessageSentCallback on_message_sent_callback) override;
protected:
// secure_channel::ClientChannel::Observer:
void OnMessageReceived(const std::string& message) override;
void OnDisconnected() override;
private:
SecureChannelHostConnection(
raw_ptr<HostConnection::PayloadListener> listener,
HostConnection::OnDisconnectionCallback on_disconnection,
std::unique_ptr<secure_channel::ClientChannel> client_channel);
std::unique_ptr<secure_channel::ClientChannel> client_channel_;
};
} // namespace ash::tether
#endif // CHROMEOS_ASH_COMPONENTS_TETHER_SECURE_CHANNEL_HOST_CONNECTION_H_