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