Home | History | Annotate | Download | only in bluetooth
      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 
     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