blob: 312a6c4de79c850c19ef969d67945cb487e3d103 [file] [log] [blame]
//
// 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