195489c19Sopenharmony_ci/*
295489c19Sopenharmony_ci * Copyright (C) 2021-2022 Huawei Device Co., Ltd.
395489c19Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
495489c19Sopenharmony_ci * you may not use this file except in compliance with the License.
595489c19Sopenharmony_ci * You may obtain a copy of the License at
695489c19Sopenharmony_ci *
795489c19Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
895489c19Sopenharmony_ci *
995489c19Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1095489c19Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1195489c19Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1295489c19Sopenharmony_ci * See the License for the specific language governing permissions and
1395489c19Sopenharmony_ci * limitations under the License.
1495489c19Sopenharmony_ci */
1595489c19Sopenharmony_ci#include "securec.h"
1695489c19Sopenharmony_ci#include "bluetooth_gatt_characteristic.h"
1795489c19Sopenharmony_ci#include "bluetooth_gatt_descriptor.h"
1895489c19Sopenharmony_ci#include "bluetooth_log.h"
1995489c19Sopenharmony_ci#include "type_traits"
2095489c19Sopenharmony_ci
2195489c19Sopenharmony_cinamespace OHOS {
2295489c19Sopenharmony_cinamespace Bluetooth {
2395489c19Sopenharmony_ci
2495489c19Sopenharmony_ciGattCharacteristic::GattCharacteristic(const UUID uuid, int permissions, int properties)
2595489c19Sopenharmony_ci    : writeType_(properties & Propertie::AUTHENTICATED_SIGNED_WRITES ? WriteType::SIGNED
2695489c19Sopenharmony_ci                 : properties & Propertie::WRITE_WITHOUT_RESPONSE    ? WriteType::NO_RESPONSE
2795489c19Sopenharmony_ci                                                                     : WriteType::DEFAULT),
2895489c19Sopenharmony_ci      handle_(0),
2995489c19Sopenharmony_ci      permissions_(permissions),
3095489c19Sopenharmony_ci      properties_(properties),
3195489c19Sopenharmony_ci      service_(nullptr),
3295489c19Sopenharmony_ci      value_(nullptr),
3395489c19Sopenharmony_ci      length_(0),
3495489c19Sopenharmony_ci      descriptors_(),
3595489c19Sopenharmony_ci      uuid_(uuid)
3695489c19Sopenharmony_ci{}
3795489c19Sopenharmony_ci
3895489c19Sopenharmony_ciGattCharacteristic::GattCharacteristic(const UUID uuid, uint16_t handle, const int permissions, const int properties)
3995489c19Sopenharmony_ci    : writeType_(properties & Propertie::AUTHENTICATED_SIGNED_WRITES ? WriteType::SIGNED
4095489c19Sopenharmony_ci                 : properties & Propertie::WRITE_WITHOUT_RESPONSE    ? WriteType::NO_RESPONSE
4195489c19Sopenharmony_ci                                                                     : WriteType::DEFAULT),
4295489c19Sopenharmony_ci      handle_(handle),
4395489c19Sopenharmony_ci      permissions_(permissions),
4495489c19Sopenharmony_ci      properties_(properties),
4595489c19Sopenharmony_ci      service_(nullptr),
4695489c19Sopenharmony_ci      value_(nullptr),
4795489c19Sopenharmony_ci      length_(0),
4895489c19Sopenharmony_ci      descriptors_(),
4995489c19Sopenharmony_ci      uuid_(uuid)
5095489c19Sopenharmony_ci{}
5195489c19Sopenharmony_ci
5295489c19Sopenharmony_ciGattCharacteristic::GattCharacteristic(const GattCharacteristic &src)
5395489c19Sopenharmony_ci    : writeType_(src.writeType_),
5495489c19Sopenharmony_ci      handle_(src.handle_),
5595489c19Sopenharmony_ci      permissions_(src.permissions_),
5695489c19Sopenharmony_ci      properties_(src.properties_),
5795489c19Sopenharmony_ci      service_(src.service_),
5895489c19Sopenharmony_ci      value_(nullptr),
5995489c19Sopenharmony_ci      length_(src.length_),
6095489c19Sopenharmony_ci      descriptors_(),
6195489c19Sopenharmony_ci      uuid_(src.uuid_)
6295489c19Sopenharmony_ci{
6395489c19Sopenharmony_ci    if (nullptr != src.value_ && 0 != length_) {
6495489c19Sopenharmony_ci        value_ = std::make_unique<uint8_t[]>(length_);
6595489c19Sopenharmony_ci        (void)memcpy_s(value_.get(), length_, src.value_.get(), length_);
6695489c19Sopenharmony_ci    } else {
6795489c19Sopenharmony_ci        value_.reset(nullptr);
6895489c19Sopenharmony_ci        length_ = 0;
6995489c19Sopenharmony_ci    }
7095489c19Sopenharmony_ci
7195489c19Sopenharmony_ci    for (auto &desc : src.descriptors_) {
7295489c19Sopenharmony_ci        AddDescriptor(desc);
7395489c19Sopenharmony_ci    }
7495489c19Sopenharmony_ci}
7595489c19Sopenharmony_ci
7695489c19Sopenharmony_ciGattCharacteristic &GattCharacteristic::operator=(const GattCharacteristic &src)
7795489c19Sopenharmony_ci{
7895489c19Sopenharmony_ci    if (this != &src) {
7995489c19Sopenharmony_ci        uuid_ = src.uuid_;
8095489c19Sopenharmony_ci        permissions_ = src.permissions_;
8195489c19Sopenharmony_ci        properties_ = src.properties_;
8295489c19Sopenharmony_ci        service_ = src.service_;
8395489c19Sopenharmony_ci        handle_ = src.handle_;
8495489c19Sopenharmony_ci        length_ = src.length_;
8595489c19Sopenharmony_ci        writeType_ = src.writeType_;
8695489c19Sopenharmony_ci
8795489c19Sopenharmony_ci        if (nullptr != src.value_ && 0 != length_) {
8895489c19Sopenharmony_ci            value_ = std::make_unique<uint8_t[]>(length_);
8995489c19Sopenharmony_ci            (void)memcpy_s(value_.get(), length_, src.value_.get(), length_);
9095489c19Sopenharmony_ci        } else {
9195489c19Sopenharmony_ci            value_.reset(nullptr);
9295489c19Sopenharmony_ci            length_ = 0;
9395489c19Sopenharmony_ci        }
9495489c19Sopenharmony_ci
9595489c19Sopenharmony_ci        descriptors_ = src.descriptors_;
9695489c19Sopenharmony_ci    }
9795489c19Sopenharmony_ci    return *this;
9895489c19Sopenharmony_ci}
9995489c19Sopenharmony_ci
10095489c19Sopenharmony_ciGattCharacteristic::GattCharacteristic(GattCharacteristic &&src)
10195489c19Sopenharmony_ci    : writeType_(src.writeType_),
10295489c19Sopenharmony_ci      handle_(src.handle_),
10395489c19Sopenharmony_ci      permissions_(src.permissions_),
10495489c19Sopenharmony_ci      properties_(src.properties_),
10595489c19Sopenharmony_ci      service_(src.service_),
10695489c19Sopenharmony_ci      value_(std::move(src.value_)),
10795489c19Sopenharmony_ci      length_(src.length_),
10895489c19Sopenharmony_ci      descriptors_(),
10995489c19Sopenharmony_ci      uuid_(src.uuid_)
11095489c19Sopenharmony_ci{
11195489c19Sopenharmony_ci    for (auto &desc : src.descriptors_) {
11295489c19Sopenharmony_ci        descriptors_.insert(descriptors_.end(), std::move(desc))->characteristic_ = this;
11395489c19Sopenharmony_ci    }
11495489c19Sopenharmony_ci}
11595489c19Sopenharmony_ci
11695489c19Sopenharmony_civoid GattCharacteristic::AddDescriptor(const GattDescriptor &descriptor)
11795489c19Sopenharmony_ci{
11895489c19Sopenharmony_ci    descriptors_.insert(descriptors_.end(), descriptor)->characteristic_ = this;
11995489c19Sopenharmony_ci}
12095489c19Sopenharmony_ci
12195489c19Sopenharmony_ciGattDescriptor *GattCharacteristic::GetDescriptor(const UUID &uuid)
12295489c19Sopenharmony_ci{
12395489c19Sopenharmony_ci    for (auto &desc : descriptors_) {
12495489c19Sopenharmony_ci        if (desc.GetUuid().Equals(uuid)) {
12595489c19Sopenharmony_ci            return &desc;
12695489c19Sopenharmony_ci        }
12795489c19Sopenharmony_ci    }
12895489c19Sopenharmony_ci    return nullptr;
12995489c19Sopenharmony_ci}
13095489c19Sopenharmony_ci
13195489c19Sopenharmony_cistd::vector<GattDescriptor> &GattCharacteristic::GetDescriptors()
13295489c19Sopenharmony_ci{
13395489c19Sopenharmony_ci    return descriptors_;
13495489c19Sopenharmony_ci}
13595489c19Sopenharmony_ci
13695489c19Sopenharmony_ciuint16_t GattCharacteristic::GetHandle() const
13795489c19Sopenharmony_ci{
13895489c19Sopenharmony_ci    return handle_;
13995489c19Sopenharmony_ci}
14095489c19Sopenharmony_ci
14195489c19Sopenharmony_ciint GattCharacteristic::GetPermissions() const
14295489c19Sopenharmony_ci{
14395489c19Sopenharmony_ci    return permissions_;
14495489c19Sopenharmony_ci}
14595489c19Sopenharmony_ci
14695489c19Sopenharmony_ciint GattCharacteristic::GetProperties() const
14795489c19Sopenharmony_ci{
14895489c19Sopenharmony_ci    return properties_;
14995489c19Sopenharmony_ci}
15095489c19Sopenharmony_ci
15195489c19Sopenharmony_ciGattService *GattCharacteristic::GetService() const
15295489c19Sopenharmony_ci{
15395489c19Sopenharmony_ci    return service_;
15495489c19Sopenharmony_ci}
15595489c19Sopenharmony_ci
15695489c19Sopenharmony_ciconst UUID &GattCharacteristic::GetUuid() const
15795489c19Sopenharmony_ci{
15895489c19Sopenharmony_ci    return uuid_;
15995489c19Sopenharmony_ci}
16095489c19Sopenharmony_ci
16195489c19Sopenharmony_ciconst std::unique_ptr<uint8_t[]> &GattCharacteristic::GetValue(size_t *size) const
16295489c19Sopenharmony_ci{
16395489c19Sopenharmony_ci    *size = length_;
16495489c19Sopenharmony_ci    return value_;
16595489c19Sopenharmony_ci}
16695489c19Sopenharmony_ci
16795489c19Sopenharmony_ciint GattCharacteristic::GetWriteType() const
16895489c19Sopenharmony_ci{
16995489c19Sopenharmony_ci    return writeType_;
17095489c19Sopenharmony_ci}
17195489c19Sopenharmony_ci
17295489c19Sopenharmony_ciint GattCharacteristic::SetWriteType(int type)
17395489c19Sopenharmony_ci{
17495489c19Sopenharmony_ci    if (type != WriteType::DEFAULT && type != WriteType::NO_RESPONSE && type != WriteType::SIGNED) {
17595489c19Sopenharmony_ci        HILOGE("Invalid parameter");
17695489c19Sopenharmony_ci        return GattStatus::INVALID_PARAMETER;
17795489c19Sopenharmony_ci    }
17895489c19Sopenharmony_ci
17995489c19Sopenharmony_ci    writeType_ = type;
18095489c19Sopenharmony_ci    return GattStatus::GATT_SUCCESS;
18195489c19Sopenharmony_ci}
18295489c19Sopenharmony_ci
18395489c19Sopenharmony_civoid GattCharacteristic::SetValue(const uint8_t *values, const size_t length)
18495489c19Sopenharmony_ci{
18595489c19Sopenharmony_ci    if (values == nullptr || length == 0) {
18695489c19Sopenharmony_ci        HILOGD("values is nullptr, or length is 0");
18795489c19Sopenharmony_ci        return;
18895489c19Sopenharmony_ci    }
18995489c19Sopenharmony_ci    value_ = std::make_unique<uint8_t[]>(length);
19095489c19Sopenharmony_ci    length_ = length;
19195489c19Sopenharmony_ci    (void)memcpy_s(value_.get(), length, values, length);
19295489c19Sopenharmony_ci}
19395489c19Sopenharmony_ci
19495489c19Sopenharmony_ci}  // namespace Bluetooth
19595489c19Sopenharmony_ci}  // namespace OHOS
196