blob: 4fed5095246b9069924447e6008d40f66eec5983 [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 SRC_LIB_FIDL_CPP_INCLUDE_LIB_FIDL_CPP_UNIFIED_MESSAGING_DECLARATIONS_H_
#define SRC_LIB_FIDL_CPP_INCLUDE_LIB_FIDL_CPP_UNIFIED_MESSAGING_DECLARATIONS_H_
#include <lib/fidl/llcpp/wire_messaging_declarations.h>
#include <cstdint>
// This header centralizes the forward declarations for the various types in the
// unified messaging layer. The C++ FIDL code generator populates the concrete
// definitions from FIDL protocols in the schema.
namespace fidl {
// |Request| represents the request of a FIDL method call, using natural
// types. See |WireRequest| for the equivalent using wire types.
//
// When |Method| request has a payload, |Request| inherits from the payload
// type, exposing the operations of that type.
//
// When |Method| request has no payload, those operations will be absent.
//
// When |Method| has no request (event), this class will be undefined.
template <typename Method>
class Request;
// |Response| represents the response of a FIDL method call, using natural
// types. See |WireResponse| for the equivalent using wire types.
//
// When |Method| response has a payload, |Response| inherits from:
//
// - If |Method| uses the error syntax:
// - If the success value is empty: `fitx::result<AppError>`.
// - Otherwise: `fitx::result<AppError, SuccessValue>`.
// - If |Method| does not use the error syntax: the payload type.
//
// When |Method| response has no payload, those operations will be absent.
//
// When |Method| has no response (one-way), this class will be undefined.
template <typename Method>
class Response;
// |Event| represents an incoming FIDL event using natural types. See
// |WireEvent| for the equivalent using wire types.
//
// When |Method| event has a payload, |Event| inherits from:
//
// - If |Method| uses the error syntax:
// - If the success value is empty: `fitx::result<AppError>`.
// - Otherwise: `fitx::result<AppError, SuccessValue>`.
// - If |Method| does not use the error syntax: the payload type.
//
// When |Method| has no payload, those operations will be absent.
//
// When |Method| is not an event, this class will be undefined.
template <typename Method>
class Event;
// |Result| represents the result of calling a two-way FIDL method |Method|.
//
// It inherits from different `fitx::result` types depending on |Method|:
//
// - When the method does not use the error syntax:
// - When the method response has no body:
//
// fitx::result<fidl::Error>
//
// - When the method response has a body:
//
// fitx::result<fidl::Error, MethodPayload>
//
// where `fidl::Error` is a type representing any transport error or
// protocol level terminal errors such as epitaphs, and |MethodPayload|
// is the response type.
//
// - When the method uses the error syntax:
// - When the method response payload is an empty struct:
//
// fitx::result<fidl::AnyErrorIn<Method>>
//
// - When the method response payload is not an empty struct:
//
// fitx::result<fidl::AnyErrorIn<Method>, MethodPayload>
//
// where |MethodPayload| is the success type.
//
// See also |fidl::AnyErrorIn|.
template <typename Method>
class Result;
namespace internal {
// |MessageTraits| contains information about a request or response message:
// |Message| must be either a |fidl::Request<Foo>| or |fidl::Response<Foo>|.
//
// - bool kHasPayload: whether the message has a payload object. For example, a
// `Foo(struct {})` has a payload that is an empty struct.
// - Payload: if |kHasPayload| is true, a type alias to the payload.
template <typename Message>
struct MessageTraits;
// |NaturalWeakEventSender| borrows the server endpoint from a binding object and
// exposes methods for sending events with natural types.
template <typename FidlProtocol>
class NaturalWeakEventSender;
// |NaturalEventSender| borrows a server endpoint and exposes methods for sending
// events with natural types.
template <typename FidlProtocol>
class NaturalEventSender;
// |NaturalSyncClientImpl| implements methods for making synchronous
// FIDL calls with natural types.
//
// All specializations of |NaturalSyncClientImpl| should inherit from
// |fidl::internal::SyncEndpointManagedVeneer|.
template <typename Protocol>
class NaturalSyncClientImpl;
// |NaturalClientImpl| implements methods for making asynchronous FIDL calls
// with natural types.
//
// All specializations of |NaturalClientImpl| should inherit from
// |fidl::internal::NaturalClientBase|.
template <typename Protocol>
class NaturalClientImpl;
// |NaturalMethodTypes| gives access to:
// - |Completer|: the completer type associated with a particular method.
// - if two-way:
// - |ResultCallback|: the client callback taking a |fidl::Result| type.
// - |IsAbsentBody|: whether the response has no body.
// - |HasApplicationError|: whether the method uses the error syntax.
// - if using the error syntax:
// - |IsEmptyStructPayload|: whether the success payload is an empty struct.
template <typename FidlMethod>
struct NaturalMethodTypes;
// |NaturalEventHandlerInterface| contains handlers for each event inside
// the protocol |FidlProtocol|.
template <typename FidlProtocol>
class NaturalEventHandlerInterface;
template <typename FidlProtocol>
class NaturalEventDispatcher;
// |NaturalServerDispatcher| is a helper type that decodes an incoming message
// and invokes the corresponding handler in the server implementation.
template <typename FidlProtocol>
struct NaturalServerDispatcher;
template <typename FidlMethod>
class NaturalCompleterBase;
} // namespace internal
// |AsyncEventHandler| is used by asynchronous clients to handle events using
// natural types. It also adds a callback for handling errors.
template <typename Protocol>
class AsyncEventHandler;
// |Server| is a pure-virtual interface to be implemented by a server, receiving
// natural types.
template <typename Protocol>
class Server;
} // namespace fidl
#endif // SRC_LIB_FIDL_CPP_INCLUDE_LIB_FIDL_CPP_UNIFIED_MESSAGING_DECLARATIONS_H_