1 /*
2  * Copyright (C) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "gatt_data.h"
17 #include "bt_def.h"
18 #include "memory"
19 #include "securec.h"
20 
21 namespace OHOS {
22 namespace bluetooth {
GattDevice(const RawAddress & addr,uint8_t type,uint8_t transport)23 GattDevice::GattDevice(const RawAddress& addr, uint8_t type, uint8_t transport)
24     : isEncryption_((transport == GATT_TRANSPORT_TYPE_CLASSIC) ? true : false),
25     transport_(transport), addressType_(type), connectState_(0), addr_(addr)
26 {
27 }
28 
GattDevice(const RawAddress & addr,uint8_t type,uint8_t transport,int state)29 GattDevice::GattDevice(const RawAddress& addr, uint8_t type, uint8_t transport, int state)
30     : isEncryption_((transport == GATT_TRANSPORT_TYPE_CLASSIC) ? true : false),
31     transport_(transport), addressType_(type), connectState_(state), addr_(addr)
32 {
33 }
34 
GattDevice(const RawAddress & addr,uint8_t transport)35 GattDevice::GattDevice(const RawAddress& addr, uint8_t transport)
36     : isEncryption_((transport == GATT_TRANSPORT_TYPE_CLASSIC) ? true : false),
37     transport_(transport), addressType_(0), connectState_(0), addr_(addr) {}
38 
Descriptor(const Uuid & uuid,uint16_t handle,int permissions,const uint8_t * value,size_t length)39 Descriptor::Descriptor(const Uuid &uuid, uint16_t handle, int permissions, const uint8_t *value, size_t length)
40     : handle_(handle), permissions_(permissions), value_(nullptr), length_(length), uuid_(uuid)
41     {
42         if (value != nullptr && length != 0) {
43             value_ = std::make_unique<uint8_t[]>(length);
44             (void)memcpy_s(value_.get(), length_, value, length_);
45         } else {
46             value_ = nullptr;
47             length_ = 0;
48         }
49     }
50 
Descriptor(const Descriptor & src)51 Descriptor::Descriptor(const Descriptor& src)
52     : handle_(src.handle_), permissions_(src.permissions_), value_(nullptr), length_(src.length_), uuid_(src.uuid_)
53 {
54     if (src.value_ != nullptr && src.length_ != 0) {
55         value_ = std::make_unique<uint8_t[]>(length_);
56         (void)memcpy_s(value_.get(), length_, src.value_.get(), length_);
57     } else {
58         value_ = nullptr;
59         length_ = 0;
60     }
61 }
62 
Descriptor(uint16_t handle,const uint8_t * value,size_t length)63 Descriptor::Descriptor(uint16_t handle, const uint8_t *value, size_t length)
64     : handle_(handle), permissions_(0), value_(nullptr), length_(length), uuid_()
65 {
66     value_ = std::make_unique<uint8_t[]>(length_);
67     (void)memcpy_s(value_.get(), length_, value, length_);
68 }
69 
Characteristic(const Uuid & uuid,uint16_t handle,int properties,int permissions,const uint8_t * value,size_t length)70 Characteristic::Characteristic(
71     const Uuid& uuid, uint16_t handle, int properties, int permissions, const uint8_t *value, size_t length)
72     : handle_(handle), endHandle_(0), valueHandle_(handle + 1), properties_(properties), permissions_(permissions),
73     value_(nullptr), length_(length), uuid_(uuid), descriptors_()
74 {
75     if (value != nullptr && length != 0) {
76         value_ = std::make_unique<uint8_t[]>(length_);
77         (void)memcpy_s(value_.get(), length_, value, length_);
78     } else {
79         value_ = nullptr;
80         length_ = 0;
81     }
82 }
83 
Characteristic(uint16_t handle,const uint8_t * value,size_t length)84 Characteristic::Characteristic(uint16_t handle, const uint8_t *value, size_t length)
85     : handle_(handle), endHandle_(0), valueHandle_(handle + 1), properties_(0), permissions_(0),
86     value_(std::make_unique<uint8_t[]>(length)), length_(length), uuid_(), descriptors_()
87 {
88     (void)memcpy_s(value_.get(), length_, value, length_);
89 }
90 
Characteristic(const Characteristic & src)91 Characteristic::Characteristic(const Characteristic& src)
92     : handle_(src.handle_), endHandle_(src.endHandle_), valueHandle_(src.handle_ + 1),
93     properties_(src.properties_), permissions_(src.permissions_), value_(nullptr), length_(src.length_),
94     uuid_(src.uuid_), descriptors_(src.descriptors_)
95 {
96     if (src.value_ != nullptr && src.length_ != 0) {
97         value_ = std::make_unique<uint8_t[]>(length_);
98         (void)memcpy_s(value_.get(), length_, src.value_.get(), length_);
99     } else {
100         value_ = nullptr;
101         length_ = 0;
102     }
103 }
104 
SetValue(const uint8_t * value,size_t length)105 void Characteristic::SetValue(const uint8_t *value, size_t length)
106 {
107     if (value_ != nullptr) {
108         value_.reset(nullptr);
109     }
110 
111     length_ = length;
112     value_ = std::make_unique<uint8_t[]>(length_);
113     (void)memcpy_s(value_.get(), length_, value, length_);
114 }
115 }  // namespace bluetooth
116 }  // namespace OHOS