blob: 5149fa0e68e5ac3e84ccf39019940f662fc61c2f [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 <set>
#include <utility>
#include <vector>
#include "bta/gatt/database.h"
#include "types/bluetooth/uuid.h"
namespace gatt {
class DatabaseBuilder {
public:
constexpr static std::pair<uint16_t, uint16_t> EXPLORE_END =
std::make_pair(0xFFFF, 0xFFFF);
void AddService(uint16_t handle, uint16_t end_handle,
const bluetooth::Uuid& uuid, bool is_primary);
void AddIncludedService(uint16_t handle, const bluetooth::Uuid& uuid,
uint16_t start_handle, uint16_t end_handle);
void AddCharacteristic(uint16_t handle, uint16_t value_handle,
const bluetooth::Uuid& uuid, uint8_t properties);
void AddDescriptor(uint16_t handle, const bluetooth::Uuid& uuid);
/* Returns true if next service exploration started, false if there are no
* more services to explore. */
bool StartNextServiceExploration();
/* Return pair with start and end handle of the currently explored service.
*/
const std::pair<uint16_t, uint16_t>& CurrentlyExploredService();
/* Return pair with start and end handle of the descriptor range to discover,
* or DatabaseBuilder::EXPLORE_END if no more descriptors left.
*/
std::pair<uint16_t, uint16_t> NextDescriptorRangeToExplore();
/* Return vector of "Characteristic Extended Properties" descriptors that must
* be read as part of service discovery process */
std::vector<uint16_t> DescriptorHandlesToRead() {
return descriptor_handles_to_read;
}
/* Assign value to descriptors from |DescriptorHandlesToRead()|. Values must
* be in same order. Returns |true| if all goes well, |false| if there is
* problem mapping values to descriptors. */
bool SetValueOfDescriptors(const std::vector<uint16_t>& values);
/* Returns true, if GATT discovery is in progress, false if discovery was not
* started, or is already finished.
*/
// TODO(jpawlowski): in the future, we might create this object only for the
// time of discovery, in such case InProgress won't be needed, because object
// existence will mean discovery is pending
bool InProgress() const;
/* Call this method at end of GATT discovery, to obtain object representing
* the database of remote device */
Database Build();
void Clear();
/* Return text representation of internal state for debugging purposes */
std::string ToString() const;
private:
Database database;
/* Start and end handle of service that is currently being discovered on the
* remote device */
std::pair<uint16_t, uint16_t> pending_service;
/* Characteristic inside pending_service that is currently being explored */
uint16_t pending_characteristic;
/* sorted, unique set of start_handle, end_handle pair of all services that
* have not yet been discovered */
std::set<std::pair<uint16_t, uint16_t>> services_to_discover;
/* handles of "Characteristic Extended Properties" descriptors that must be
* read as part of service discovery process */
std::vector<uint16_t> descriptor_handles_to_read;
};
} // namespace gatt