blob: 3a87ebc792e32bc71b761e309ea40ade3c08f7c9 [file] [log] [blame]
/******************************************************************************
*
* Copyright 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************/
#pragma once
#include <list>
#include <string>
#include <vector>
#include "stack/include/bt_octets.h"
#include "types/bluetooth/uuid.h"
namespace gatt {
constexpr uint16_t HANDLE_MIN = 0x0001;
constexpr uint16_t HANDLE_MAX = 0xffff;
/* Representation of GATT attribute for storage */
struct StoredAttribute {
// kSizeOnDisk includes two padding bytes for backward compatibility.
static constexpr size_t kSizeOnDisk = 38;
uint16_t handle;
bluetooth::Uuid type;
union {
/* primary or secondary service definition */
struct {
bluetooth::Uuid uuid;
uint16_t end_handle;
} service;
/* included service definition */
struct {
uint16_t handle;
uint16_t end_handle;
bluetooth::Uuid uuid;
} included_service;
/* characteristic definition */
struct {
uint8_t properties;
uint16_t value_handle;
bluetooth::Uuid uuid;
} characteristic;
/* for descriptor we store value only for
* «Characteristic Extended Properties» */
uint16_t characteristic_extended_properties;
} value;
static void SerializeStoredAttribute(const StoredAttribute& attr,
std::vector<uint8_t>& bytes);
};
struct IncludedService;
struct Characteristic;
struct Descriptor;
struct Service {
uint16_t handle;
bluetooth::Uuid uuid;
bool is_primary;
uint16_t end_handle;
std::vector<IncludedService> included_services;
std::vector<Characteristic> characteristics;
};
struct IncludedService {
uint16_t handle; /* definition handle */
bluetooth::Uuid uuid;
uint16_t start_handle; /* start handle of included service */
uint16_t end_handle; /* end handle of included service */
};
struct Characteristic {
uint16_t declaration_handle;
bluetooth::Uuid uuid;
uint16_t value_handle;
uint8_t properties;
std::vector<Descriptor> descriptors;
};
struct Descriptor {
uint16_t handle;
bluetooth::Uuid uuid;
/* set and used for «Characteristic Extended Properties» only */
uint16_t characteristic_extended_properties;
};
class DatabaseBuilder;
class Database {
public:
/* Return true if there are no services in this database. */
bool IsEmpty() const { return services.empty(); }
/* Clear the GATT database. This method forces relocation to ensure no extra
* space is used unnecesarly */
void Clear() { std::list<Service>().swap(services); }
/* Return list of services available in this database */
const std::list<Service>& Services() const { return services; }
std::string ToString() const;
std::vector<gatt::StoredAttribute> Serialize() const;
static Database Deserialize(const std::vector<gatt::StoredAttribute>& nv_attr,
bool* success);
/* Return 128 bit unique identifier of this GATT database */
Octet16 Hash() const;
friend class DatabaseBuilder;
private:
std::list<Service> services;
};
/* Find a service that should contain handle. Helper method for internal use
* inside gatt namespace.*/
Service* FindService(std::list<Service>& services, uint16_t handle);
} // namespace gatt