blob: 3e1df403d4f9d895e9b8b50c846c6bf8fb652d08 [file]
// Copyright 2021 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.
package codegen
// fragmentMethodRequestTmpl contains the definition for
// fidl::WireRequest<Method>.
const fragmentMethodRequestTmpl = `
{{- define "MethodRequestDeclaration" }}
{{- EnsureNamespace "" }}
{{- if .Request.IsResource }}
{{- IfdefFuchsia -}}
{{- end }}
template<>
struct {{ .WireRequest }} final {
FIDL_ALIGNDECL
{{- /* Add underscore to prevent name collision */}}
fidl_message_header_t _hdr;
{{- range $index, $param := .RequestArgs }}
{{ $param.Type }} {{ $param.Name }};
{{- end }}
{{- if .RequestArgs }}
explicit {{ .WireRequest.Self }}({{ RenderParams "zx_txid_t _txid" .RequestArgs }})
{{ RenderInitMessage .RequestArgs }} {
_InitHeader(_txid);
}
{{- end }}
explicit {{ .WireRequest.Self }}(zx_txid_t _txid) {
_InitHeader(_txid);
}
static constexpr const fidl_type_t* Type =
{{- if .RequestArgs }}
&{{ .Request.WireCodingTable }};
{{- else }}
&::fidl::_llcpp_coding_AnyZeroArgMessageTable;
{{- end }}
static constexpr uint32_t MaxNumHandles = {{ .Request.MaxHandles }};
static constexpr uint32_t PrimarySize = {{ .Request.InlineSize }};
static constexpr uint32_t MaxOutOfLine = {{ .Request.MaxOutOfLine }};
static constexpr uint32_t AltPrimarySize = {{ .Request.InlineSize }};
static constexpr uint32_t AltMaxOutOfLine = {{ .Request.MaxOutOfLine }};
static constexpr bool HasFlexibleEnvelope = {{ .Request.HasFlexibleEnvelope }};
static constexpr bool HasPointer = {{ .Request.HasPointer }};
static constexpr ::fidl::internal::TransactionalMessageKind MessageKind =
::fidl::internal::TransactionalMessageKind::kRequest;
{{- if and .HasResponse .ResponseArgs }}
using ResponseType = {{ .WireResponse }};
{{- end }}
{{- if .Request.IsResource }}
void _CloseHandles();
{{- end }}
class UnownedEncodedMessage final {
public:
UnownedEncodedMessage(
{{- RenderParams "uint8_t* _backing_buffer" "uint32_t _backing_buffer_size" "zx_txid_t _txid" .RequestArgs }})
: UnownedEncodedMessage({{ RenderForwardParams "::fidl::internal::IovecBufferSize" "_backing_buffer" "_backing_buffer_size" "_txid" .RequestArgs }}) {}
UnownedEncodedMessage(
{{- RenderParams "uint32_t _iovec_capacity" "uint8_t* _backing_buffer" "uint32_t _backing_buffer_size" "zx_txid_t _txid" .RequestArgs }})
: message_(::fidl::OutgoingMessage::ConstructorArgs{
.iovecs = iovecs_,
.iovec_capacity = _iovec_capacity,
{{- if gt .Request.MaxHandles 0 }}
.handles = handles_,
.handle_capacity = std::min(ZX_CHANNEL_MAX_MSG_HANDLES, MaxNumHandles),
{{- end }}
.backing_buffer = _backing_buffer,
.backing_buffer_capacity = _backing_buffer_size,
}) {
ZX_ASSERT(_iovec_capacity <= std::size(iovecs_));
FIDL_ALIGNDECL {{ .WireRequest.Self }} _request({{ RenderForwardParams "_txid" .RequestArgs }});
message_.Encode<{{ .WireRequest.Self }}>(&_request);
}
UnownedEncodedMessage(uint8_t* _backing_buffer, uint32_t _backing_buffer_size,
{{ .WireRequest.Self }}* request)
: UnownedEncodedMessage(::fidl::internal::IovecBufferSize, _backing_buffer, _backing_buffer_size, request) {}
UnownedEncodedMessage(uint32_t _iovec_capacity, uint8_t* _backing_buffer, uint32_t _backing_buffer_size,
{{ .WireRequest.Self }}* request)
: message_(::fidl::OutgoingMessage::ConstructorArgs{
.iovecs = iovecs_,
.iovec_capacity = _iovec_capacity,
{{- if gt .Request.MaxHandles 0 }}
.handles = handles_,
.handle_capacity = std::min(ZX_CHANNEL_MAX_MSG_HANDLES, MaxNumHandles),
{{- end }}
.backing_buffer = _backing_buffer,
.backing_buffer_capacity = _backing_buffer_size,
}) {
ZX_ASSERT(_iovec_capacity <= std::size(iovecs_));
message_.Encode<{{ .WireRequest.Self }}>(request);
}
UnownedEncodedMessage(const UnownedEncodedMessage&) = delete;
UnownedEncodedMessage(UnownedEncodedMessage&&) = delete;
UnownedEncodedMessage* operator=(const UnownedEncodedMessage&) = delete;
UnownedEncodedMessage* operator=(UnownedEncodedMessage&&) = delete;
zx_status_t status() const { return message_.status(); }
{{- IfdefFuchsia -}}
const char* status_string() const { return message_.status_string(); }
{{- EndifFuchsia -}}
bool ok() const { return message_.status() == ZX_OK; }
std::string FormatDescription() const { return message_.FormatDescription(); }
const char* lossy_description() const { return message_.lossy_description(); }
const ::fidl::Result& error() const { return message_.error(); }
::fidl::OutgoingMessage& GetOutgoingMessage() { return message_; }
{{- IfdefFuchsia -}}
template <typename ChannelLike>
void Write(ChannelLike&& client) { message_.Write(std::forward<ChannelLike>(client)); }
{{- EndifFuchsia -}}
private:
::fidl::internal::IovecBuffer iovecs_;
{{- if gt .Request.MaxHandles 0 }}
zx_handle_disposition_t handles_[std::min(ZX_CHANNEL_MAX_MSG_HANDLES, MaxNumHandles)];
{{- end }}
::fidl::OutgoingMessage message_;
};
class OwnedEncodedMessage final {
public:
explicit OwnedEncodedMessage({{- RenderParams "zx_txid_t _txid" .RequestArgs }})
: message_({{ RenderForwardParams "1u" "backing_buffer_.data()" "backing_buffer_.size()" "_txid" .RequestArgs }}) {}
// Internal constructor.
explicit OwnedEncodedMessage({{- RenderParams "::fidl::internal::AllowUnownedInputRef allow_unowned" "zx_txid_t _txid" .RequestArgs }})
: message_({{ RenderForwardParams "::fidl::internal::IovecBufferSize" "backing_buffer_.data()" "backing_buffer_.size()" "_txid" .RequestArgs }}) {}
explicit OwnedEncodedMessage({{ .WireRequest.Self }}* request)
: message_(1u, backing_buffer_.data(), backing_buffer_.size(), request) {}
// Internal constructor.
explicit OwnedEncodedMessage(::fidl::internal::AllowUnownedInputRef allow_unowned, {{ .WireRequest.Self }}* request)
: message_(::fidl::internal::IovecBufferSize, backing_buffer_.data(), backing_buffer_.size(), request) {}
OwnedEncodedMessage(const OwnedEncodedMessage&) = delete;
OwnedEncodedMessage(OwnedEncodedMessage&&) = delete;
OwnedEncodedMessage* operator=(const OwnedEncodedMessage&) = delete;
OwnedEncodedMessage* operator=(OwnedEncodedMessage&&) = delete;
zx_status_t status() const { return message_.status(); }
{{- IfdefFuchsia -}}
const char* status_string() const { return message_.status_string(); }
{{- EndifFuchsia -}}
bool ok() const { return message_.ok(); }
std::string FormatDescription() const { return message_.FormatDescription(); }
const char* lossy_description() const { return message_.lossy_description(); }
const ::fidl::Result& error() const { return message_.error(); }
::fidl::OutgoingMessage& GetOutgoingMessage() { return message_.GetOutgoingMessage(); }
{{- IfdefFuchsia -}}
template <typename ChannelLike>
void Write(ChannelLike&& client) { message_.Write(std::forward<ChannelLike>(client)); }
{{- EndifFuchsia -}}
private:
{{ .Request.ClientAllocation.BackingBufferType }} backing_buffer_;
UnownedEncodedMessage message_;
};
public:
class DecodedMessage final : public ::fidl::internal::DecodedMessageBase<{{ .WireRequest }}> {
public:
using DecodedMessageBase<{{ .WireRequest }}>::DecodedMessageBase;
DecodedMessage(uint8_t* bytes, uint32_t byte_actual, zx_handle_info_t* handles = nullptr,
uint32_t handle_actual = 0)
: DecodedMessageBase(
::fidl::IncomingMessage(bytes, byte_actual, handles, handle_actual)) {}
{{- if .Request.IsResource }}
~DecodedMessage() {
if (ok() && (PrimaryObject() != nullptr)) {
PrimaryObject()->_CloseHandles();
}
}
{{- end }}
{{ .WireRequest }}* PrimaryObject() {
ZX_DEBUG_ASSERT(ok());
return reinterpret_cast<{{ .WireRequest }}*>(bytes());
}
// Release the ownership of the decoded message. That means that the handles won't be closed
// When the object is destroyed.
// After calling this method, the |DecodedMessage| object should not be used anymore.
void ReleasePrimaryObject() { ResetBytes(); }
};
private:
void _InitHeader(zx_txid_t _txid);
};
{{- if .Request.IsResource }}
{{- EndifFuchsia -}}
{{- end }}
{{- end }}
{{- define "MethodRequestDefinition" }}
{{- EnsureNamespace "" }}
{{- if .Request.IsResource }}
{{- IfdefFuchsia -}}
{{- end }}
void {{ .WireRequest }}::_InitHeader(zx_txid_t _txid) {
fidl_init_txn_header(&_hdr, _txid, {{ .OrdinalName }});
}
{{ if .Request.IsResource }}
void {{ .WireRequest }}::_CloseHandles() {
{{- range .RequestArgs }}
{{- CloseHandles . false false }}
{{- end }}
}
{{- end }}
{{- if .Request.IsResource }}
{{- EndifFuchsia -}}
{{- end }}
{{- end }}
`