Chromium Code Reviews| Index: device/bluetooth/public/interfaces/bluetooth_uuid_struct_traits.h |
| diff --git a/device/bluetooth/public/interfaces/bluetooth_uuid_struct_traits.h b/device/bluetooth/public/interfaces/bluetooth_uuid_struct_traits.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..4e649610ff93628e0b482a472f5f172876ab63f1 |
| --- /dev/null |
| +++ b/device/bluetooth/public/interfaces/bluetooth_uuid_struct_traits.h |
| @@ -0,0 +1,51 @@ |
| +// 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. |
| + |
| +#ifndef DEVICE_BLUETOOTH_PUBLIC_INTERFACES_BLUETOOTH_UUID_STRUCT_TRAITS_H_ |
| +#define DEVICE_BLUETOOTH_PUBLIC_INTERFACES_BLUETOOTH_UUID_STRUCT_TRAITS_H_ |
| + |
| +#include "base/optional.h" |
| +#include "base/strings/string_piece.h" |
| +#include "device/bluetooth/bluetooth_uuid.h" |
| +#include "device/bluetooth/public/interfaces/bluetooth_uuid.mojom.h" |
| + |
| +namespace mojo { |
| + |
| +template <> |
| +struct StructTraits<device::mojom::BluetoothUUID, |
| + base::Optional<device::BluetoothUUID>> { |
| + static bool IsNull(const base::Optional<device::BluetoothUUID>& uuid) { |
| + return !uuid; |
| + } |
| + |
| + static void SetToNull(base::Optional<device::BluetoothUUID>* output) { |
| + *output = base::nullopt; |
| + } |
| + |
| + static base::StringPiece uuid( |
|
yzshen1
2016/06/01 16:12:59
nit: you could simply use static const std::string
ortuno
2016/06/01 18:28:12
Nice. Done.
|
| + const base::Optional<device::BluetoothUUID>& uuid) { |
| + DCHECK(uuid); |
| + return base::StringPiece(uuid->canonical_value().c_str(), |
| + uuid->canonical_value().length()); |
| + } |
| + |
| + static bool Read(device::mojom::BluetoothUUIDDataView input, |
| + base::Optional<device::BluetoothUUID>* output) { |
| + base::StringPiece result; |
| + if (!input.ReadUuid(&result)) |
| + return false; |
| + *output = base::make_optional(device::BluetoothUUID(result.as_string())); |
| + |
| + // If the format isn't 128-bit, .value() would return a different answer |
| + // than .canonical_value(). Then if browser-side code accidentally checks |
| + // .value() against a 128-bit string literal, a hostile renderer could use |
| + // the 16- or 32-bit format and evade the check. |
| + return output->value().IsValid() && |
| + output->value().format() == device::BluetoothUUID::kFormat128Bit; |
| + } |
| +}; |
| + |
| +} // namespace mojo |
| + |
| +#endif // DEVICE_BLUETOOTH_PUBLIC_INTERFACES_BLUETOOTH_UUID_STRUCT_TRAITS_H_ |