| {{/* |
| // 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:WireMessagingHeader" }} |
| {{- EnsureNamespace "" }} |
| template<> |
| struct {{ .WireServerDispatcher }} final { |
| {{ .WireServerDispatcher.Self }}() = delete; |
| static ::fidl::DispatchResult TryDispatch({{ .WireServer }}* impl, ::fidl::IncomingHeaderAndMessage& msg, |
| internal::MessageStorageViewBase* storage_view, |
| ::fidl::Transaction* txn); |
| static void Dispatch({{ .WireServer }}* impl, ::fidl::IncomingHeaderAndMessage&& msg, |
| internal::MessageStorageViewBase* storage_view, |
| ::fidl::Transaction* txn); |
| |
| private: |
| static const ::fidl::internal::MethodEntry entries_[]; |
| static const ::fidl::internal::MethodEntry* entries_end_; |
| {{- if .HandlesOneWayUnknownInteractions }} |
| static const ::fidl::internal::UnknownMethodHandlerEntry unknown_method_handler_entry_; |
| {{- else }} |
| static constexpr const ::fidl::internal::UnknownMethodHandlerEntry& unknown_method_handler_entry_ = |
| ::fidl::internal::UnknownMethodHandlerEntry::kClosedProtocolHandlerEntry; |
| {{- end }} |
| }; |
| {{- end }} |
| |
| |
| |
| {{- define "Protocol:Dispatcher:WireMessagingSource" }} |
| {{ EnsureNamespace "" }} |
| |
| constexpr ::fidl::internal::MethodEntry {{ .WireServerDispatcher.NoLeading }}::entries_[] = { |
| {{- range .ClientMethods }} |
| { {{ .OrdinalName }}, |
| [](void* interface, ::fidl::EncodedMessage& msg, ::fidl::WireFormatMetadata metadata, |
| internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) { |
| {{- if eq .Transport.Name "Driver" }} |
| {{/* |arena| needs to be declared before |decoded| so that |decoded| is destructed first. |
| This is for the case where handles used in |decoded| are stored in |arena|. */}} |
| fdf::Arena arena(::fidl::internal::TakeDriverArenaFromStorage(storage_view)); |
| {{- end }} |
| {{- if .HasRequestPayload }} |
| ::fit::result decoded = ::fidl::StandaloneInplaceDecode<{{ .RequestPayload }}>( |
| std::move(msg), metadata); |
| {{- else }} |
| ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessageWithoutBody( |
| msg, metadata); |
| {{- end }} |
| if (unlikely(!decoded.is_ok())) { |
| return decoded.error_value(); |
| } |
| {{ .WireCompleter }}::Sync completer(txn); |
| reinterpret_cast<{{ $.WireServer }}*>(interface)->{{ .Name }}( |
| {{- if .HasRequestPayload }} |
| decoded.value().pointer(), |
| {{- end }} |
| {{- if eq .Transport.Name "Driver" }} |
| arena, |
| {{- end }} |
| completer |
| ); |
| return ::fidl::Status::Ok(); |
| }, |
| }, |
| {{- end }} |
| }; |
| |
| const ::fidl::internal::MethodEntry* {{ .WireServerDispatcher.NoLeading }}::entries_end_ = |
| &entries_[{{- len .ClientMethods -}}]; |
| |
| {{- if .HandlesOneWayUnknownInteractions }} |
| const ::fidl::internal::UnknownMethodHandlerEntry {{ .WireServerDispatcher.NoLeading }}::unknown_method_handler_entry_ = { |
| .openness = {{ .OpennessValue }}, |
| .dispatch = [](void* interface, uint64_t method_ordinal, |
| ::fidl::UnknownMethodType unknown_method_type, ::fidl::Transaction* txn) { |
| ::fidl::UnknownMethodCompleter::Sync completer(txn); |
| static_cast<{{ .WireServer }}*>(interface)->handle_unknown_method( |
| {{ .UnknownMethodMetadata }} { |
| .method_ordinal = method_ordinal, |
| {{ if .HandlesTwoWayUnknownInteractions }} |
| .unknown_method_type = unknown_method_type, |
| {{ end }} |
| }, completer); |
| }, |
| .send_reply = {{ .UnknownMethodReplySender }}, |
| }; |
| {{ end }} |
| |
| ::fidl::DispatchResult {{ .WireServerDispatcher.NoLeading }}::TryDispatch( |
| {{ .WireServer }}* impl, ::fidl::IncomingHeaderAndMessage& msg, |
| internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) { |
| return ::fidl::internal::TryDispatch( |
| impl, msg, storage_view, txn, entries_, entries_end_); |
| } |
| |
| {{ EnsureNamespace "" }} |
| void {{ .WireServerDispatcher.NoLeading }}::Dispatch( |
| {{- .WireServer }}* impl, ::fidl::IncomingHeaderAndMessage&& msg, |
| internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) { |
| ::fidl::internal::Dispatch(impl, msg, storage_view, txn, entries_, entries_end_, |
| &unknown_method_handler_entry_); |
| } |
| |
| {{- EnsureNamespace "" }} |
| |
| void {{ .WireServer.NoLeading }}::dispatch_message( |
| ::fidl::IncomingHeaderAndMessage&& msg, ::fidl::Transaction* txn, |
| ::fidl::internal::MessageStorageViewBase* storage_view) { |
| {{ .WireServerDispatcher }}::Dispatch(this, std::move(msg), storage_view, txn); |
| } |
| |
| {{ .WireServer.NoLeading }}::Handler {{ .WireServer.NoLeading }}::bind_handler({{ .Dispatcher }}* dispatcher) { |
| return [impl=this, dispatcher=dispatcher]({{ .ServerEnd }} request) { |
| (void) {{ .BindServer }}(dispatcher, std::move(request), impl); |
| }; |
| } |
| |
| {{- end }} |
| |
| |
| |
| {{- define "Protocol:Dispatcher:NaturalMessagingHeader" }} |
| {{- EnsureNamespace "" }} |
| template<> |
| struct {{ .NaturalServerDispatcher }} final { |
| {{ .NaturalServerDispatcher.Self }}() = delete; |
| static void Dispatch({{ .NaturalServer }}* impl, ::fidl::IncomingHeaderAndMessage&& msg, |
| internal::MessageStorageViewBase* storage_view, |
| ::fidl::Transaction* txn); |
| |
| private: |
| static const ::fidl::internal::MethodEntry entries_[]; |
| static const ::fidl::internal::MethodEntry* entries_end_; |
| {{- if .HandlesOneWayUnknownInteractions }} |
| static const ::fidl::internal::UnknownMethodHandlerEntry unknown_method_handler_entry_; |
| {{- else }} |
| static constexpr const ::fidl::internal::UnknownMethodHandlerEntry& unknown_method_handler_entry_ = |
| ::fidl::internal::UnknownMethodHandlerEntry::kClosedProtocolHandlerEntry; |
| {{- end }} |
| |
| }; |
| {{- end }} |
| |
| |
| |
| {{- define "Protocol:Dispatcher:NaturalMessagingSource" }} |
| {{ EnsureNamespace "" }} |
| |
| constexpr ::fidl::internal::MethodEntry {{ .NaturalServerDispatcher.NoLeading }}::entries_[] = { |
| {{- range .ClientMethods }} |
| { {{ .OrdinalName }}, |
| [](void* interface, ::fidl::EncodedMessage& msg, ::fidl::WireFormatMetadata metadata, |
| internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) { |
| {{- if .HasRequestPayload }} |
| ::fit::result decoded = ::fidl::StandaloneDecode<{{ .RequestPayload }}>( |
| std::move(msg), metadata); |
| {{- else }} |
| ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessageWithoutBody( |
| msg, metadata); |
| {{- end }} |
| if (decoded.is_error()) { |
| return decoded.error_value(); |
| } |
| {{ .NaturalCompleter }}::Sync completer(txn); |
| static_cast<{{ $.NaturalServer }}*>(interface)->{{ .Name }}( |
| {{ if .HasRequestPayload }}decoded.value(),{{ end }} |
| completer); |
| return ::fidl::Status::Ok(); |
| }, |
| }, |
| {{- end }} |
| }; |
| |
| const ::fidl::internal::MethodEntry* {{ .NaturalServerDispatcher.NoLeading }}::entries_end_ = |
| &entries_[{{- len .ClientMethods -}}]; |
| |
| {{- if .HandlesOneWayUnknownInteractions }} |
| const ::fidl::internal::UnknownMethodHandlerEntry {{ .NaturalServerDispatcher.NoLeading }}::unknown_method_handler_entry_ = { |
| .openness = {{ .OpennessValue }}, |
| .dispatch = [](void* interface, uint64_t method_ordinal, |
| ::fidl::UnknownMethodType unknown_method_type, ::fidl::Transaction* txn) { |
| ::fidl::UnknownMethodCompleter::Sync completer(txn); |
| static_cast<{{ .NaturalServer }}*>(interface)->handle_unknown_method( |
| {{ .UnknownMethodMetadata }} { |
| .method_ordinal = method_ordinal, |
| {{ if .HandlesTwoWayUnknownInteractions }} |
| .unknown_method_type = unknown_method_type, |
| {{ end }} |
| }, completer); |
| }, |
| .send_reply = {{ .UnknownMethodReplySender }}, |
| }; |
| {{ end }} |
| |
| {{ EnsureNamespace "" }} |
| void {{ .NaturalServerDispatcher.NoLeading }}::Dispatch( |
| {{- .NaturalServer }}* impl, ::fidl::IncomingHeaderAndMessage&& msg, |
| internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) { |
| ::fidl::internal::Dispatch(impl, msg, storage_view, txn, entries_, entries_end_, &unknown_method_handler_entry_); |
| } |
| |
| {{- EnsureNamespace "" }} |
| void {{ .NaturalServer.NoLeading }}::dispatch_message( |
| ::fidl::IncomingHeaderAndMessage&& msg, ::fidl::Transaction* txn, |
| ::fidl::internal::MessageStorageViewBase* storage_view) { |
| {{ .NaturalServerDispatcher }}::Dispatch(this, std::move(msg), storage_view, txn); |
| } |
| |
| {{- end }} |