blob: da7a66c26caa2b7dd5325730bafa5177637228bf [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.
*/}}
{{- define "Protocol:Dispatcher:MessagingHeader" }}
{{- IfdefFuchsia }}
{{- EnsureNamespace "" }}
template<>
struct {{ .WireServerDispatcher }} final {
{{ .WireServerDispatcher.Self }}() = delete;
static ::fidl::DispatchResult TryDispatch({{ .WireServer }}* impl, ::fidl::IncomingMessage& msg,
::fidl::Transaction* txn);
static void Dispatch({{ .WireServer }}* impl, ::fidl::IncomingMessage&& msg,
::fidl::Transaction* txn);
private:
static const ::fidl::internal::MethodEntry entries_[];
static const ::fidl::internal::MethodEntry* entries_end_;
};
{{- EndifFuchsia }}
{{- end }}
{{- define "Protocol:Dispatcher:MessagingSource" }}
{{- IfdefFuchsia -}}
{{ EnsureNamespace "" }}
constexpr ::fidl::internal::MethodEntry {{ .WireServerDispatcher.NoLeading }}::entries_[] = {
{{- range .ClientMethods }}
{ {{ .OrdinalName }},
[](void* interface, ::fidl::IncomingMessage&& msg, ::fidl::Transaction* txn) {
{{- if .RequestArgs }}
::fidl::DecodedMessage<{{ .WireRequest }}> decoded{std::move(msg)};
if (unlikely(!decoded.ok())) {
return decoded.status();
}
auto* primary = decoded.PrimaryObject();
{{- else }}
auto* primary = reinterpret_cast<{{ .WireRequest }}*>(msg.bytes());
{{- end }}
{{ .WireCompleter }}::Sync completer(txn);
reinterpret_cast<{{ $.WireServer }}*>(interface)->{{ .Name }}(
primary, completer);
return ZX_OK;
},
},
{{- end }}
};
const ::fidl::internal::MethodEntry* {{ .WireServerDispatcher.NoLeading }}::entries_end_ =
&entries_[{{- len .ClientMethods -}}];
::fidl::DispatchResult {{ .WireServerDispatcher.NoLeading }}::TryDispatch(
{{ .WireServer }}* impl, ::fidl::IncomingMessage& msg, ::fidl::Transaction* txn) {
return ::fidl::internal::TryDispatch(impl, msg, txn, entries_, entries_end_);
}
{{ EnsureNamespace "" }}
void {{ .WireServerDispatcher.NoLeading }}::Dispatch(
{{- .WireServer }}* impl, ::fidl::IncomingMessage&& msg, ::fidl::Transaction* txn) {
::fidl::internal::Dispatch(impl, msg, txn, entries_, entries_end_);
}
{{- EnsureNamespace "" }}
void {{ .WireServer.NoLeading }}::dispatch_message(
::fidl::IncomingMessage&& msg, ::fidl::Transaction* txn,
const ::fidl::internal::IncomingTransportContext* transport_context) {
{{ .WireServerDispatcher }}::Dispatch(this, std::move(msg), txn);
}
{{- EndifFuchsia -}}
{{- end }}