blob: a1d1b611f5ac81c2eaa02ef85d2120d03a7fc613 [file] [log] [blame]
// Copyright 2019 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 fragments
const SyncRequestCFlavor = `
{{- define "Params" -}}
{{- range $index, $param := . -}}
{{- if $index }}, {{ end -}}{{ $param.Type.LLDecl }} {{ $param.Name }}
{{- end -}}
{{- end }}
{{- define "OutParams" -}}
{{- range $index, $param := . -}}
{{- if $index }}, {{ end -}}{{ $param.Type.LLDecl }}* out_{{ $param.Name }}
{{- end -}}
{{- end }}
{{- define "SyncRequestCFlavorMethodSignature" -}}
{{- if .Response -}}
{{ .Name }}({{ template "Params" .Request }}{{ if .Request }}, {{ end }}{{ template "OutParams" .Response }})
{{- else -}}
{{ .Name }}({{ template "Params" .Request }})
{{- end -}}
{{- end }}
{{- define "SyncRequestCFlavorMethodDefinition" }}
zx_status_t {{ .LLProps.InterfaceName }}::SyncClient::{{ template "SyncRequestCFlavorMethodSignature" . }} {
constexpr uint32_t _kWriteAllocSize = ::fidl::internal::ClampedMessageSize<{{ .Name }}Request>();
{{- if .LLProps.StackAllocRequest }}
FIDL_ALIGNDECL uint8_t _write_bytes[_kWriteAllocSize] {{- if not .LLProps.NeedToLinearize }} = {} {{- end }};
{{- else }}
std::unique_ptr<uint8_t[]> _write_bytes_unique_ptr(new uint8_t[_kWriteAllocSize]);
uint8_t* _write_bytes = _write_bytes_unique_ptr.get();
{{- end }}
{{- if .LLProps.NeedToLinearize }}
{{ .Name }}Request _request = {};
{{- else }}
auto& _request = *reinterpret_cast<{{ .Name }}Request*>(_write_bytes);
{{- end }}
_request._hdr.ordinal = {{ .OrdinalName }};
{{- template "FillRequestStructMembers" .Request -}}
{{- if .LLProps.NeedToLinearize }}
auto _linearize_result = ::fidl::Linearize(&_request, ::fidl::BytePart(_write_bytes,
_kWriteAllocSize));
if (_linearize_result.status != ZX_OK) {
return _linearize_result.status;
}
::fidl::DecodedMessage<{{ .Name }}Request> _decoded_request = std::move(_linearize_result.message);
{{- else }}
::fidl::BytePart _request_bytes(_write_bytes, _kWriteAllocSize, sizeof({{ .Name }}Request));
::fidl::DecodedMessage<{{ .Name }}Request> _decoded_request(std::move(_request_bytes));
{{- end }}
auto _encode_request_result = ::fidl::Encode(std::move(_decoded_request));
if (_encode_request_result.status != ZX_OK) {
return _encode_request_result.status;
}
{{- if .HasResponse }}
constexpr uint32_t _kReadAllocSize = ::fidl::internal::ClampedMessageSize<{{ .Name }}Response>();
{{- if .LLProps.StackAllocResponse }}
FIDL_ALIGNDECL uint8_t _read_bytes[_kReadAllocSize];
{{- else }}
std::unique_ptr<uint8_t[]> _read_bytes_unique_ptr(new uint8_t[_kReadAllocSize]);
uint8_t* _read_bytes = _read_bytes_unique_ptr.get();
{{- end }}
::fidl::BytePart _response_bytes(_read_bytes, _kReadAllocSize);
auto _call_result = ::fidl::Call<{{ .Name }}Request, {{ .Name }}Response>(
this->channel_, std::move(_encode_request_result.message), std::move(_response_bytes));
if (_call_result.status != ZX_OK) {
return _call_result.status;
}
auto _decode_result = ::fidl::Decode(std::move(_call_result.message));
if (_decode_result.status != ZX_OK) {
return _decode_result.status;
}
{{- if .Response }}
auto& _response = *_decode_result.message.message();
{{- end }}
{{- template "ReturnResponseStructMembers" .Response }}
return ZX_OK;
{{- else }}
const auto& _oneway = _encode_request_result.message;
return this->channel_.write(0,
_oneway.bytes().data(), _oneway.bytes().actual(),
_oneway.handles().data(), _oneway.handles().actual());
{{- end }}
}
{{- end }}
`