|  | // Copyright 2019 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 <fuchsia/sys/cpp/fidl.h> | 
|  | #include <lib/async-loop/cpp/loop.h> | 
|  | #include <lib/async-loop/default.h> | 
|  | #include <lib/async/default.h> | 
|  | #include <lib/sys/cpp/component_context.h> | 
|  | #include <lib/zx/channel.h> | 
|  | #include <lib/zx/process.h> | 
|  | #include <zircon/processargs.h> | 
|  | #include <zircon/status.h> | 
|  |  | 
|  | #include <iostream> | 
|  | #include <string> | 
|  | #include <vector> | 
|  |  | 
|  | #include <fidl/examples/echo/llcpp/fidl.h> | 
|  |  | 
|  | int main(int argc, const char** argv) { | 
|  | std::string server_url = "fuchsia-pkg://fuchsia.com/echo_server_llcpp#meta/echo_server_llcpp.cmx"; | 
|  | std::string msg = "hello world"; | 
|  |  | 
|  | for (int i = 1; i < argc - 1; ++i) { | 
|  | if (!strcmp("--server", argv[i])) { | 
|  | server_url = argv[++i]; | 
|  | } else if (!strcmp("-m", argv[i])) { | 
|  | msg = argv[++i]; | 
|  | } | 
|  | } | 
|  |  | 
|  | // Using high-level C++ bindings to launch the server component | 
|  | async::Loop loop(&kAsyncLoopConfigAttachToCurrentThread); | 
|  | ::fidl::InterfaceHandle<fuchsia::io::Directory> directory; | 
|  | fuchsia::sys::LaunchInfo launch_info; | 
|  | launch_info.url = server_url; | 
|  | launch_info.directory_request = directory.NewRequest().TakeChannel(); | 
|  | fuchsia::sys::LauncherPtr launcher; | 
|  | auto context = sys::ComponentContext::CreateAndServeOutgoingDirectory(); | 
|  | context->svc()->Connect(launcher.NewRequest()); | 
|  | fuchsia::sys::ComponentControllerPtr controller; | 
|  | launcher->CreateComponent(std::move(launch_info), controller.NewRequest()); | 
|  |  | 
|  | sys::ServiceDirectory echo_provider(std::move(directory)); | 
|  | zx::channel server_end, client_end; | 
|  | assert(zx::channel::create(0, &client_end, &server_end) == ZX_OK); | 
|  | echo_provider.Connect("fidl.examples.echo.Echo", std::move(server_end)); | 
|  |  | 
|  | // Using low-level C++ bindings to perform a call | 
|  | ::llcpp::fidl::examples::echo::Echo::SyncClient client(std::move(client_end)); | 
|  | auto result = client.EchoString(fidl::unowned_str(msg)); | 
|  | if (result.status() != ZX_OK) { | 
|  | std::cerr << "Failed to call server: " << result.status() << " (" << result.error() << ")" | 
|  | << std::endl; | 
|  | return result.status(); | 
|  | } | 
|  |  | 
|  | auto response = result.Unwrap(); | 
|  | std::string reply_string(response->response.data(), response->response.size()); | 
|  | std::cout << "Reply: " << reply_string << std::endl; | 
|  |  | 
|  | return 0; | 
|  | } |