blob: bdcae52b144927f9e8016fe3c2d3df4322606f61 [file] [log] [blame]
// 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