Commit 8828e090 authored by Kyle Horimoto's avatar Kyle Horimoto Committed by Commit Bot

[CrOS MultiDevice] Implement PendingConnectionManagerImpl.

This class creates one ConnectionAttempt per ConnectionAttemptDetails
requested; if more than one request shares the same
ConnectionAttemptDetails, a single ConnectionAttempt attempts a
connection for all associated requests.

If a ConnectionAttempt successfully creates a channel, this class
extracts client data from all requests to the same remote device and
alerts its delegate, deleting all associated ConnectionAttempts when it
is finished.

Bug: 824568, 752273
Change-Id: If9790549157919209e3e96f4a0b11d04fda2870c
Reviewed-on: https://chromium-review.googlesource.com/1103669
Commit-Queue: Kyle Horimoto <khorimoto@chromium.org>
Reviewed-by: default avatarRyan Hansberry <hansberry@chromium.org>
Cr-Commit-Position: refs/heads/master@{#568352}
parent c1ab712a
...@@ -8,8 +8,14 @@ ...@@ -8,8 +8,14 @@
#include <memory> #include <memory>
#include <vector> #include <vector>
#include "base/containers/flat_map.h"
#include "base/containers/flat_set.h"
#include "base/macros.h" #include "base/macros.h"
#include "chromeos/services/secure_channel/ble_initiator_failure_type.h"
#include "chromeos/services/secure_channel/ble_listener_failure_type.h"
#include "chromeos/services/secure_channel/client_connection_parameters.h" #include "chromeos/services/secure_channel/client_connection_parameters.h"
#include "chromeos/services/secure_channel/connection_attempt.h"
#include "chromeos/services/secure_channel/connection_attempt_delegate.h"
#include "chromeos/services/secure_channel/connection_medium.h" #include "chromeos/services/secure_channel/connection_medium.h"
#include "chromeos/services/secure_channel/connection_role.h" #include "chromeos/services/secure_channel/connection_role.h"
#include "chromeos/services/secure_channel/device_id_pair.h" #include "chromeos/services/secure_channel/device_id_pair.h"
...@@ -20,9 +26,18 @@ namespace chromeos { ...@@ -20,9 +26,18 @@ namespace chromeos {
namespace secure_channel { namespace secure_channel {
// Concrete PendingConnectionManager implementation. class BleConnectionManager;
// TODO(khorimoto): Implement.
class PendingConnectionManagerImpl : public PendingConnectionManager { // Concrete PendingConnectionManager implementation. This class creates one
// ConnectionAttempt per ConnectionAttemptDetails requested; if more than one
// request shares the same ConnectionAttemptDetails, a single ConnectionAttempt
// attempts a connection for all associated requests.
//
// If a ConnectionAttempt successfully creates a channel, this class extracts
// client data from all requests to the same remote device and alerts its
// delegate, deleting all associated ConnectionAttempts when it is finished.
class PendingConnectionManagerImpl : public PendingConnectionManager,
public ConnectionAttemptDelegate {
public: public:
class Factory { class Factory {
public: public:
...@@ -30,7 +45,8 @@ class PendingConnectionManagerImpl : public PendingConnectionManager { ...@@ -30,7 +45,8 @@ class PendingConnectionManagerImpl : public PendingConnectionManager {
static void SetFactoryForTesting(Factory* test_factory); static void SetFactoryForTesting(Factory* test_factory);
virtual ~Factory(); virtual ~Factory();
virtual std::unique_ptr<PendingConnectionManager> BuildInstance( virtual std::unique_ptr<PendingConnectionManager> BuildInstance(
Delegate* delegate); Delegate* delegate,
BleConnectionManager* ble_connection_manager);
private: private:
static Factory* test_factory_; static Factory* test_factory_;
...@@ -39,13 +55,47 @@ class PendingConnectionManagerImpl : public PendingConnectionManager { ...@@ -39,13 +55,47 @@ class PendingConnectionManagerImpl : public PendingConnectionManager {
~PendingConnectionManagerImpl() override; ~PendingConnectionManagerImpl() override;
private: private:
PendingConnectionManagerImpl(Delegate* delegate); PendingConnectionManagerImpl(Delegate* delegate,
BleConnectionManager* ble_connection_manager);
// PendingConnectionManager:
void HandleConnectionRequest( void HandleConnectionRequest(
const ConnectionAttemptDetails& connection_attempt_details, const ConnectionAttemptDetails& connection_attempt_details,
std::unique_ptr<ClientConnectionParameters> client_connection_parameters, std::unique_ptr<ClientConnectionParameters> client_connection_parameters,
ConnectionPriority connection_priority) override; ConnectionPriority connection_priority) override;
// ConnectionAttemptDelegate:
void OnConnectionAttemptSucceeded(
const ConnectionDetails& connection_details,
std::unique_ptr<AuthenticatedChannel> authenticated_channel) override;
void OnConnectionAttemptFinishedWithoutConnection(
const ConnectionAttemptDetails& connection_attempt_details) override;
void HandleBleInitiatorRequest(
const ConnectionAttemptDetails& connection_attempt_details,
std::unique_ptr<ClientConnectionParameters> client_connection_parameters,
ConnectionPriority connection_priority);
void HandleBleListenerRequest(
const ConnectionAttemptDetails& connection_attempt_details,
std::unique_ptr<ClientConnectionParameters> client_connection_parameters,
ConnectionPriority connection_priority);
void RemoveMapEntriesForFinishedConnectionAttempt(
const ConnectionAttemptDetails& connection_attempt_details);
base::flat_map<DeviceIdPair,
std::unique_ptr<ConnectionAttempt<BleInitiatorFailureType>>>
id_pair_to_ble_initiator_connection_attempts_;
base::flat_map<DeviceIdPair,
std::unique_ptr<ConnectionAttempt<BleListenerFailureType>>>
id_pair_to_ble_listener_connection_attempts_;
base::flat_map<ConnectionDetails, base::flat_set<ConnectionAttemptDetails>>
details_to_attempt_details_map_;
BleConnectionManager* ble_connection_manager_;
DISALLOW_COPY_AND_ASSIGN(PendingConnectionManagerImpl); DISALLOW_COPY_AND_ASSIGN(PendingConnectionManagerImpl);
}; };
......
...@@ -70,7 +70,9 @@ SecureChannelImpl::SecureChannelImpl() ...@@ -70,7 +70,9 @@ SecureChannelImpl::SecureChannelImpl()
this /* delegate */)), this /* delegate */)),
pending_connection_manager_( pending_connection_manager_(
PendingConnectionManagerImpl::Factory::Get()->BuildInstance( PendingConnectionManagerImpl::Factory::Get()->BuildInstance(
this /* delegate */)), this /* delegate */,
// TODO(khorimoto): Pass the actual BleConnectionManager here.
nullptr /* ble_connection_manager */)),
remote_device_cache_( remote_device_cache_(
cryptauth::RemoteDeviceCache::Factory::Get()->BuildInstance()) {} cryptauth::RemoteDeviceCache::Factory::Get()->BuildInstance()) {}
......
...@@ -68,7 +68,10 @@ class FakePendingConnectionManagerFactory ...@@ -68,7 +68,10 @@ class FakePendingConnectionManagerFactory
private: private:
std::unique_ptr<PendingConnectionManager> BuildInstance( std::unique_ptr<PendingConnectionManager> BuildInstance(
PendingConnectionManager::Delegate* delegate) override { PendingConnectionManager::Delegate* delegate,
BleConnectionManager* ble_connection_manager) override {
// TODO(khorimoto): Verify that |ble_connection_manager| is correctly passed
// to this factory.
EXPECT_FALSE(instance_); EXPECT_FALSE(instance_);
auto instance = std::make_unique<FakePendingConnectionManager>(delegate); auto instance = std::make_unique<FakePendingConnectionManager>(delegate);
instance_ = instance.get(); instance_ = instance.get();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment