1e0e9324cSopenharmony_ci/* 2e0e9324cSopenharmony_ci * Copyright (c) 2023 Shenzhen Kaihong Digital Industry Development Co., Ltd. 3e0e9324cSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4e0e9324cSopenharmony_ci * you may not use this file except in compliance with the License. 5e0e9324cSopenharmony_ci * You may obtain a copy of the License at 6e0e9324cSopenharmony_ci * 7e0e9324cSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8e0e9324cSopenharmony_ci * 9e0e9324cSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10e0e9324cSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11e0e9324cSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12e0e9324cSopenharmony_ci * See the License for the specific language governing permissions and 13e0e9324cSopenharmony_ci * limitations under the License. 14e0e9324cSopenharmony_ci */ 15e0e9324cSopenharmony_ci 16e0e9324cSopenharmony_ci#include "data_buffer.h" 17e0e9324cSopenharmony_ci#include <cstring> 18e0e9324cSopenharmony_ci#include <unistd.h> 19e0e9324cSopenharmony_ci#include <securec.h> 20e0e9324cSopenharmony_ci 21e0e9324cSopenharmony_cinamespace OHOS { 22e0e9324cSopenharmony_cinamespace Sharing { 23e0e9324cSopenharmony_ci 24e0e9324cSopenharmony_ciDataBuffer::DataBuffer(int size) 25e0e9324cSopenharmony_ci{ 26e0e9324cSopenharmony_ci data_ = new uint8_t[size + 1]; 27e0e9324cSopenharmony_ci data_[size] = '\0'; 28e0e9324cSopenharmony_ci capacity_ = size; 29e0e9324cSopenharmony_ci size_ = 0; 30e0e9324cSopenharmony_ci} 31e0e9324cSopenharmony_ci 32e0e9324cSopenharmony_ciDataBuffer::DataBuffer(const DataBuffer &other) noexcept 33e0e9324cSopenharmony_ci{ 34e0e9324cSopenharmony_ci if (other.data_ && other.size_) { 35e0e9324cSopenharmony_ci capacity_ = other.size_; 36e0e9324cSopenharmony_ci data_ = new uint8_t[capacity_ + 1]; 37e0e9324cSopenharmony_ci memcpy_s(data_, capacity_ + 1, other.data_, other.size_); 38e0e9324cSopenharmony_ci size_ = other.size_; 39e0e9324cSopenharmony_ci } 40e0e9324cSopenharmony_ci} 41e0e9324cSopenharmony_ci 42e0e9324cSopenharmony_ciDataBuffer &DataBuffer::operator=(const DataBuffer &other) noexcept 43e0e9324cSopenharmony_ci{ 44e0e9324cSopenharmony_ci if (this != &other) { 45e0e9324cSopenharmony_ci if (other.data_ && other.size_) { 46e0e9324cSopenharmony_ci capacity_ = other.size_; 47e0e9324cSopenharmony_ci delete[] data_; 48e0e9324cSopenharmony_ci data_ = new uint8_t[capacity_ + 1]; 49e0e9324cSopenharmony_ci memcpy_s(data_, capacity_ + 1, other.data_, other.size_); 50e0e9324cSopenharmony_ci size_ = other.size_; 51e0e9324cSopenharmony_ci } 52e0e9324cSopenharmony_ci } 53e0e9324cSopenharmony_ci 54e0e9324cSopenharmony_ci return *this; 55e0e9324cSopenharmony_ci} 56e0e9324cSopenharmony_ci 57e0e9324cSopenharmony_ciDataBuffer::DataBuffer(DataBuffer &&other) noexcept 58e0e9324cSopenharmony_ci{ 59e0e9324cSopenharmony_ci data_ = other.data_; 60e0e9324cSopenharmony_ci size_ = other.size_; 61e0e9324cSopenharmony_ci capacity_ = other.capacity_; 62e0e9324cSopenharmony_ci other.data_ = nullptr; 63e0e9324cSopenharmony_ci other.size_ = 0; 64e0e9324cSopenharmony_ci other.capacity_ = 0; 65e0e9324cSopenharmony_ci} 66e0e9324cSopenharmony_ci 67e0e9324cSopenharmony_ciDataBuffer &DataBuffer::operator=(DataBuffer &&other) noexcept 68e0e9324cSopenharmony_ci{ 69e0e9324cSopenharmony_ci if (this != &other) { 70e0e9324cSopenharmony_ci if (data_) { 71e0e9324cSopenharmony_ci delete[] data_; 72e0e9324cSopenharmony_ci } 73e0e9324cSopenharmony_ci data_ = other.data_; 74e0e9324cSopenharmony_ci size_ = other.size_; 75e0e9324cSopenharmony_ci capacity_ = other.capacity_; 76e0e9324cSopenharmony_ci other.data_ = nullptr; 77e0e9324cSopenharmony_ci other.size_ = 0; 78e0e9324cSopenharmony_ci other.capacity_ = 0; 79e0e9324cSopenharmony_ci } 80e0e9324cSopenharmony_ci 81e0e9324cSopenharmony_ci return *this; 82e0e9324cSopenharmony_ci} 83e0e9324cSopenharmony_ci 84e0e9324cSopenharmony_ciDataBuffer::~DataBuffer() 85e0e9324cSopenharmony_ci{ 86e0e9324cSopenharmony_ci delete[] data_; 87e0e9324cSopenharmony_ci capacity_ = 0; 88e0e9324cSopenharmony_ci size_ = 0; 89e0e9324cSopenharmony_ci} 90e0e9324cSopenharmony_ci 91e0e9324cSopenharmony_civoid DataBuffer::Resize(int size) 92e0e9324cSopenharmony_ci{ 93e0e9324cSopenharmony_ci if (size > capacity_) { 94e0e9324cSopenharmony_ci capacity_ = size; 95e0e9324cSopenharmony_ci auto data2 = new uint8_t[capacity_]; 96e0e9324cSopenharmony_ci if (data_ && size_ > 0) { 97e0e9324cSopenharmony_ci auto ret = memcpy_s(data2, capacity_, data_, size_); 98e0e9324cSopenharmony_ci if (ret != EOK) { 99e0e9324cSopenharmony_ci return; 100e0e9324cSopenharmony_ci } 101e0e9324cSopenharmony_ci delete[] data_; 102e0e9324cSopenharmony_ci } 103e0e9324cSopenharmony_ci data_ = data2; 104e0e9324cSopenharmony_ci } else if (size < capacity_) { 105e0e9324cSopenharmony_ci if (data_) { 106e0e9324cSopenharmony_ci delete[] data_; 107e0e9324cSopenharmony_ci } 108e0e9324cSopenharmony_ci capacity_ = size; 109e0e9324cSopenharmony_ci data_ = new uint8_t[capacity_]; 110e0e9324cSopenharmony_ci size_ = 0; 111e0e9324cSopenharmony_ci } 112e0e9324cSopenharmony_ci} 113e0e9324cSopenharmony_ci 114e0e9324cSopenharmony_civoid DataBuffer::PushData(const char *data, int dataLen) 115e0e9324cSopenharmony_ci{ 116e0e9324cSopenharmony_ci if (!data) { 117e0e9324cSopenharmony_ci return; 118e0e9324cSopenharmony_ci } 119e0e9324cSopenharmony_ci 120e0e9324cSopenharmony_ci if (dataLen + size_ <= capacity_) { 121e0e9324cSopenharmony_ci auto ret = memcpy_s(data_ + size_, capacity_, data, dataLen); 122e0e9324cSopenharmony_ci if (ret != EOK) { 123e0e9324cSopenharmony_ci return; 124e0e9324cSopenharmony_ci } 125e0e9324cSopenharmony_ci size_ += dataLen; 126e0e9324cSopenharmony_ci } else { 127e0e9324cSopenharmony_ci capacity_ = size_ + dataLen; 128e0e9324cSopenharmony_ci auto newBuffer = new (std::nothrow) uint8_t[capacity_]; 129e0e9324cSopenharmony_ci if (!newBuffer) { 130e0e9324cSopenharmony_ci return; 131e0e9324cSopenharmony_ci } 132e0e9324cSopenharmony_ci if (data_) { 133e0e9324cSopenharmony_ci auto ret = memcpy_s(newBuffer, capacity_, data_, size_); 134e0e9324cSopenharmony_ci if (ret != EOK) { 135e0e9324cSopenharmony_ci return; 136e0e9324cSopenharmony_ci } 137e0e9324cSopenharmony_ci } 138e0e9324cSopenharmony_ci auto ret = memcpy_s(newBuffer + size_, capacity_, data, dataLen); 139e0e9324cSopenharmony_ci if (ret != EOK) { 140e0e9324cSopenharmony_ci return; 141e0e9324cSopenharmony_ci } 142e0e9324cSopenharmony_ci delete[] data_; 143e0e9324cSopenharmony_ci data_ = newBuffer; 144e0e9324cSopenharmony_ci size_ = capacity_; 145e0e9324cSopenharmony_ci } 146e0e9324cSopenharmony_ci} 147e0e9324cSopenharmony_ci 148e0e9324cSopenharmony_civoid DataBuffer::ReplaceData(const char *data, int dataLen) 149e0e9324cSopenharmony_ci{ 150e0e9324cSopenharmony_ci if (!data) { 151e0e9324cSopenharmony_ci return; 152e0e9324cSopenharmony_ci } 153e0e9324cSopenharmony_ci 154e0e9324cSopenharmony_ci if (dataLen > capacity_) { 155e0e9324cSopenharmony_ci if (data_) 156e0e9324cSopenharmony_ci delete[] data_; 157e0e9324cSopenharmony_ci capacity_ = dataLen; 158e0e9324cSopenharmony_ci data_ = new uint8_t[capacity_]; 159e0e9324cSopenharmony_ci } 160e0e9324cSopenharmony_ci 161e0e9324cSopenharmony_ci auto ret = memcpy_s(data_, capacity_, data, dataLen); 162e0e9324cSopenharmony_ci if (ret != EOK) { 163e0e9324cSopenharmony_ci return; 164e0e9324cSopenharmony_ci } 165e0e9324cSopenharmony_ci size_ = dataLen; 166e0e9324cSopenharmony_ci} 167e0e9324cSopenharmony_ci 168e0e9324cSopenharmony_civoid DataBuffer::SetCapacity(int capacity) 169e0e9324cSopenharmony_ci{ 170e0e9324cSopenharmony_ci if (data_) { 171e0e9324cSopenharmony_ci delete[] data_; 172e0e9324cSopenharmony_ci } 173e0e9324cSopenharmony_ci 174e0e9324cSopenharmony_ci if (capacity == 0) { 175e0e9324cSopenharmony_ci return; 176e0e9324cSopenharmony_ci } 177e0e9324cSopenharmony_ci if (capacity > 0) { 178e0e9324cSopenharmony_ci data_ = new uint8_t[capacity]; 179e0e9324cSopenharmony_ci } 180e0e9324cSopenharmony_ci capacity_ = capacity; 181e0e9324cSopenharmony_ci} 182e0e9324cSopenharmony_ci 183e0e9324cSopenharmony_ci} // namespace Sharing 184e0e9324cSopenharmony_ci} // namespace OHOS