blob: 807b143f46991a515ddbe3a376f0d4efadfd3b0f [file] [log] [blame]
/*
*
* Copyright (c) 2020 Project CHIP Authors
* Copyright (c) 2015-2017 Nest Labs, 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.
*/
#if !__has_feature(objc_arc)
#error This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC).
#endif
#import "UUIDHelper.h"
@implementation UUIDHelper
+ (CBUUID *)GetShortestServiceUUID:(const chip::Ble::ChipBleUUID *)svcId
{
// shorten the 16-byte UUID reported by BLE Layer to shortest possible, 2 or 4 bytes
// this is the BLE Service UUID Base. If a 16-byte service UUID partially matches with these 12 bytes,
// it can be shortened to 2 or 4 bytes.
static const uint8_t bleBaseUUID[12] = { 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB };
if (0 == memcmp(svcId->bytes + 4, bleBaseUUID, sizeof(bleBaseUUID))) {
// okay, let's try to shorten it
if ((0 == svcId->bytes[0]) && (0 == svcId->bytes[1])) {
// the highest 2 bytes are both 0, so we just need 2 bytes
return [CBUUID UUIDWithData:[NSData dataWithBytes:(svcId->bytes + 2) length:2]];
} else {
// we need to use 4 bytes
return [CBUUID UUIDWithData:[NSData dataWithBytes:svcId->bytes length:4]];
}
} else {
// it cannot be shortened as it doesn't match with the BLE Service UUID Base
return [CBUUID UUIDWithData:[NSData dataWithBytes:svcId->bytes length:16]];
}
}
@end