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