mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
113 lines
2.1 KiB
C++
113 lines
2.1 KiB
C++
// Copyright 2013 The Flutter 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 "flutter/fml/message.h"
|
|
|
|
#include "flutter/fml/logging.h"
|
|
|
|
namespace fml {
|
|
|
|
size_t MessageSerializable::GetSerializableTag() const {
|
|
return 0;
|
|
};
|
|
|
|
Message::Message() = default;
|
|
|
|
Message::~Message() = default;
|
|
|
|
static uint32_t NextPowerOfTwoSize(uint32_t x) {
|
|
if (x == 0) {
|
|
return 1;
|
|
}
|
|
|
|
--x;
|
|
|
|
x |= x >> 1;
|
|
x |= x >> 2;
|
|
x |= x >> 4;
|
|
x |= x >> 8;
|
|
x |= x >> 16;
|
|
|
|
return x + 1;
|
|
}
|
|
|
|
const uint8_t* Message::GetBuffer() const {
|
|
return buffer_;
|
|
}
|
|
|
|
size_t Message::GetBufferSize() const {
|
|
return buffer_length_;
|
|
}
|
|
|
|
size_t Message::GetDataLength() const {
|
|
return data_length_;
|
|
}
|
|
|
|
size_t Message::GetSizeRead() const {
|
|
return size_read_;
|
|
}
|
|
|
|
bool Message::Reserve(size_t size) {
|
|
if (buffer_length_ >= size) {
|
|
return true;
|
|
}
|
|
return Resize(NextPowerOfTwoSize(size));
|
|
}
|
|
|
|
bool Message::Resize(size_t size) {
|
|
if (buffer_ == nullptr) {
|
|
// This is the initial resize where we have no previous buffer.
|
|
FML_DCHECK(buffer_length_ == 0);
|
|
|
|
void* buffer = ::malloc(size);
|
|
const bool success = buffer != nullptr;
|
|
|
|
if (success) {
|
|
buffer_ = static_cast<uint8_t*>(buffer);
|
|
buffer_length_ = size;
|
|
}
|
|
|
|
return success;
|
|
}
|
|
|
|
FML_DCHECK(size > buffer_length_);
|
|
|
|
void* resized = ::realloc(buffer_, size);
|
|
|
|
const bool success = resized != nullptr;
|
|
|
|
// In case of failure, the input buffer to realloc is still valid.
|
|
if (success) {
|
|
buffer_ = static_cast<uint8_t*>(resized);
|
|
buffer_length_ = size;
|
|
}
|
|
|
|
return success;
|
|
}
|
|
|
|
uint8_t* Message::PrepareEncode(size_t size) {
|
|
if (!Reserve(data_length_ + size)) {
|
|
return nullptr;
|
|
}
|
|
|
|
auto old_length = data_length_;
|
|
data_length_ += size;
|
|
return buffer_ + old_length;
|
|
}
|
|
|
|
uint8_t* Message::PrepareDecode(size_t size) {
|
|
if ((size + size_read_) > buffer_length_) {
|
|
return nullptr;
|
|
}
|
|
auto* buffer = buffer_ + size_read_;
|
|
size_read_ += size;
|
|
return buffer;
|
|
}
|
|
|
|
void Message::ResetRead() {
|
|
size_read_ = 0;
|
|
}
|
|
|
|
} // namespace fml
|