blob: c4e0f21770828d062a336500d34bc5d50dc50f5f [file] [log] [blame]
{{/*
// 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.
*/}}
{{- define "Method:Result:WireMessagingHeader" }}
{{- EnsureNamespace "" }}
{{ if .WireResultUnwrapType -}}
template<>
struct {{ .WireResultUnwrap }} {
using Type = {{ .WireResultUnwrapType }};
};
{{- end }}
template<>
class [[nodiscard]] {{ .WireResult }} final : public {{ .BaseWireResult }} {
public:
{{ .WireResult.Self }}(
{{ .Protocol.UnownedClientEnd }} client,
{{ .WireTransactionalRequest }}* request
);
explicit {{ .WireResult.Self }}(const ::fidl::Status& result) : {{ .BaseWireResult }}(result) {}
{{ .WireResult.Self }}({{ .WireResult.Self }}&&) = delete;
{{ .WireResult.Self }}(const {{ .WireResult.Self }}&) = delete;
{{ .WireResult.Self }}& operator=({{ .WireResult.Self }}&&) = delete;
{{ .WireResult.Self }}& operator=(const {{ .WireResult.Self }}&) = delete;
~{{ .WireResult.Self }}() = default;
{{- if .HasResponse }}
private:
{{ .Response.ClientAllocationV1.BackingBufferType }} bytes_;
{{- if .HasResponsePayload }}
::fidl::DecodedValue<{{ .WireResponse }}> decoded_;
{{- end }}
{{- end }}
};
{{- end }}
{{- define "Method:Result:WireMessagingSource" }}
{{- IfdefFuchsia -}}
{{- EnsureNamespace "" }}
{{ .WireResult }}::{{ .WireResult.Self }}(
{{ .Protocol.UnownedClientEnd }} client,
{{ .WireTransactionalRequest }}* request
) {
FIDL_INTERNAL_DISABLE_AUTO_VAR_INIT
::fidl::internal::OwnedEncodedMessage<{{ .WireTransactionalRequest }}, {{ .Transport.Type }}> request_message(
::fidl::internal::AllowUnownedInputRef{}, request);
auto& outgoing = request_message.GetOutgoingMessage();
{{- if .HasResponse }}
{{ .IncomingMessageHandleStorageForResponse }} handle_storage;
::fit::result decoded = ::fidl::internal::InplaceDecodeTransactionalResponse<{{ .Marker }}>(
outgoing.Call(client.handle(), handle_storage.view(bytes_.view()), fidl::CallOptions{})
);
SetStatus(::fidl::internal::StatusFromResult(decoded));
{{- if .HasResponsePayload }}
if (ok()) {
decoded_ = std::move(decoded.value());
ExtractValueFromDecoded(decoded_.pointer());
}
{{- end }}
{{- else }}
outgoing.Write(client.handle());
SetStatus(outgoing);
{{- end }}
}
{{- EndifFuchsia -}}
{{- end }}