| // 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/component_context.h" |
| |
| #include <lib/fdio/util.h> |
| #include <lib/zx/channel.h> |
| #include <utility> |
| |
| #include "base/fuchsia/fuchsia_logging.h" |
| #include "base/no_destructor.h" |
| #include "starboard/types.h" |
| |
| namespace base { |
| namespace fuchsia { |
| |
| namespace { |
| |
| // static |
| zx::channel ConnectToServiceRoot() { |
| zx::channel client_channel; |
| zx::channel server_channel; |
| zx_status_t result = zx::channel::create(0, &client_channel, &server_channel); |
| ZX_CHECK(result == ZX_OK, result) << "zx_channel_create()"; |
| result = fdio_service_connect("/svc/.", server_channel.release()); |
| ZX_CHECK(result == ZX_OK, result) << "Failed to open /svc"; |
| return client_channel; |
| } |
| |
| } // namespace |
| |
| ComponentContext::ComponentContext(zx::channel service_root) |
| : service_root_(std::move(service_root)) { |
| DCHECK(service_root_); |
| } |
| |
| ComponentContext::~ComponentContext() = default; |
| |
| // static |
| ComponentContext* ComponentContext::GetDefault() { |
| static base::NoDestructor<ComponentContext> component_context( |
| ConnectToServiceRoot()); |
| return component_context.get(); |
| } |
| |
| zx_status_t ComponentContext::ConnectToService(FidlInterfaceRequest request) { |
| DCHECK(request.is_valid()); |
| return fdio_service_connect_at(service_root_.get(), request.interface_name(), |
| request.TakeChannel().release()); |
| } |
| |
| } // namespace fuchsia |
| } // namespace base |