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
1695489c19Sopenharmony_ci#ifndef GATT_DATA_H
1795489c19Sopenharmony_ci#define GATT_DATA_H
1895489c19Sopenharmony_ci
1995489c19Sopenharmony_ci#include <cstring>
2095489c19Sopenharmony_ci#include <memory>
2195489c19Sopenharmony_ci#include <vector>
2295489c19Sopenharmony_ci#include "bt_def.h"
2395489c19Sopenharmony_ci#include "bt_uuid.h"
2495489c19Sopenharmony_ci#include "cstdint"
2595489c19Sopenharmony_ci#include "raw_address.h"
2695489c19Sopenharmony_ci#include "type_traits"
2795489c19Sopenharmony_ci
2895489c19Sopenharmony_ci
2995489c19Sopenharmony_cinamespace OHOS {
3095489c19Sopenharmony_cinamespace bluetooth {
3195489c19Sopenharmony_cistruct Descriptor {
3295489c19Sopenharmony_ci    Descriptor() : handle_(0), permissions_(0), value_(nullptr), length_(0), uuid_() {}
3395489c19Sopenharmony_ci
3495489c19Sopenharmony_ci    Descriptor(const Uuid& uuid, const int permissions)
3595489c19Sopenharmony_ci        : handle_(0), permissions_(permissions), value_(nullptr), length_(0), uuid_(uuid)
3695489c19Sopenharmony_ci    {
3795489c19Sopenharmony_ci    }
3895489c19Sopenharmony_ci
3995489c19Sopenharmony_ci    Descriptor(uint16_t handle, const Uuid& uuid, int permissions)
4095489c19Sopenharmony_ci        : handle_(handle), permissions_(permissions), value_(nullptr), length_(0), uuid_(uuid)
4195489c19Sopenharmony_ci    {
4295489c19Sopenharmony_ci    }
4395489c19Sopenharmony_ci
4495489c19Sopenharmony_ci    Descriptor(const Uuid &uuid, uint16_t handle, int permissions, const uint8_t *value, size_t length);
4595489c19Sopenharmony_ci
4695489c19Sopenharmony_ci    Descriptor(const Descriptor &src);
4795489c19Sopenharmony_ci
4895489c19Sopenharmony_ci    Descriptor(Descriptor&& src)
4995489c19Sopenharmony_ci        : handle_(src.handle_), permissions_(src.permissions_), value_(std::move(src.value_)), length_(src.length_),
5095489c19Sopenharmony_ci        uuid_(src.uuid_)
5195489c19Sopenharmony_ci    {
5295489c19Sopenharmony_ci        src.value_ = nullptr;
5395489c19Sopenharmony_ci        src.length_ = 0;
5495489c19Sopenharmony_ci    }
5595489c19Sopenharmony_ci
5695489c19Sopenharmony_ci    explicit Descriptor(uint16_t handle) : handle_(handle), permissions_(0), value_(nullptr), length_(0), uuid_() {}
5795489c19Sopenharmony_ci
5895489c19Sopenharmony_ci    Descriptor(uint16_t handle, const uint8_t *value, size_t length);
5995489c19Sopenharmony_ci
6095489c19Sopenharmony_ci    ~Descriptor() {}
6195489c19Sopenharmony_ci
6295489c19Sopenharmony_ci    Descriptor &operator=(const Descriptor &src) = delete;
6395489c19Sopenharmony_ci    Descriptor &operator=(Descriptor &&src) = delete;
6495489c19Sopenharmony_ci
6595489c19Sopenharmony_ci    uint16_t handle_;
6695489c19Sopenharmony_ci    int permissions_;
6795489c19Sopenharmony_ci    std::unique_ptr<uint8_t[]> value_;
6895489c19Sopenharmony_ci    size_t length_;
6995489c19Sopenharmony_ci    Uuid uuid_;
7095489c19Sopenharmony_ci};
7195489c19Sopenharmony_ci
7295489c19Sopenharmony_cistruct Characteristic {
7395489c19Sopenharmony_ci    Characteristic()
7495489c19Sopenharmony_ci        : handle_(0), endHandle_(0), valueHandle_(0), properties_(0),
7595489c19Sopenharmony_ci          permissions_(0), value_(nullptr), length_(0), uuid_(), descriptors_() {}
7695489c19Sopenharmony_ci
7795489c19Sopenharmony_ci    Characteristic(const Uuid& uuid, uint16_t handle, int properties)
7895489c19Sopenharmony_ci        : handle_(handle), endHandle_(0), valueHandle_(handle + 1), properties_(properties), permissions_(0),
7995489c19Sopenharmony_ci        value_(nullptr),  length_(0), uuid_(uuid), descriptors_()
8095489c19Sopenharmony_ci    {
8195489c19Sopenharmony_ci    }
8295489c19Sopenharmony_ci
8395489c19Sopenharmony_ci    Characteristic(
8495489c19Sopenharmony_ci        const Uuid &uuid, uint16_t handle, int properties, int permissions, const uint8_t *value, size_t length);
8595489c19Sopenharmony_ci
8695489c19Sopenharmony_ci    Characteristic(uint16_t handle, const uint8_t *value, size_t length);
8795489c19Sopenharmony_ci
8895489c19Sopenharmony_ci    void SetValue(const uint8_t *value, size_t length);
8995489c19Sopenharmony_ci
9095489c19Sopenharmony_ci    explicit Characteristic(uint16_t handle)
9195489c19Sopenharmony_ci        : handle_(handle), endHandle_(0), valueHandle_(handle + 1), properties_(0), permissions_(0),
9295489c19Sopenharmony_ci        value_(nullptr), length_(0), uuid_(), descriptors_() {}
9395489c19Sopenharmony_ci
9495489c19Sopenharmony_ci    Characteristic(uint16_t handle, uint16_t endHandle)
9595489c19Sopenharmony_ci        : handle_(handle), endHandle_(endHandle), valueHandle_(handle + 1), properties_(0), permissions_(0),
9695489c19Sopenharmony_ci        value_(nullptr), length_(0), uuid_(), descriptors_()
9795489c19Sopenharmony_ci    {
9895489c19Sopenharmony_ci    }
9995489c19Sopenharmony_ci
10095489c19Sopenharmony_ci    ~Characteristic() {}
10195489c19Sopenharmony_ci
10295489c19Sopenharmony_ci    Characteristic(const Characteristic &src);
10395489c19Sopenharmony_ci
10495489c19Sopenharmony_ci    Characteristic(Characteristic&& src)
10595489c19Sopenharmony_ci        : handle_(src.handle_), endHandle_(src.endHandle_), valueHandle_(src.handle_ + 1),
10695489c19Sopenharmony_ci        properties_(src.properties_), permissions_(src.permissions_), value_(std::move(src.value_)),
10795489c19Sopenharmony_ci        length_(src.length_), uuid_(src.uuid_), descriptors_(std::move(src.descriptors_))
10895489c19Sopenharmony_ci    {
10995489c19Sopenharmony_ci        src.value_ = nullptr;
11095489c19Sopenharmony_ci        src.length_ = 0;
11195489c19Sopenharmony_ci    }
11295489c19Sopenharmony_ci
11395489c19Sopenharmony_ci    Characteristic &operator=(const Characteristic &src) = delete;
11495489c19Sopenharmony_ci    Characteristic &operator=(Characteristic &&src) = delete;
11595489c19Sopenharmony_ci
11695489c19Sopenharmony_ci    uint16_t handle_;
11795489c19Sopenharmony_ci    uint16_t endHandle_;
11895489c19Sopenharmony_ci    uint16_t valueHandle_;
11995489c19Sopenharmony_ci    int properties_;
12095489c19Sopenharmony_ci    int permissions_;
12195489c19Sopenharmony_ci    std::unique_ptr<uint8_t[]> value_;
12295489c19Sopenharmony_ci    size_t length_;
12395489c19Sopenharmony_ci    Uuid uuid_;
12495489c19Sopenharmony_ci    std::vector<Descriptor> descriptors_;
12595489c19Sopenharmony_ci};
12695489c19Sopenharmony_ci
12795489c19Sopenharmony_cistruct Service {
12895489c19Sopenharmony_ci    Service()
12995489c19Sopenharmony_ci        :isPrimary_(false), handle_(0), startHandle_(0), endHandle_(0), uuid_(), includeServices_(), characteristics_()
13095489c19Sopenharmony_ci    {
13195489c19Sopenharmony_ci    }
13295489c19Sopenharmony_ci
13395489c19Sopenharmony_ci    Service(const Uuid& uuid, uint16_t handle, uint16_t starthandle, uint16_t endHandle)
13495489c19Sopenharmony_ci        : isPrimary_(true), handle_(handle), startHandle_(starthandle), endHandle_(endHandle), uuid_(uuid),
13595489c19Sopenharmony_ci          includeServices_(), characteristics_()
13695489c19Sopenharmony_ci    {
13795489c19Sopenharmony_ci    }
13895489c19Sopenharmony_ci
13995489c19Sopenharmony_ci    explicit Service(uint16_t handle)
14095489c19Sopenharmony_ci        : isPrimary_(false), handle_(handle), startHandle_(handle), endHandle_(0), uuid_(), includeServices_(),
14195489c19Sopenharmony_ci        characteristics_()
14295489c19Sopenharmony_ci    {
14395489c19Sopenharmony_ci    }
14495489c19Sopenharmony_ci
14595489c19Sopenharmony_ci    Service(uint16_t handle, uint16_t endHandle)
14695489c19Sopenharmony_ci        : isPrimary_(false), handle_(handle), startHandle_(handle), endHandle_(endHandle), uuid_(), includeServices_(),
14795489c19Sopenharmony_ci        characteristics_()
14895489c19Sopenharmony_ci    {
14995489c19Sopenharmony_ci    }
15095489c19Sopenharmony_ci
15195489c19Sopenharmony_ci    Service(const Service&) = default;
15295489c19Sopenharmony_ci    Service(Service&&) = default;
15395489c19Sopenharmony_ci
15495489c19Sopenharmony_ci    Service &operator=(const Service &src) = delete;
15595489c19Sopenharmony_ci    Service &operator=(Service &&src) = delete;
15695489c19Sopenharmony_ci
15795489c19Sopenharmony_ci    bool isPrimary_;
15895489c19Sopenharmony_ci    uint16_t handle_;
15995489c19Sopenharmony_ci    uint16_t startHandle_;
16095489c19Sopenharmony_ci    uint16_t endHandle_;
16195489c19Sopenharmony_ci    Uuid uuid_;
16295489c19Sopenharmony_ci    std::vector<Service> includeServices_;
16395489c19Sopenharmony_ci    std::vector<Characteristic> characteristics_;
16495489c19Sopenharmony_ci};
16595489c19Sopenharmony_ci
16695489c19Sopenharmony_cistruct GattDevice {
16795489c19Sopenharmony_ci    GattDevice() : isEncryption_(false), transport_(0), addressType_(0), connectState_(0), addr_() {}
16895489c19Sopenharmony_ci    GattDevice(const RawAddress &addr, uint8_t type, uint8_t transport);
16995489c19Sopenharmony_ci
17095489c19Sopenharmony_ci    GattDevice(const RawAddress &addr, uint8_t type, uint8_t transport, int state);
17195489c19Sopenharmony_ci
17295489c19Sopenharmony_ci    GattDevice(const RawAddress &addr, uint8_t transport);
17395489c19Sopenharmony_ci
17495489c19Sopenharmony_ci    bool isEncryption_ = false;
17595489c19Sopenharmony_ci    uint8_t role_ = GATT_ROLE_INVALID;
17695489c19Sopenharmony_ci    uint8_t transport_ = 0;
17795489c19Sopenharmony_ci    uint8_t addressType_ = 0;
17895489c19Sopenharmony_ci    int connectState_ = 0;
17995489c19Sopenharmony_ci    RawAddress addr_ = {};
18095489c19Sopenharmony_ci
18195489c19Sopenharmony_ci    bool operator==(const GattDevice& rhs) const
18295489c19Sopenharmony_ci    {
18395489c19Sopenharmony_ci        return ((addr_ == rhs.addr_) && (transport_ == rhs.transport_));
18495489c19Sopenharmony_ci    }
18595489c19Sopenharmony_ci
18695489c19Sopenharmony_ci    bool operator<(const GattDevice& rhs) const
18795489c19Sopenharmony_ci    {
18895489c19Sopenharmony_ci        return ((addr_ < rhs.addr_) && (transport_ == rhs.transport_));
18995489c19Sopenharmony_ci    }
19095489c19Sopenharmony_ci};
19195489c19Sopenharmony_ci}  // namespace bluetooth
19295489c19Sopenharmony_ci}  // namespace OHOS
19395489c19Sopenharmony_ci#endif // GATT_DATA_H
194