• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 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_utils.h"
6 
7 #include <vector>
8 
9 #include "base/basictypes.h"
10 #include "base/logging.h"
11 #include "base/strings/string_util.h"
12 
13 namespace {
14 static const char* kCommonUuidPostfix = "-0000-1000-8000-00805f9b34fb";
15 static const char* kCommonUuidPrefix = "0000";
16 static const int kUuidSize = 36;
17 }  // namespace
18 
19 namespace device {
20 namespace bluetooth_utils {
21 
CanonicalUuid(std::string uuid)22 std::string CanonicalUuid(std::string uuid) {
23   if (uuid.empty())
24     return std::string();
25 
26   if (uuid.size() < 11 && uuid.find("0x") == 0)
27     uuid = uuid.substr(2);
28 
29   if (!(uuid.size() == 4 || uuid.size() == 8 || uuid.size() == 36))
30     return std::string();
31 
32   if (uuid.size() == 4 || uuid.size() == 8) {
33     for (size_t i = 0; i < uuid.size(); ++i) {
34       if (!IsHexDigit(uuid[i]))
35         return std::string();
36     }
37 
38     if (uuid.size() == 4)
39       return kCommonUuidPrefix + uuid + kCommonUuidPostfix;
40 
41     return uuid + kCommonUuidPostfix;
42   }
43 
44   std::string uuid_result(uuid);
45   for (int i = 0; i < kUuidSize; ++i) {
46     if (i == 8 || i == 13 || i == 18 || i == 23) {
47       if (uuid[i] != '-')
48         return std::string();
49     } else {
50       if (!IsHexDigit(uuid[i]))
51         return std::string();
52       uuid_result[i] = tolower(uuid[i]);
53     }
54   }
55   return uuid_result;
56 }
57 
58 }  // namespace bluetooth_utils
59 }  // namespace device
60