blob: bd46e200d3a0f71bb413bb847e3a2885e89c0576 [file] [log] [blame]
// Copyright 2017 The Chromium 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 "mojo/public/cpp/bindings/lib/message_internal.h"
#include "mojo/public/cpp/bindings/lib/array_internal.h"
#include "mojo/public/cpp/bindings/lib/control_message_handler.h"
#include "mojo/public/cpp/bindings/message.h"
namespace mojo {
namespace internal {
namespace {
size_t ComputeHeaderSize(uint32_t flags, size_t payload_interface_id_count) {
if (payload_interface_id_count > 0) {
// Version 2
return sizeof(MessageHeaderV2);
} else if (flags &
(Message::kFlagExpectsResponse | Message::kFlagIsResponse)) {
// Version 1
return sizeof(MessageHeaderV1);
} else {
// Version 0
return sizeof(MessageHeader);
}
}
} // namespace
size_t ComputeSerializedMessageSize(uint32_t flags,
size_t payload_size,
size_t payload_interface_id_count) {
const size_t header_size =
ComputeHeaderSize(flags, payload_interface_id_count);
if (payload_interface_id_count > 0) {
return Align(header_size + Align(payload_size) +
ArrayDataTraits<uint32_t>::GetStorageSize(
static_cast<uint32_t>(payload_interface_id_count)));
}
return internal::Align(header_size + payload_size);
}
bool IsUnserializedOrControlMessage(Message* message) {
return !message->is_serialized() ||
ControlMessageHandler::IsControlMessage(message);
}
} // namespace internal
} // namespace mojo