15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/common/api/bluetooth/bluetooth_manifest_permission.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/stl_util.h"
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/values.h"
11c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "device/bluetooth/bluetooth_uuid.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/common/api/bluetooth/bluetooth_manifest_data.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/common/api/extensions_manifest_types.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/common/error_utils.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/common/manifest_constants.h"
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "grit/extensions_strings.h"
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ipc/ipc_message.h"
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace extensions {
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace bluetooth_errors {
2323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)const char kErrorInvalidUuid[] = "Invalid UUID '*'";
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace errors = bluetooth_errors;
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace {
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ParseUuid(BluetoothManifestPermission* permission,
3123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)               const std::string& uuid,
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               base::string16* error) {
33c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  device::BluetoothUUID bt_uuid(uuid);
34c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!bt_uuid.IsValid()) {
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    *error = ErrorUtils::FormatErrorMessageUTF16(
3623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        errors::kErrorInvalidUuid, uuid);
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return false;
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  permission->AddPermission(uuid);
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return true;
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ParseUuidArray(BluetoothManifestPermission* permission,
4423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                    const scoped_ptr<std::vector<std::string> >& uuids,
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    base::string16* error) {
4623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  for (std::vector<std::string>::const_iterator it = uuids->begin();
4723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)       it != uuids->end();
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       ++it) {
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!ParseUuid(permission, *it, error)) {
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return false;
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return true;
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)BluetoothManifestPermission::BluetoothManifestPermission()
59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  : socket_(false),
60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    low_energy_(false) {}
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)BluetoothManifestPermission::~BluetoothManifestPermission() {}
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// static
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<BluetoothManifestPermission> BluetoothManifestPermission::FromValue(
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::Value& value,
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::string16* error) {
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<core_api::extensions_manifest_types::Bluetooth> bluetooth =
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      core_api::extensions_manifest_types::Bluetooth::FromValue(value, error);
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!bluetooth)
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return scoped_ptr<BluetoothManifestPermission>();
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<BluetoothManifestPermission> result(
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      new BluetoothManifestPermission());
7523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (bluetooth->uuids) {
7623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    if (!ParseUuidArray(result.get(), bluetooth->uuids, error)) {
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return scoped_ptr<BluetoothManifestPermission>();
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (bluetooth->socket) {
81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    result->socket_ = *(bluetooth->socket);
82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (bluetooth->low_energy) {
84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    result->low_energy_ = *(bluetooth->low_energy);
85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return result.Pass();
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool BluetoothManifestPermission::CheckRequest(
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const Extension* extension,
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const BluetoothPermissionRequest& request) const {
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
93c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  device::BluetoothUUID param_uuid(request.uuid);
9423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  for (BluetoothUuidSet::const_iterator it = uuids_.begin();
9523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)       it != uuids_.end();
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       ++it) {
97c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    device::BluetoothUUID uuid(*it);
98c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    if (param_uuid == uuid)
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return true;
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return false;
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool BluetoothManifestPermission::CheckSocketPermitted(
105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const Extension* extension) const {
106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return socket_;
107f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool BluetoothManifestPermission::CheckLowEnergyPermitted(
110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const Extension* extension) const {
111f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return low_energy_;
112f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
113f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::string BluetoothManifestPermission::name() const {
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return manifest_keys::kBluetooth;
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::string BluetoothManifestPermission::id() const { return name(); }
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool BluetoothManifestPermission::HasMessages() const { return true; }
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)PermissionMessages BluetoothManifestPermission::GetMessages() const {
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(HasMessages());
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PermissionMessages result;
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  result.push_back(PermissionMessage(
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      PermissionMessage::kBluetooth,
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_WARNING_BLUETOOTH)));
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
13023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (!uuids_.empty()) {
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    result.push_back(
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        PermissionMessage(PermissionMessage::kBluetoothDevices,
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          l10n_util::GetStringUTF16(
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              IDS_EXTENSION_PROMPT_WARNING_BLUETOOTH_DEVICES)));
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return result;
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool BluetoothManifestPermission::FromValue(const base::Value* value) {
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!value)
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return false;
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 error;
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<BluetoothManifestPermission> manifest_permission(
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      BluetoothManifestPermission::FromValue(*value, &error));
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!manifest_permission)
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return false;
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
15023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  uuids_ = manifest_permission->uuids_;
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return true;
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<base::Value> BluetoothManifestPermission::ToValue() const {
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  core_api::extensions_manifest_types::Bluetooth bluetooth;
15623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  bluetooth.uuids.reset(new std::vector<std::string>(uuids_.begin(),
15723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                                     uuids_.end()));
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return bluetooth.ToValue().PassAs<base::Value>();
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ManifestPermission* BluetoothManifestPermission::Diff(
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const ManifestPermission* rhs) const {
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const BluetoothManifestPermission* other =
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      static_cast<const BluetoothManifestPermission*>(rhs);
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<BluetoothManifestPermission> result(
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      new BluetoothManifestPermission());
16823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  result->uuids_ = base::STLSetDifference<BluetoothUuidSet>(
16923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      uuids_, other->uuids_);
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return result.release();
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ManifestPermission* BluetoothManifestPermission::Union(
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const ManifestPermission* rhs) const {
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const BluetoothManifestPermission* other =
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      static_cast<const BluetoothManifestPermission*>(rhs);
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<BluetoothManifestPermission> result(
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      new BluetoothManifestPermission());
18023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  result->uuids_ = base::STLSetUnion<BluetoothUuidSet>(
18123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      uuids_, other->uuids_);
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return result.release();
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ManifestPermission* BluetoothManifestPermission::Intersect(
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const ManifestPermission* rhs) const {
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const BluetoothManifestPermission* other =
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      static_cast<const BluetoothManifestPermission*>(rhs);
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<BluetoothManifestPermission> result(
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      new BluetoothManifestPermission());
19223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  result->uuids_ = base::STLSetIntersection<BluetoothUuidSet>(
19323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      uuids_, other->uuids_);
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return result.release();
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
19723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void BluetoothManifestPermission::AddPermission(const std::string& uuid) {
19823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  uuids_.insert(uuid);
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace extensions
202