| // Copyright 2022 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. |
| |
| #include <lib/fidl/cpp/wire/wire_messaging.h> |
| |
| namespace fidl::internal { |
| |
| namespace { |
| |
| // Verifies that |body| has zero bytes and no handles. |
| ::fit::result<::fidl::Error> VerifyBodyIsAbsent(const ::fidl::EncodedMessage& body) { |
| if (unlikely(!body.bytes().empty())) { |
| return ::fit::error( |
| ::fidl::Status::DecodeError(ZX_ERR_INVALID_ARGS, kCodingErrorNotAllBytesConsumed)); |
| } |
| if (unlikely(body.num_handles() > 0)) { |
| return ::fit::error( |
| ::fidl::Status::DecodeError(ZX_ERR_INVALID_ARGS, kCodingErrorNotAllHandlesConsumed)); |
| } |
| return ::fit::ok(); |
| } |
| |
| } // namespace |
| |
| ::fit::result<::fidl::Error> DecodeTransactionalMessageWithoutBody( |
| ::fidl::IncomingHeaderAndMessage message) { |
| if (!message.ok()) { |
| return ::fit::error(message.error()); |
| } |
| const fidl_message_header& header = *message.header(); |
| auto metadata = ::fidl::WireFormatMetadata::FromTransactionalHeader(header); |
| fidl::EncodedMessage body_message = std::move(message).SkipTransactionHeader(); |
| return DecodeTransactionalMessageWithoutBody(body_message, metadata); |
| } |
| |
| ::fit::result<::fidl::Error> DecodeTransactionalMessageWithoutBody( |
| const ::fidl::EncodedMessage& message, ::fidl::WireFormatMetadata metadata) { |
| if (fidl::Status status = EnsureSupportedWireFormat(metadata); !status.ok()) { |
| return fit::error(status); |
| } |
| return VerifyBodyIsAbsent(message); |
| } |
| |
| } // namespace fidl::internal |