Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(138)

Side by Side Diff: components/copresence_sockets/copresence_peer.cc

Issue 610633002: Prototype for copresenceSockets. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "components/copresence_sockets/public/copresence_peer.h"
6
7 #include <cstdint>
8
9 #include "base/bind.h"
10 #include "base/bind_helpers.h"
11 #include "base/memory/scoped_ptr.h"
12 #include "base/rand_util.h"
13 #include "base/strings/string_number_conversions.h"
14 #include "base/strings/stringprintf.h"
15 #include "components/copresence_sockets/transports/bluetooth/copresence_socket_b luetooth.h"
16 #include "device/bluetooth/bluetooth_adapter.h"
17 #include "device/bluetooth/bluetooth_adapter_factory.h"
18 #include "device/bluetooth/bluetooth_device.h"
19 #include "device/bluetooth/bluetooth_socket.h"
20 #include "device/bluetooth/bluetooth_uuid.h"
21
22 namespace {
23
24 device::BluetoothUUID GenerateRandomUuid() {
25 // Random hex string of the format xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.
26 return device::BluetoothUUID(base::StringPrintf(
27 "%08lx-%04lx-%04lx-%04lx-%012lx",
28 base::RandGenerator(UINT32_MAX),
29 base::RandGenerator(UINT16_MAX),
30 base::RandGenerator(UINT16_MAX),
31 base::RandGenerator(UINT16_MAX),
32 base::RandGenerator(static_cast<uint64>(UINT16_MAX) + UINT32_MAX)));
33 }
34
35 // This class will confirm pairing for a device that is expecting a pairing
36 // confirmation.
37 class DefaultApprovalDelegate
38 : public device::BluetoothDevice::PairingDelegate {
39 public:
40 DefaultApprovalDelegate() {}
41 virtual ~DefaultApprovalDelegate() {}
42
43 // device::BluetoothDevice::PairingDelegate overrides:
44 virtual void RequestPinCode(device::BluetoothDevice* device) override {}
45 virtual void RequestPasskey(device::BluetoothDevice* device) override {}
46 virtual void DisplayPinCode(device::BluetoothDevice* device,
47 const std::string& pincode) override {}
48 virtual void DisplayPasskey(device::BluetoothDevice* device,
49 uint32 passkey) override {}
50 virtual void KeysEntered(device::BluetoothDevice* device,
51 uint32 entered) override {}
52 virtual void ConfirmPasskey(device::BluetoothDevice* device,
53 uint32 passkey) override {}
54 virtual void AuthorizePairing(device::BluetoothDevice* device) override {
55 if (device->ExpectingConfirmation())
56 device->ConfirmPairing();
57 }
58 };
59
60 } // namespace
61
62 namespace copresence_sockets {
63
64 CopresencePeer::CopresencePeer(const CreatePeerCallback& create_callback,
65 const AcceptCallback& accept_callback)
66 : create_callback_(create_callback),
67 accept_callback_(accept_callback),
68 delegate_(nullptr),
69 weak_ptr_factory_(this) {
70 DCHECK(!create_callback.is_null());
71 DCHECK(!accept_callback.is_null());
72
73 if (!device::BluetoothAdapterFactory::IsBluetoothAdapterAvailable()) {
armansito 2014/10/03 15:27:54 This check may not be enough to determine if Bluet
rkc 2014/10/03 21:57:39 Added the check for IsAdapter() to OnGetAdapter.
armansito 2014/10/03 22:43:21 In that case usually also check if the adapter is
rkc 2014/10/03 22:46:18 Done.
74 create_callback_.Run(std::string());
75 return;
76 }
77
78 device::BluetoothAdapterFactory::GetAdapter(base::Bind(
79 &CopresencePeer::OnGetAdapter, weak_ptr_factory_.GetWeakPtr()));
80 }
81
82 std::string CopresencePeer::GetLocatorData() {
83 // TODO(rkc): Fix the "1." once we have finalized the locator format with
84 // other platforms.
Ryan Sleevi 2014/10/01 23:38:32 Is there a bug for this? Is there some way for som
rkc 2014/10/03 21:57:40 Yep, added the link here.
85 return "1." + adapter_->GetAddress() + "." + service_uuid_.value();
86 }
87
88 CopresencePeer::~CopresencePeer() {
89 server_socket_->Disconnect(base::Bind(&base::DoNothing));
90 server_socket_->Close();
91 if (delegate_)
92 adapter_->RemovePairingDelegate(delegate_.get());
93 }
94
95 // Private methods.
Ryan Sleevi 2014/10/01 23:38:32 Unnecessary
rkc 2014/10/03 21:57:40 Done.
96
97 void CopresencePeer::OnGetAdapter(
98 scoped_refptr<device::BluetoothAdapter> adapter) {
99 if (!adapter.get()) {
100 create_callback_.Run(std::string());
101 return;
102 }
103
104 adapter_ = adapter;
105 service_uuid_ = GenerateRandomUuid();
106
107 delegate_ = make_scoped_ptr(new DefaultApprovalDelegate());
108 VLOG(2) << "Creating service with UUID: " << service_uuid_.value();
109 adapter_->AddPairingDelegate(
110 delegate_.get(),
111 device::BluetoothAdapter::PAIRING_DELEGATE_PRIORITY_HIGH);
112 adapter_->CreateRfcommService(
113 service_uuid_,
114 device::BluetoothAdapter::ServiceOptions(),
115 base::Bind(&CopresencePeer::OnCreateService,
116 weak_ptr_factory_.GetWeakPtr()),
117 base::Bind(&CopresencePeer::OnCreateServiceError,
118 weak_ptr_factory_.GetWeakPtr()));
119 }
120
121 void CopresencePeer::OnCreateService(
122 scoped_refptr<device::BluetoothSocket> socket) {
123 if (!socket.get()) {
124 create_callback_.Run(std::string());
125 return;
126 }
127
128 server_socket_ = socket;
129 create_callback_.Run(GetLocatorData());
130 server_socket_->Accept(
131 base::Bind(&CopresencePeer::OnAccept, weak_ptr_factory_.GetWeakPtr()),
132 base::Bind(&CopresencePeer::OnAcceptError,
133 weak_ptr_factory_.GetWeakPtr()));
134 }
135
136 void CopresencePeer::OnCreateServiceError(const std::string& message) {
137 LOG(WARNING) << "Couldn't create Bluetooth service: " << message;
138 create_callback_.Run(std::string());
139 }
140
141 void CopresencePeer::OnAccept(const device::BluetoothDevice* device,
142 scoped_refptr<device::BluetoothSocket> socket) {
143 if (!socket.get())
144 return;
145 accept_callback_.Run(make_scoped_ptr(new CopresenceSocketBluetooth(socket)));
146 }
147
148 void CopresencePeer::OnAcceptError(const std::string& message) {
149 LOG(WARNING) << "Couldn't accept Bluetooth connection: " << message;
150 }
151
152 } // namespace copresence_sockets
OLDNEW
« no previous file with comments | « components/copresence_sockets/OWNERS ('k') | components/copresence_sockets/public/copresence_peer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698