1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "device/bluetooth/bluetooth_uuid.h" 6 7 #include "base/basictypes.h" 8 #include "base/logging.h" 9 #include "base/strings/string_util.h" 10 11 namespace device { 12 13 namespace { 14 15 const char* kCommonUuidPostfix = "-0000-1000-8000-00805f9b34fb"; 16 const char* kCommonUuidPrefix = "0000"; 17 18 // Returns the canonical, 128-bit canonical, and the format of the UUID 19 // in |canonical|, |canonical_128|, and |format| based on |uuid|. 20 void GetCanonicalUuid(std::string uuid, 21 std::string* canonical, 22 std::string* canonical_128, 23 BluetoothUUID::Format* format) { 24 // Initialize the values for the failure case. 25 canonical->clear(); 26 canonical_128->clear(); 27 *format = BluetoothUUID::kFormatInvalid; 28 29 if (uuid.empty()) 30 return; 31 32 if (uuid.size() < 11 && uuid.find("0x") == 0) 33 uuid = uuid.substr(2); 34 35 if (!(uuid.size() == 4 || uuid.size() == 8 || uuid.size() == 36)) 36 return; 37 38 for (size_t i = 0; i < uuid.size(); ++i) { 39 if (i == 8 || i == 13 || i == 18 || i == 23) { 40 if (uuid[i] != '-') 41 return; 42 } else { 43 if (!IsHexDigit(uuid[i])) 44 return; 45 uuid[i] = base::ToLowerASCII(uuid[i]); 46 } 47 } 48 49 canonical->assign(uuid); 50 if (uuid.size() == 4) { 51 canonical_128->assign(kCommonUuidPrefix + uuid + kCommonUuidPostfix); 52 *format = BluetoothUUID::kFormat16Bit; 53 } else if (uuid.size() == 8) { 54 canonical_128->assign(uuid + kCommonUuidPostfix); 55 *format = BluetoothUUID::kFormat32Bit; 56 } else { 57 canonical_128->assign(uuid); 58 *format = BluetoothUUID::kFormat128Bit; 59 } 60 } 61 62 } // namespace 63 64 65 BluetoothUUID::BluetoothUUID(const std::string& uuid) { 66 GetCanonicalUuid(uuid, &value_, &canonical_value_, &format_); 67 } 68 69 BluetoothUUID::BluetoothUUID() : format_(kFormatInvalid) { 70 } 71 72 BluetoothUUID::~BluetoothUUID() { 73 } 74 75 bool BluetoothUUID::IsValid() const { 76 return format_ != kFormatInvalid; 77 } 78 79 bool BluetoothUUID::operator<(const BluetoothUUID& uuid) const { 80 return canonical_value_ < uuid.canonical_value_; 81 } 82 83 bool BluetoothUUID::operator==(const BluetoothUUID& uuid) const { 84 return canonical_value_ == uuid.canonical_value_; 85 } 86 87 bool BluetoothUUID::operator!=(const BluetoothUUID& uuid) const { 88 return canonical_value_ != uuid.canonical_value_; 89 } 90 91 void PrintTo(const BluetoothUUID& uuid, std::ostream* out) { 92 *out << uuid.canonical_value(); 93 } 94 95 } // namespace device 96