blob: 58583f9cc4125a434bf2bd83e35cc26107b64b98 [file] [log] [blame]
// 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 <fidl/fuchsia.examples/cpp/wire.h>
#include <lib/async-loop/cpp/loop.h>
#include <lib/async-loop/default.h>
#include <lib/component/incoming/cpp/protocol.h>
#include <lib/component/incoming/cpp/service.h>
#include <lib/sys/cpp/component_context.h>
#include <iostream>
using fuchsia_examples::Echo;
using fuchsia_examples::EchoService;
zx::result<> llcpp_example(fidl::UnownedClientEnd<fuchsia_io::Directory> svc) {
zx::result<EchoService::ServiceClient> open_result =
component::OpenServiceAt<EchoService>(std::move(svc));
if (open_result.is_error()) {
std::cerr << "failed to open default instance of EchoService: " << open_result.status_string()
<< std::endl;
return open_result.take_error();
}
EchoService::ServiceClient service = std::move(open_result.value());
zx::result<fidl::ClientEnd<Echo>> connect_result = service.connect_regular_echo();
if (connect_result.is_error()) {
std::cerr << "failed to connect to member protocol regular_echo of EchoService: "
<< connect_result.status_string() << std::endl;
return connect_result.take_error();
}
fidl::WireSyncClient client{std::move(connect_result.value())};
fidl::WireResult<Echo::EchoString> echo_result = client->EchoString(fidl::StringView("hello"));
if (!echo_result.ok()) {
std::cerr << "failed to make EchoString call to member protocol regular_echo of EchoService: "
<< echo_result.error() << std::endl;
return zx::error(ZX_ERR_IO);
}
auto response = echo_result.Unwrap();
std::string result_string(response->response.data(), response->response.size());
if (result_string != "hello") {
std::cerr << "got unexpected response '" << result_string << "'. expected 'hello'."
<< std::endl;
return zx::error(ZX_ERR_INTERNAL);
}
std::cout << "Received response: " << result_string << std::endl;
return zx::ok();
}
int main(int argc, const char** argv) {
async::Loop loop(&kAsyncLoopConfigAttachToCurrentThread);
auto context = sys::ComponentContext::CreateAndServeOutgoingDirectory();
// |component::OpenServiceRoot| returns a channel connected to the /svc directory.
// The remote end of the channel implements the |fuchsia.io/Directory| protocol
// and contains the capabilities provided to this component.
auto svc = component::OpenServiceRoot();
ZX_ASSERT(svc.is_ok());
// Convert the typed handle to LLCPP types.
auto llsvc = fidl::ClientEnd<fuchsia_io::Directory>(svc->TakeChannel());
zx::result<> result = llcpp_example(llsvc);
if (result.is_error()) {
std::cerr << "llcpp_example failed with status: " << result.status_string() << std::endl;
return 1;
}
return 0;
}