Chromium Code Reviews| Index: content/common/bluetooth/bluetooth_device_id.cc |
| diff --git a/content/common/bluetooth/bluetooth_device_id.cc b/content/common/bluetooth/bluetooth_device_id.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..84415ee1491637224bca0e29577b0c93064b2800 |
| --- /dev/null |
| +++ b/content/common/bluetooth/bluetooth_device_id.cc |
| @@ -0,0 +1,83 @@ |
| +// Copyright 2016 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "content/common/bluetooth/bluetooth_device_id.h" |
| + |
| +#include "base/base64.h" |
| +#include "base/strings/string_util.h" |
| +#include "crypto/random.h" |
| + |
| +namespace content { |
| + |
| +namespace { |
| + |
| +enum { kDeviceIdLength = 16 /* 128 bits */ }; |
| + |
| +} // namespace |
| + |
| +BluetoothDeviceId::BluetoothDeviceId() {} |
| + |
| +BluetoothDeviceId::BluetoothDeviceId(const std::string& device_id) { |
|
Jeffrey Yasskin
2016/06/03 17:22:05
Take the string by value, and then move it into de
ortuno
2016/06/06 22:22:59
Done. Why is it better? Either way results in only
Jeffrey Yasskin
2016/06/06 23:44:02
Not quite: in the call at https://codereview.chrom
ortuno
2016/06/24 17:39:43
Ah right. Forgot about the move in the struct trai
|
| + DCHECK(IsValid(device_id)); |
| + device_id_ = device_id; |
| +} |
| + |
| +BluetoothDeviceId::~BluetoothDeviceId() {} |
| + |
| +const std::string& BluetoothDeviceId::str() const { |
| + DCHECK(IsValid(device_id_)); |
| + return device_id_; |
| +} |
| + |
| +// static |
| +BluetoothDeviceId BluetoothDeviceId::Create() { |
| + std::string bytes( |
| + kDeviceIdLength + 1 /* to avoid bytes being reallocated by WriteInto */, |
| + '\0'); |
| + |
| + crypto::RandBytes(base::WriteInto(&bytes /* str */, |
| + kDeviceIdLength + 1 /* length_with_null */), |
| + kDeviceIdLength); |
| + |
| + base::Base64Encode(bytes, &bytes); |
| + |
| + return BluetoothDeviceId(bytes); |
| +} |
| + |
| +// static |
| +bool BluetoothDeviceId::IsValid(const std::string& device_id) { |
| + std::string decoded; |
| + if (!base::Base64Decode(device_id, &decoded)) { |
|
Jeffrey Yasskin
2016/06/03 17:22:04
There are some strings that will successfully deco
ortuno
2016/06/06 22:22:59
I can't see how someone could use that for any typ
Jeffrey Yasskin
2016/06/06 23:44:02
Right. I don't think we need to check it, but we s
ortuno
2016/06/24 17:39:43
Added an if statement for it.
|
| + return false; |
| + } |
| + |
| + if (decoded.size() != kDeviceIdLength) { |
| + return false; |
| + } |
| + |
| + // Expected length of a 128bit string encoded to Base64. |
| + DCHECK_EQ(24u, device_id.size()); |
|
Jeffrey Yasskin
2016/06/03 17:22:05
I think we don't need these: the Base64Decode won'
ortuno
2016/06/06 22:22:59
Done. This was just me being paranoid.
|
| + // Expected padding characters for a 128bit string encoded to Base64. |
| + DCHECK(device_id[22] == '=' && (device_id[23] == '=')); |
| + |
| + return true; |
| +} |
| + |
| +bool BluetoothDeviceId::operator==(const BluetoothDeviceId& device_id) const { |
| + DCHECK(IsValid(device_id_) && IsValid(device_id.device_id_)); |
|
Jeffrey Yasskin
2016/06/03 17:22:05
Since str() does these DCHECKs again, I'd compare
ortuno
2016/06/06 22:22:59
Done.
|
| + |
| + return str() == device_id.str(); |
| +} |
| + |
| +bool BluetoothDeviceId::operator!=(const BluetoothDeviceId& device_id) const { |
|
Jeffrey Yasskin
2016/06/03 17:22:04
Generally implement != as "return !(*this == devic
ortuno
2016/06/06 22:22:59
Ok! Done.
|
| + DCHECK(IsValid(device_id_) && IsValid(device_id.device_id_)); |
| + |
| + return str() != device_id.str(); |
| +} |
| + |
| +void PrintTo(const BluetoothDeviceId& device_id, std::ostream* out) { |
| + *out << device_id.str(); |
| +} |
| + |
| +} // namespace content |