166f3657fSopenharmony_ci/*
266f3657fSopenharmony_ci * Copyright (c) 2022-2024 Huawei Device Co., Ltd.
366f3657fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
466f3657fSopenharmony_ci * you may not use this file except in compliance with the License.
566f3657fSopenharmony_ci * You may obtain a copy of the License at
666f3657fSopenharmony_ci *
766f3657fSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
866f3657fSopenharmony_ci *
966f3657fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1066f3657fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1166f3657fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1266f3657fSopenharmony_ci * See the License for the specific language governing permissions and
1366f3657fSopenharmony_ci * limitations under the License.
1466f3657fSopenharmony_ci */
1566f3657fSopenharmony_ci
1666f3657fSopenharmony_ci#include "data_buffer.h"
1766f3657fSopenharmony_ci
1866f3657fSopenharmony_ci#include "dscreen_errcode.h"
1966f3657fSopenharmony_ci#include "dscreen_log.h"
2066f3657fSopenharmony_ci#include <new>
2166f3657fSopenharmony_ci#include <securec.h>
2266f3657fSopenharmony_ci
2366f3657fSopenharmony_cinamespace OHOS {
2466f3657fSopenharmony_cinamespace DistributedHardware {
2566f3657fSopenharmony_ciDataBuffer::DataBuffer(size_t capacity)
2666f3657fSopenharmony_ci{
2766f3657fSopenharmony_ci    if (capacity != 0) {
2866f3657fSopenharmony_ci        data_ = new (std::nothrow) uint8_t[capacity] {0};
2966f3657fSopenharmony_ci        if (data_ != nullptr) {
3066f3657fSopenharmony_ci            capacity_ = capacity;
3166f3657fSopenharmony_ci        }
3266f3657fSopenharmony_ci    }
3366f3657fSopenharmony_ci    dataType_ = 0;
3466f3657fSopenharmony_ci}
3566f3657fSopenharmony_ci
3666f3657fSopenharmony_ciDataBuffer::~DataBuffer()
3766f3657fSopenharmony_ci{
3866f3657fSopenharmony_ci    if (data_ != nullptr) {
3966f3657fSopenharmony_ci        delete [] data_;
4066f3657fSopenharmony_ci        data_ = nullptr;
4166f3657fSopenharmony_ci    }
4266f3657fSopenharmony_ci    dirtyRectVec_.clear();
4366f3657fSopenharmony_ci    dataType_ = 0;
4466f3657fSopenharmony_ci    frameNumber_ = 0;
4566f3657fSopenharmony_ci    capacity_ = 0;
4666f3657fSopenharmony_ci}
4766f3657fSopenharmony_ci
4866f3657fSopenharmony_cisize_t DataBuffer::Capacity() const
4966f3657fSopenharmony_ci{
5066f3657fSopenharmony_ci    return capacity_;
5166f3657fSopenharmony_ci}
5266f3657fSopenharmony_ci
5366f3657fSopenharmony_ciuint8_t *DataBuffer::Data() const
5466f3657fSopenharmony_ci{
5566f3657fSopenharmony_ci    return data_;
5666f3657fSopenharmony_ci}
5766f3657fSopenharmony_ci
5866f3657fSopenharmony_civoid DataBuffer::SetSize(size_t size)
5966f3657fSopenharmony_ci{
6066f3657fSopenharmony_ci    capacity_ = size;
6166f3657fSopenharmony_ci}
6266f3657fSopenharmony_ci
6366f3657fSopenharmony_civoid DataBuffer::SetDataType(uint8_t dataType)
6466f3657fSopenharmony_ci{
6566f3657fSopenharmony_ci    dataType_ = dataType;
6666f3657fSopenharmony_ci}
6766f3657fSopenharmony_ci
6866f3657fSopenharmony_ciuint8_t DataBuffer::DataType()
6966f3657fSopenharmony_ci{
7066f3657fSopenharmony_ci    return dataType_;
7166f3657fSopenharmony_ci}
7266f3657fSopenharmony_ci
7366f3657fSopenharmony_civoid DataBuffer::SetDataNumber(size_t number)
7466f3657fSopenharmony_ci{
7566f3657fSopenharmony_ci    frameNumber_ = number;
7666f3657fSopenharmony_ci}
7766f3657fSopenharmony_ci
7866f3657fSopenharmony_cisize_t DataBuffer::DataNumber()
7966f3657fSopenharmony_ci{
8066f3657fSopenharmony_ci    return frameNumber_;
8166f3657fSopenharmony_ci}
8266f3657fSopenharmony_ci
8366f3657fSopenharmony_civoid DataBuffer::ResetCapcity(size_t capacity)
8466f3657fSopenharmony_ci{
8566f3657fSopenharmony_ci    DHLOGI("%{public}s: ResetCapcity.", DSCREEN_LOG_TAG);
8666f3657fSopenharmony_ci    if (capacity < capacity_) {
8766f3657fSopenharmony_ci        return;
8866f3657fSopenharmony_ci    }
8966f3657fSopenharmony_ci    delete [] data_;
9066f3657fSopenharmony_ci    data_ = new (std::nothrow) uint8_t[capacity] {0};
9166f3657fSopenharmony_ci    if (data_ == nullptr) {
9266f3657fSopenharmony_ci        capacity_ = 0;
9366f3657fSopenharmony_ci    } else {
9466f3657fSopenharmony_ci        capacity_ = capacity;
9566f3657fSopenharmony_ci    }
9666f3657fSopenharmony_ci}
9766f3657fSopenharmony_ci
9866f3657fSopenharmony_civoid DataBuffer::AddData(size_t dataSize, unsigned char* &inputData)
9966f3657fSopenharmony_ci{
10066f3657fSopenharmony_ci    if (inputData == nullptr) {
10166f3657fSopenharmony_ci        return;
10266f3657fSopenharmony_ci    }
10366f3657fSopenharmony_ci    int32_t ret = memcpy_s(data_ + capacity_, dataSize, inputData, dataSize);
10466f3657fSopenharmony_ci    if (ret != EOK) {
10566f3657fSopenharmony_ci        DHLOGE("%{public}s: in AddData memcpy data failed, ret: %{public}" PRId32, DSCREEN_LOG_TAG, ret);
10666f3657fSopenharmony_ci        return;
10766f3657fSopenharmony_ci    }
10866f3657fSopenharmony_ci    capacity_ += dataSize;
10966f3657fSopenharmony_ci}
11066f3657fSopenharmony_ci
11166f3657fSopenharmony_civoid DataBuffer::AddDirtyRect(DirtyRect rect)
11266f3657fSopenharmony_ci{
11366f3657fSopenharmony_ci    dirtyRectVec_.push_back(rect);
11466f3657fSopenharmony_ci}
11566f3657fSopenharmony_ci
11666f3657fSopenharmony_cistd::vector<DirtyRect> DataBuffer::GetDirtyRectVec()
11766f3657fSopenharmony_ci{
11866f3657fSopenharmony_ci    return dirtyRectVec_;
11966f3657fSopenharmony_ci}
12066f3657fSopenharmony_ci
12166f3657fSopenharmony_ciint32_t DataBuffer::GetData(int32_t offset, int32_t datasize, uint8_t* &output)
12266f3657fSopenharmony_ci{
12366f3657fSopenharmony_ci    if (static_cast<unsigned long>(offset + datasize) > capacity_ || output == nullptr) {
12466f3657fSopenharmony_ci        DHLOGE("DataBuffer GetData parameter invalid.");
12566f3657fSopenharmony_ci        return ERR_DH_SCREEN_INPUT_PARAM_INVALID;
12666f3657fSopenharmony_ci    }
12766f3657fSopenharmony_ci    int32_t ret = memcpy_s(output, datasize, data_ + offset, datasize);
12866f3657fSopenharmony_ci    if (ret != EOK) {
12966f3657fSopenharmony_ci        DHLOGE("GetData memcpy data failed, ret: %{public}" PRId32, ret);
13066f3657fSopenharmony_ci        return ret;
13166f3657fSopenharmony_ci    }
13266f3657fSopenharmony_ci    return DH_SUCCESS;
13366f3657fSopenharmony_ci}
13466f3657fSopenharmony_ci} // namespace DistributedHardware
13566f3657fSopenharmony_ci} // namespace OHOS