| // Copyright 2025 The Fuchsia 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 <fidl/fuchsia.component.resolution/cpp/fidl.h> |
| #include <lib/async-loop/cpp/loop.h> |
| #include <lib/async-loop/default.h> |
| #include <lib/component/incoming/cpp/protocol.h> |
| #include <lib/component/outgoing/cpp/outgoing_directory.h> |
| #include <lib/fidl/cpp/wire/client.h> |
| #include <lib/fidl/cpp/wire/server.h> |
| |
| #include <memory> |
| |
| using Resolver = fuchsia_component_resolution::Resolver; |
| |
| class ResolverImpl final : public fidl::WireServer<Resolver> { |
| public: |
| ResolverImpl(fidl::ClientEnd<fuchsia_component_resolution::Resolver> client, |
| async_dispatcher_t* dispatcher) |
| : endpoint_(std::move(client), dispatcher) {} |
| |
| void Resolve(ResolveRequestView request, ResolveCompleter::Sync& completer) override { |
| endpoint_->Resolve(request->component_url) |
| .Then([completer = completer.ToAsync()]( |
| fidl::WireUnownedResult<Resolver::Resolve>& result) mutable { |
| if (!result.ok()) { |
| completer.Close(result.status()); |
| return; |
| } |
| completer.Reply(result.value()); |
| }); |
| } |
| |
| void ResolveWithContext(ResolveWithContextRequestView request, |
| ResolveWithContextCompleter::Sync& completer) override { |
| endpoint_->ResolveWithContext(request->component_url, request->context) |
| .Then([completer = completer.ToAsync()]( |
| fidl::WireUnownedResult<Resolver::ResolveWithContext>& result) mutable { |
| if (!result.ok()) { |
| completer.Close(result.status()); |
| return; |
| } |
| completer.Reply(result.value()); |
| }); |
| } |
| |
| void handle_unknown_method(fidl::UnknownMethodMetadata<Resolver> metadata, |
| fidl::UnknownMethodCompleter::Sync& completer) override {} |
| |
| private: |
| fidl::WireClient<Resolver> endpoint_; |
| }; |
| |
| int main() { |
| async::Loop loop(&kAsyncLoopConfigAttachToCurrentThread); |
| async_dispatcher_t* dispatcher = loop.dispatcher(); |
| |
| component::OutgoingDirectory outgoing_directory = component::OutgoingDirectory(dispatcher); |
| zx::result result = outgoing_directory.ServeFromStartupInfo(); |
| if (result.is_error()) { |
| return 1; |
| } |
| |
| result = outgoing_directory.AddUnmanagedProtocol<fuchsia_component_resolution::Resolver>( |
| [dispatcher](fidl::ServerEnd<fuchsia_component_resolution::Resolver> server_end) { |
| auto client = component::Connect<fuchsia_component_resolution::Resolver>(); |
| if (client.is_error()) { |
| return; |
| } |
| fidl::BindServer(dispatcher, std::move(server_end), |
| std::make_unique<ResolverImpl>(std::move(client.value()), dispatcher)); |
| }); |
| |
| return loop.Run(); |
| } |