blob: 079290ca8abb971d0b26a6013f6d4624dda51060 [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.
#ifndef LIB_DRIVER2_RUNTIME_H_
#define LIB_DRIVER2_RUNTIME_H_
#include <fidl/fuchsia.driver.framework/cpp/wire.h>
#include <lib/fdf/cpp/channel.h>
#include <lib/fdf/dispatcher.h>
#include <lib/fpromise/bridge.h>
#include <lib/fpromise/promise.h>
namespace driver {
// Connects to the runtime protocol 'protocol_name` using `client`
// and returns a fpromise::promise containing the runtime channel on success.
template <typename T>
fpromise::promise<fdf::Channel, zx_status_t> ConnectToRuntimeProtocol(
fidl::WireSharedClient<fuchsia_driver_framework::RuntimeConnector>& client,
std::string_view protocol_name = fidl::DiscoverableProtocolName<T>) {
if (!client.is_valid()) {
return fpromise::make_result_promise<fdf::Channel, zx_status_t>(
fpromise::error(ZX_ERR_INVALID_ARGS));
}
auto channels = fdf::ChannelPair::Create(0);
if (channels.is_error()) {
return fpromise::make_result_promise<fdf::Channel, zx_status_t>(
fpromise::error(channels.status_value()));
}
fpromise::bridge<fdf::Channel, zx_status_t> bridge;
auto callback = [completer = std::move(bridge.completer), client = std::move(channels->end0)](
fidl::WireUnownedResult<fuchsia_driver_framework::RuntimeConnector::Connect>&
result) mutable {
if (!result.ok()) {
completer.complete_error(ZX_ERR_INTERNAL);
return;
}
if (result->is_error()) {
completer.complete_error(result->error_value());
return;
}
completer.complete_ok(std::move(client));
};
client
->Connect(fidl::StringView::FromExternal(protocol_name),
fuchsia_driver_framework::wire::RuntimeProtocolServerEnd{channels->end1.release()})
.Then(std::move(callback));
return bridge.consumer.promise_or(fpromise::error(ZX_ERR_CANCELED));
}
} // namespace driver
#endif // LIB_DRIVER2_RUNTIME_H_