188 lines
5.5 KiB
C++
188 lines
5.5 KiB
C++
//
|
|
// Copyright (C) 2015 Google, Inc.
|
|
//
|
|
// 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.
|
|
//
|
|
|
|
#include "service/common/bluetooth/gatt_identifier.h"
|
|
|
|
#include "service/common/bluetooth/util/address_helper.h"
|
|
|
|
namespace bluetooth {
|
|
|
|
namespace {
|
|
|
|
const int kInvalidInstanceId = -1;
|
|
|
|
} // namespace
|
|
|
|
// static
|
|
std::unique_ptr<GattIdentifier> GattIdentifier::CreateServiceId(
|
|
const std::string& device_address,
|
|
int id, const UUID& uuid,
|
|
bool is_primary) {
|
|
if (id < 0 ||
|
|
(!device_address.empty() && !util::IsAddressValid(device_address)))
|
|
return nullptr;
|
|
|
|
std::unique_ptr<GattIdentifier> gatt_id(new GattIdentifier());
|
|
|
|
gatt_id->device_address_ = device_address;
|
|
gatt_id->service_uuid_ = uuid;
|
|
gatt_id->service_instance_id_ = id;
|
|
gatt_id->is_primary_ = is_primary;
|
|
|
|
return gatt_id;
|
|
}
|
|
|
|
// static
|
|
std::unique_ptr<GattIdentifier> GattIdentifier::CreateCharacteristicId(
|
|
int id, const UUID& uuid,
|
|
const GattIdentifier& service_id) {
|
|
if (!service_id.IsService())
|
|
return nullptr;
|
|
|
|
std::unique_ptr<GattIdentifier> gatt_id(new GattIdentifier(service_id));
|
|
|
|
gatt_id->char_uuid_ = uuid;
|
|
gatt_id->char_instance_id_ = id;
|
|
|
|
return gatt_id;
|
|
}
|
|
|
|
// static
|
|
std::unique_ptr<GattIdentifier> GattIdentifier::CreateDescriptorId(
|
|
int id, const UUID& uuid,
|
|
const GattIdentifier& char_id) {
|
|
if (!char_id.IsCharacteristic())
|
|
return nullptr;
|
|
|
|
std::unique_ptr<GattIdentifier> gatt_id(new GattIdentifier(char_id));
|
|
|
|
gatt_id->desc_uuid_ = uuid;
|
|
gatt_id->desc_instance_id_ = id;
|
|
|
|
return gatt_id;
|
|
}
|
|
|
|
// Copy constructor and assignment operator.
|
|
GattIdentifier::GattIdentifier()
|
|
: is_primary_(false),
|
|
service_instance_id_(kInvalidInstanceId),
|
|
char_instance_id_(kInvalidInstanceId),
|
|
desc_instance_id_(kInvalidInstanceId) {
|
|
}
|
|
|
|
GattIdentifier::GattIdentifier(const GattIdentifier& other) {
|
|
device_address_ = other.device_address_;
|
|
is_primary_ = other.is_primary_;
|
|
service_uuid_ = other.service_uuid_;
|
|
char_uuid_ = other.char_uuid_;
|
|
desc_uuid_ = other.desc_uuid_;
|
|
service_instance_id_ = other.service_instance_id_;
|
|
service_instance_id_ = other.service_instance_id_;
|
|
char_instance_id_ = other.char_instance_id_;
|
|
desc_instance_id_ = other.desc_instance_id_;
|
|
}
|
|
|
|
GattIdentifier::GattIdentifier(
|
|
const std::string& device_address,
|
|
bool is_primary,
|
|
const UUID& service_uuid,
|
|
const UUID& characteristic_uuid,
|
|
const UUID& descriptor_uuid,
|
|
int service_instance_id,
|
|
int characteristic_instance_id,
|
|
int descriptor_instance_id)
|
|
: device_address_(device_address),
|
|
is_primary_(is_primary),
|
|
service_uuid_(service_uuid),
|
|
char_uuid_(characteristic_uuid),
|
|
desc_uuid_(descriptor_uuid),
|
|
service_instance_id_(service_instance_id),
|
|
char_instance_id_(characteristic_instance_id),
|
|
desc_instance_id_(descriptor_instance_id) {
|
|
}
|
|
|
|
GattIdentifier& GattIdentifier::operator=(const GattIdentifier& other) {
|
|
if (*this == other)
|
|
return *this;
|
|
|
|
device_address_ = other.device_address_;
|
|
is_primary_ = other.is_primary_;
|
|
service_uuid_ = other.service_uuid_;
|
|
char_uuid_ = other.char_uuid_;
|
|
desc_uuid_ = other.desc_uuid_;
|
|
service_instance_id_ = other.service_instance_id_;
|
|
char_instance_id_ = other.char_instance_id_;
|
|
desc_instance_id_ = other.desc_instance_id_;
|
|
|
|
return *this;
|
|
}
|
|
|
|
bool GattIdentifier::Equals(const GattIdentifier& other) const {
|
|
return (device_address_ == other.device_address_ &&
|
|
is_primary_ == other.is_primary_ &&
|
|
service_uuid_ == other.service_uuid_ &&
|
|
char_uuid_ == other.char_uuid_ &&
|
|
desc_uuid_ == other.desc_uuid_ &&
|
|
service_instance_id_ == other.service_instance_id_ &&
|
|
char_instance_id_ == other.char_instance_id_ &&
|
|
desc_instance_id_ == other.desc_instance_id_);
|
|
}
|
|
|
|
bool GattIdentifier::operator==(const GattIdentifier& rhs) const {
|
|
return Equals(rhs);
|
|
}
|
|
|
|
bool GattIdentifier::operator!=(const GattIdentifier& rhs) const {
|
|
return !Equals(rhs);
|
|
}
|
|
|
|
bool GattIdentifier::IsService() const {
|
|
return (service_instance_id_ != kInvalidInstanceId &&
|
|
char_instance_id_ == kInvalidInstanceId &&
|
|
desc_instance_id_ == kInvalidInstanceId);
|
|
}
|
|
|
|
bool GattIdentifier::IsCharacteristic() const {
|
|
return (service_instance_id_ != kInvalidInstanceId &&
|
|
char_instance_id_ != kInvalidInstanceId &&
|
|
desc_instance_id_ == kInvalidInstanceId);
|
|
}
|
|
|
|
bool GattIdentifier::IsDescriptor() const {
|
|
return (service_instance_id_ != kInvalidInstanceId &&
|
|
char_instance_id_ != kInvalidInstanceId &&
|
|
desc_instance_id_ != kInvalidInstanceId);
|
|
}
|
|
|
|
std::unique_ptr<GattIdentifier> GattIdentifier::GetOwningServiceId() const {
|
|
if (IsService())
|
|
return nullptr;
|
|
|
|
return CreateServiceId(
|
|
device_address_, service_instance_id_, service_uuid_, is_primary_);
|
|
}
|
|
|
|
std::unique_ptr<GattIdentifier>
|
|
GattIdentifier::GetOwningCharacteristicId() const {
|
|
if (!IsDescriptor())
|
|
return nullptr;
|
|
|
|
std::unique_ptr<GattIdentifier> service_id = GetOwningServiceId();
|
|
|
|
return CreateCharacteristicId(char_instance_id_, char_uuid_, *service_id);
|
|
}
|
|
|
|
} // namespace bluetooth
|