• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /******************************************************************************
2  *
3  *  Copyright 2019 The Android Open Source Project
4  *
5  *  Licensed under the Apache License, Version 2.0 (the "License");
6  *  you may not use this file except in compliance with the License.
7  *  You may obtain a copy of the License at:
8  *
9  *  http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *  See the License for the specific language governing permissions and
15  *  limitations under the License.
16  *
17  ******************************************************************************/
18 
19 #include "address.h"
20 
21 #include <stdint.h>
22 #include <algorithm>
23 #include <sstream>
24 #include <vector>
25 
26 namespace bluetooth {
27 namespace common {
28 
29 static_assert(sizeof(Address) == 6, "Address must be 6 bytes long!");
30 
31 const Address Address::kAny{{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}};
32 const Address Address::kEmpty{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
33 
Address(const uint8_t (& addr)[6])34 Address::Address(const uint8_t (&addr)[6]) {
35   std::copy(addr, addr + kLength, address);
36 };
37 
ToString() const38 std::string Address::ToString() const {
39   char buffer[] = "00:00:00:00:00:00";
40   std::snprintf(&buffer[0], sizeof(buffer),
41       "%02x:%02x:%02x:%02x:%02x:%02x", address[5], address[4], address[3], address[2], address[1], address[0]);
42   std::string str(buffer);
43   return str;
44 }
45 
FromString(const std::string & from,Address & to)46 bool Address::FromString(const std::string& from, Address& to) {
47   Address new_addr;
48   if (from.length() != 17) {
49     return false;
50   }
51 
52   std::istringstream stream(from);
53   std::string token;
54   int index = 0;
55   while (getline(stream, token, ':')) {
56     if (index >= 6) {
57       return false;
58     }
59 
60     if (token.length() != 2) {
61       return false;
62     }
63 
64     char* temp = nullptr;
65     new_addr.address[5 - index] = strtol(token.c_str(), &temp, 16);
66     if (*temp != '\0') {
67       return false;
68     }
69 
70     index++;
71   }
72 
73   if (index != 6) {
74     return false;
75   }
76 
77   to = new_addr;
78   return true;
79 }
80 
FromOctets(const uint8_t * from)81 size_t Address::FromOctets(const uint8_t* from) {
82   std::copy(from, from + kLength, address);
83   return kLength;
84 };
85 
IsValidAddress(const std::string & address)86 bool Address::IsValidAddress(const std::string& address) {
87   Address tmp;
88   return Address::FromString(address, tmp);
89 }
90 
91 }  // namespace common
92 }  // namespace bluetooth
93