blob: a9585bd3f843e31e7c7123c57080e81a9cbb8da2 [file] [log] [blame]
// Copyright 2015 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 "components/arc/arc_service_manager.h"
#include "base/logging.h"
#include "base/memory/ptr_util.h"
#include "base/task_runner.h"
#include "components/arc/arc_bridge_service.h"
#include "components/arc/arc_session.h"
#include "components/arc/arc_session_runner.h"
#include "components/arc/intent_helper/arc_intent_helper_observer.h"
namespace arc {
namespace {
// Weak pointer. This class is owned by arc::ArcServiceLauncher.
ArcServiceManager* g_arc_service_manager = nullptr;
} // namespace
ArcServiceManager::ArcServiceManager(
scoped_refptr<base::TaskRunner> blocking_task_runner)
: blocking_task_runner_(blocking_task_runner),
arc_bridge_service_(base::MakeUnique<ArcBridgeService>()),
activity_resolver_(new LocalActivityResolver()) {
DCHECK(!g_arc_service_manager);
g_arc_service_manager = this;
}
ArcServiceManager::~ArcServiceManager() {
DCHECK(thread_checker_.CalledOnValidThread());
DCHECK_EQ(g_arc_service_manager, this);
g_arc_service_manager = nullptr;
}
// static
ArcServiceManager* ArcServiceManager::Get() {
if (!g_arc_service_manager)
return nullptr;
DCHECK(g_arc_service_manager->thread_checker_.CalledOnValidThread());
return g_arc_service_manager;
}
ArcBridgeService* ArcServiceManager::arc_bridge_service() {
DCHECK(thread_checker_.CalledOnValidThread());
return arc_bridge_service_.get();
}
bool ArcServiceManager::AddServiceInternal(
const std::string& name,
std::unique_ptr<ArcService> service) {
DCHECK(thread_checker_.CalledOnValidThread());
if (!name.empty() && services_.count(name) != 0) {
LOG(ERROR) << "Ignoring registration of service with duplicate name: "
<< name;
return false;
}
services_.insert(std::make_pair(name, std::move(service)));
return true;
}
ArcService* ArcServiceManager::GetNamedServiceInternal(
const std::string& name) {
DCHECK(thread_checker_.CalledOnValidThread());
if (name.empty()) {
LOG(ERROR) << "kArcServiceName[] should be a fully-qualified class name.";
return nullptr;
}
auto service = services_.find(name);
if (service == services_.end()) {
LOG(ERROR) << "Named service " << name << " not found";
return nullptr;
}
return service->second.get();
}
void ArcServiceManager::Shutdown() {
DCHECK(thread_checker_.CalledOnValidThread());
activity_resolver_ = nullptr;
services_.clear();
}
} // namespace arc