You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
1.9 KiB
70 lines
1.9 KiB
// Copyright 2019 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 "cast/common/channel/message_framer.h"
|
|
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include <limits>
|
|
|
|
#include "cast/common/channel/proto/cast_channel.pb.h"
|
|
#include "util/big_endian.h"
|
|
#include "util/osp_logging.h"
|
|
|
|
namespace openscreen {
|
|
namespace cast {
|
|
namespace message_serialization {
|
|
|
|
namespace {
|
|
|
|
static constexpr size_t kHeaderSize = sizeof(uint32_t);
|
|
|
|
// Cast specifies a max message body size of 64 KiB.
|
|
static constexpr size_t kMaxBodySize = 65536;
|
|
|
|
} // namespace
|
|
|
|
ErrorOr<std::vector<uint8_t>> Serialize(
|
|
const ::cast::channel::CastMessage& message) {
|
|
const size_t message_size = message.ByteSizeLong();
|
|
if (message_size > kMaxBodySize || message_size == 0) {
|
|
return Error::Code::kCastV2InvalidMessage;
|
|
}
|
|
std::vector<uint8_t> out(message_size + kHeaderSize, 0);
|
|
WriteBigEndian<uint32_t>(message_size, out.data());
|
|
if (!message.SerializeToArray(&out[kHeaderSize], message_size)) {
|
|
return Error::Code::kCastV2InvalidMessage;
|
|
}
|
|
return out;
|
|
}
|
|
|
|
ErrorOr<DeserializeResult> TryDeserialize(absl::Span<const uint8_t> input) {
|
|
if (input.size() < kHeaderSize) {
|
|
return Error::Code::kInsufficientBuffer;
|
|
}
|
|
|
|
const uint32_t message_size = ReadBigEndian<uint32_t>(input.data());
|
|
if (message_size > kMaxBodySize) {
|
|
return Error::Code::kCastV2InvalidMessage;
|
|
}
|
|
|
|
if (input.size() < (kHeaderSize + message_size)) {
|
|
return Error::Code::kInsufficientBuffer;
|
|
}
|
|
|
|
DeserializeResult result;
|
|
if (!result.message.ParseFromArray(input.data() + kHeaderSize,
|
|
message_size)) {
|
|
return Error::Code::kCastV2InvalidMessage;
|
|
}
|
|
result.length = kHeaderSize + message_size;
|
|
|
|
return result;
|
|
}
|
|
|
|
} // namespace message_serialization
|
|
} // namespace cast
|
|
} // namespace openscreen
|