blob: e32c184324a846ab90f458657f583d4995bb3d47 [file] [log] [blame]
// Copyright 2022 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.
// ============================================================================
// This is an accompanying example code for the C++ client tutorial. Head over
// there for the full walk-through:
// https://fuchsia.dev/fuchsia-src/development/languages/fidl/tutorials/cpp/basics/sync-client
// ============================================================================
// [START includes]
#include <fidl/fuchsia.examples/cpp/fidl.h>
#include <lib/component/incoming/cpp/protocol.h>
#include <lib/syslog/cpp/macros.h>
// [END includes]
// [START main]
int main(int argc, const char** argv) {
// [START connect]
// Connect to the |fuchsia.examples/Echo| protocol inside the component's
// namespace. This can fail so it's wrapped in a |zx::result| and it must be
// checked for errors.
zx::result client_end = component::Connect<fuchsia_examples::Echo>();
if (!client_end.is_ok()) {
FX_LOGS(ERROR) << "Synchronous error when connecting to the |Echo| protocol: "
<< client_end.status_string();
return -1;
}
// [END connect]
// [START init-client]
fidl::SyncClient client{std::move(*client_end)};
// [END init-client]
{
// Make an EchoString call.
// [START echo-string]
fidl::Result result = client->EchoString({"hello"});
// Check if the FIDL call succeeded or not.
if (!result.is_ok()) {
// If the call failed, log the error, and quit the program.
// Production code should do more graceful error handling depending
// on the situation.
FX_LOGS(ERROR) << "EchoString failed: " << result.error_value();
return -1;
}
const std::string& reply_string = result->response();
FX_LOGS(INFO) << "Got response: " << reply_string;
// [END echo-string]
}
{
// [START echo-string-designated]
// [START echo-string-designated-first-line]
fidl::Result result = client->EchoString({{.value = "hello"}});
// [END echo-string-designated-first-line]
if (!result.is_ok()) {
FX_LOGS(ERROR) << "EchoString failed: " << result.error_value();
return -1;
}
const std::string& reply_string = result->response();
FX_LOGS(INFO) << "Got response: " << reply_string;
// [END echo-string-designated]
}
{
// Make a SendString call.
// [START send-string]
// [START send-string-first-line]
fit::result<fidl::Error> result = client->SendString({"hi"});
// [END send-string-first-line]
if (!result.is_ok()) {
FX_LOGS(ERROR) << "SendString failed: " << result.error_value();
return -1;
}
// [END send-string]
// [START event-handler]
// Define the event handler implementation for the client.
//
// The event handler should be an object that implements
// |fidl::SyncEventHandler<Echo>|, and override all pure virtual methods
// in that class corresponding to the events offered by the protocol.
class EventHandler : public fidl::SyncEventHandler<fuchsia_examples::Echo> {
public:
EventHandler() = default;
void OnString(fidl::Event<fuchsia_examples::Echo::OnString>& event) override {
const std::string& reply_string = event.response();
FX_LOGS(INFO) << "Got event: " << reply_string;
}
};
// [END event-handler]
// [START handle-one-event]
// Block to receive exactly one event from the server, which is handled using
// the event handler defined above.
EventHandler event_handler;
fidl::Status status = client.HandleOneEvent(event_handler);
if (!status.ok()) {
FX_LOGS(ERROR) << "HandleOneEvent failed: " << status.error();
return -1;
}
// [END handle-one-event]
// Make a SendString call using wire types.
// [START send-string-wire]
// [START send-string-wire-first-line]
fidl::Status wire_result = client.wire()->SendString("hi");
// [END send-string-wire-first-line]
if (!wire_result.ok()) {
FX_LOGS(ERROR) << "SendString failed: " << wire_result.error();
return -1;
}
// [END send-string-wire]
status = client.HandleOneEvent(event_handler);
if (!status.ok()) {
FX_LOGS(ERROR) << "HandleOneEvent failed: " << status.error();
return -1;
}
}
{
// Make an EchoString call using wire types.
// [START echo-string-wire]
// [START echo-string-wire-first-line]
fidl::WireResult result = client.wire()->EchoString("hello");
// [END echo-string-wire-first-line]
if (!result.ok()) {
FX_LOGS(ERROR) << "EchoString failed: " << result.error();
return -1;
}
FX_LOGS(INFO) << "Got response: " << result->response.get();
// [END echo-string-wire]
}
return 0;
}
// [END main]