blob: 3dc964fc701933b88602be4c5501de0bdda405f7 [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 "base/fuchsia/service_directory_client.h"
#include <lib/fdio/directory.h>
#include <utility>
#include "base/fuchsia/file_utils.h"
#include "base/fuchsia/fuchsia_logging.h"
#include "base/logging.h"
#include "base/no_destructor.h"
namespace base {
namespace fuchsia {
namespace {
// Singleton container for the process-global ServiceDirectoryClient instance.
std::unique_ptr<ServiceDirectoryClient>* ProcessServiceDirectoryClient() {
static base::NoDestructor<std::unique_ptr<ServiceDirectoryClient>>
service_directory_client_ptr(std::make_unique<ServiceDirectoryClient>(
OpenDirectory(base::FilePath(kServiceDirectoryPath))));
return service_directory_client_ptr.get();
}
} // namespace
ServiceDirectoryClient::ServiceDirectoryClient(
fidl::InterfaceHandle<::fuchsia::io::Directory> directory)
: directory_(std::move(directory)) {
DCHECK(directory_);
}
ServiceDirectoryClient::~ServiceDirectoryClient() = default;
// static
const ServiceDirectoryClient* ServiceDirectoryClient::ForCurrentProcess() {
return ProcessServiceDirectoryClient()->get();
}
zx_status_t ServiceDirectoryClient::ConnectToServiceUnsafe(
const char* name,
zx::channel request) const {
DCHECK(request.is_valid());
return fdio_service_connect_at(directory_.channel().get(), name,
request.release());
}
ScopedServiceDirectoryClientForCurrentProcessForTest::
ScopedServiceDirectoryClientForCurrentProcessForTest(
fidl::InterfaceHandle<::fuchsia::io::Directory> directory)
: old_client_(std::move(*ProcessServiceDirectoryClient())) {
*ProcessServiceDirectoryClient() =
std::make_unique<ServiceDirectoryClient>(std::move(directory));
client_ = ProcessServiceDirectoryClient()->get();
}
ScopedServiceDirectoryClientForCurrentProcessForTest::
~ScopedServiceDirectoryClientForCurrentProcessForTest() {
DCHECK_EQ(ProcessServiceDirectoryClient()->get(), client_);
*ProcessServiceDirectoryClient() = std::move(old_client_);
}
} // namespace fuchsia
} // namespace base