blob: 2b4d6993758c9900597efd84532e800b0eb83a94 [file] [log] [blame]
// Copyright 2018 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.
#include "chromeos/services/secure_channel/active_connection_manager_impl.h"
#include "base/no_destructor.h"
#include "base/stl_util.h"
#include "chromeos/components/multidevice/logging/logging.h"
#include "chromeos/services/secure_channel/multiplexed_channel_impl.h"
namespace chromeos {
namespace secure_channel {
// static
ActiveConnectionManagerImpl::Factory*
ActiveConnectionManagerImpl::Factory::test_factory_ = nullptr;
// static
ActiveConnectionManagerImpl::Factory*
ActiveConnectionManagerImpl::Factory::Get() {
if (test_factory_)
return test_factory_;
static base::NoDestructor<ActiveConnectionManagerImpl::Factory> factory;
return factory.get();
}
// static
void ActiveConnectionManagerImpl::Factory::SetFactoryForTesting(
Factory* test_factory) {
test_factory_ = test_factory;
}
ActiveConnectionManagerImpl::Factory::~Factory() = default;
std::unique_ptr<ActiveConnectionManager>
ActiveConnectionManagerImpl::Factory::BuildInstance(
ActiveConnectionManager::Delegate* delegate) {
return base::WrapUnique(new ActiveConnectionManagerImpl(delegate));
}
ActiveConnectionManagerImpl::ActiveConnectionManagerImpl(
ActiveConnectionManager::Delegate* delegate)
: ActiveConnectionManager(delegate) {}
ActiveConnectionManagerImpl::~ActiveConnectionManagerImpl() = default;
ActiveConnectionManager::ConnectionState
ActiveConnectionManagerImpl::GetConnectionState(
const ConnectionDetails& connection_details) const {
auto it = details_to_channel_map_.find(connection_details);
if (it == details_to_channel_map_.end())
return ConnectionState::kNoConnectionExists;
const MultiplexedChannel* channel = it->second.get();
DCHECK(channel);
DCHECK(!channel->IsDisconnected());
return channel->IsDisconnecting()
? ConnectionState::kDisconnectingConnectionExists
: ConnectionState::kActiveConnectionExists;
}
void ActiveConnectionManagerImpl::PerformAddActiveConnection(
std::unique_ptr<AuthenticatedChannel> authenticated_channel,
std::vector<std::unique_ptr<ClientConnectionParameters>> initial_clients,
const ConnectionDetails& connection_details) {
details_to_channel_map_[connection_details] =
MultiplexedChannelImpl::Factory::Get()->BuildInstance(
std::move(authenticated_channel), this /* delegate */,
connection_details, &initial_clients);
}
void ActiveConnectionManagerImpl::PerformAddClientToChannel(
std::unique_ptr<ClientConnectionParameters> client_connection_parameters,
const ConnectionDetails& connection_details) {
bool success =
details_to_channel_map_[connection_details]->AddClientToChannel(
std::move(client_connection_parameters));
if (!success) {
PA_LOG(ERROR) << "ActiveConnectionManagerImpl::"
<< "PerformAddClientToChannel(): Could not add "
<< "ClientConnectionParameters to MultiplexedChannel.";
NOTREACHED();
}
}
void ActiveConnectionManagerImpl::OnDisconnected(
const ConnectionDetails& connection_details) {
// Make a copy of |connection_details|, since the owner of these details is
// deleted below.
const ConnectionDetails connection_details_copy = connection_details;
size_t num_deleted = details_to_channel_map_.erase(connection_details);
if (num_deleted != 1u) {
PA_LOG(ERROR) << "ActiveConnectionManagerImpl::OnDisconnected(): Tried to "
<< "delete map entry, but it did not exist.";
NOTREACHED();
}
OnChannelDisconnected(connection_details_copy);
}
} // namespace secure_channel
} // namespace chromeos