| // |
| // 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 |