1e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// found in the LICENSE file.
4e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/api/bluetooth/bluetooth_api_pairing_delegate.h"
6e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
7e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "base/memory/scoped_ptr.h"
8e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "base/values.h"
9e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "content/public/browser/browser_context.h"
10e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "device/bluetooth/bluetooth_device.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/api/bluetooth/bluetooth_api_utils.h"
12e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "extensions/browser/event_router.h"
13e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "extensions/browser/extension_system.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/common/api/bluetooth_private.h"
15e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
16e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochnamespace extensions {
17e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace bt_private = core_api::bluetooth_private;
19e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
20e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochnamespace {
21e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
22e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid PopulatePairingEvent(const device::BluetoothDevice* device,
23e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                          bt_private::PairingEventType type,
24e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                          bt_private::PairingEvent* out) {
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  core_api::bluetooth::BluetoothDeviceToApiDevice(*device, &out->device);
26e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  out->pairing = type;
27e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
28e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
29e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}  // namespace
30e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
31e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochBluetoothApiPairingDelegate::BluetoothApiPairingDelegate(
32e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    const std::string& extension_id,
33e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    content::BrowserContext* browser_context)
34e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    : extension_id_(extension_id), browser_context_(browser_context) {}
35e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
36e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochBluetoothApiPairingDelegate::~BluetoothApiPairingDelegate() {}
37e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
38e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid BluetoothApiPairingDelegate::RequestPinCode(
39e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    device::BluetoothDevice* device) {
40e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  bt_private::PairingEvent event;
41e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  PopulatePairingEvent(
42e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      device, bt_private::PAIRING_EVENT_TYPE_REQUESTPINCODE, &event);
43e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DispatchPairingEvent(event);
44e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
45e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
46e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid BluetoothApiPairingDelegate::RequestPasskey(
47e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    device::BluetoothDevice* device) {
48e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  bt_private::PairingEvent event;
49e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  PopulatePairingEvent(
50e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      device, bt_private::PAIRING_EVENT_TYPE_REQUESTPASSKEY, &event);
51e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DispatchPairingEvent(event);
52e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
53e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
54e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid BluetoothApiPairingDelegate::DisplayPinCode(
55e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    device::BluetoothDevice* device,
56e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    const std::string& pincode) {
57e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  bt_private::PairingEvent event;
58e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  PopulatePairingEvent(
59e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      device, bt_private::PAIRING_EVENT_TYPE_DISPLAYPINCODE, &event);
60e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  event.pincode.reset(new std::string(pincode));
61e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DispatchPairingEvent(event);
62e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
63e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
64e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid BluetoothApiPairingDelegate::DisplayPasskey(
65e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    device::BluetoothDevice* device,
66e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    uint32 passkey) {
67e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  bt_private::PairingEvent event;
68e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  PopulatePairingEvent(
69e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      device, bt_private::PAIRING_EVENT_TYPE_DISPLAYPASSKEY, &event);
70e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  event.passkey.reset(new int(passkey));
71e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DispatchPairingEvent(event);
72e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
73e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
74e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid BluetoothApiPairingDelegate::KeysEntered(device::BluetoothDevice* device,
75e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                                              uint32 entered) {
76e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  bt_private::PairingEvent event;
77e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  PopulatePairingEvent(
78e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      device, bt_private::PAIRING_EVENT_TYPE_KEYSENTERED, &event);
79e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  event.entered_key.reset(new int(entered));
80e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DispatchPairingEvent(event);
81e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
82e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
83e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid BluetoothApiPairingDelegate::ConfirmPasskey(
84e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    device::BluetoothDevice* device,
85e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    uint32 passkey) {
86e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  bt_private::PairingEvent event;
87e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  PopulatePairingEvent(
88e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      device, bt_private::PAIRING_EVENT_TYPE_CONFIRMPASSKEY, &event);
89e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  event.passkey.reset(new int(passkey));
90e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DispatchPairingEvent(event);
91e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
92e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
93e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid BluetoothApiPairingDelegate::AuthorizePairing(
94e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    device::BluetoothDevice* device) {
95e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  bt_private::PairingEvent event;
96e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  PopulatePairingEvent(
97e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      device, bt_private::PAIRING_EVENT_TYPE_REQUESTAUTHORIZATION, &event);
98e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DispatchPairingEvent(event);
99e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
100e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
101e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid BluetoothApiPairingDelegate::DispatchPairingEvent(
102e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    const bt_private::PairingEvent& pairing_event) {
103e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  scoped_ptr<base::ListValue> args =
104e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      bt_private::OnPairing::Create(pairing_event);
105e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  scoped_ptr<Event> event(
106e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      new Event(bt_private::OnPairing::kEventName, args.Pass()));
1070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EventRouter::Get(browser_context_)
108e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      ->DispatchEventToExtension(extension_id_, event.Pass());
109e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
110e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
111e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}  // namespace extensions
112