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: chrome/browser/extensions/api/bluetooth/bluetooth_api.cc

Issue 11075006: Moved bluetooth adapter files to device/bluetooth/. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/extensions/api/bluetooth/bluetooth_api.h" 5 #include "chrome/browser/extensions/api/bluetooth/bluetooth_api.h"
6 6
7 #if defined(OS_CHROMEOS) 7 #if defined(OS_CHROMEOS)
8 #include <errno.h> 8 #include <errno.h>
9 #endif 9 #endif
10 10
11 #include <string> 11 #include <string>
12 12
13 #include "chrome/browser/extensions/api/bluetooth/bluetooth_api_utils.h" 13 #include "chrome/browser/extensions/api/bluetooth/bluetooth_api_utils.h"
14 #include "chrome/browser/extensions/event_names.h" 14 #include "chrome/browser/extensions/event_names.h"
15 #include "chrome/browser/extensions/extension_service.h" 15 #include "chrome/browser/extensions/extension_service.h"
16 #include "chrome/browser/profiles/profile.h" 16 #include "chrome/browser/profiles/profile.h"
17 #include "chrome/common/extensions/api/experimental_bluetooth.h" 17 #include "chrome/common/extensions/api/experimental_bluetooth.h"
18 #include "content/public/browser/browser_thread.h" 18 #include "content/public/browser/browser_thread.h"
19 19
20 #if defined(OS_CHROMEOS) 20 #if defined(OS_CHROMEOS)
21 #include "base/memory/ref_counted.h" 21 #include "base/memory/ref_counted.h"
22 #include "base/safe_strerror_posix.h" 22 #include "base/safe_strerror_posix.h"
23 #include "chrome/browser/chromeos/bluetooth/bluetooth_adapter.h"
24 #include "chrome/browser/chromeos/bluetooth/bluetooth_device.h"
25 #include "chrome/browser/chromeos/bluetooth/bluetooth_service_record.h"
26 #include "chrome/browser/chromeos/bluetooth/bluetooth_socket.h"
27 #include "chrome/browser/chromeos/bluetooth/bluetooth_utils.h"
28 #include "chrome/browser/chromeos/extensions/bluetooth_event_router.h" 23 #include "chrome/browser/chromeos/extensions/bluetooth_event_router.h"
29 #include "chromeos/dbus/bluetooth_out_of_band_client.h" 24 #include "chromeos/dbus/bluetooth_out_of_band_client.h"
30 #include "chromeos/dbus/bluetooth_out_of_band_pairing_data.h" 25 #include "device/bluetooth/bluetooth_adapter.h"
26 #include "device/bluetooth/bluetooth_device.h"
27 #include "device/bluetooth/bluetooth_out_of_band_pairing_data.h"
28 #include "device/bluetooth/bluetooth_service_record.h"
29 #include "device/bluetooth/bluetooth_socket.h"
30 #include "device/bluetooth/bluetooth_utils.h"
31
32 using device_bluetooth::BluetoothAdapter;
31 33
32 namespace { 34 namespace {
33 35
34 chromeos::ExtensionBluetoothEventRouter* GetEventRouter(Profile* profile) { 36 chromeos::ExtensionBluetoothEventRouter* GetEventRouter(Profile* profile) {
35 return profile->GetExtensionService()->bluetooth_event_router(); 37 return profile->GetExtensionService()->bluetooth_event_router();
36 } 38 }
37 39
38 const chromeos::BluetoothAdapter& GetAdapter(Profile* profile) { 40 const device_bluetooth::BluetoothAdapter& GetAdapter(Profile* profile) {
39 return GetEventRouter(profile)->adapter(); 41 return GetEventRouter(profile)->adapter();
40 } 42 }
41 43
42 chromeos::BluetoothAdapter* GetMutableAdapter(Profile* profile) { 44 device_bluetooth::BluetoothAdapter* GetMutableAdapter(Profile* profile) {
43 chromeos::BluetoothAdapter* adapter = 45 device_bluetooth::BluetoothAdapter* adapter =
44 GetEventRouter(profile)->GetMutableAdapter(); 46 GetEventRouter(profile)->GetMutableAdapter();
45 CHECK(adapter); 47 CHECK(adapter);
46 return adapter; 48 return adapter;
47 } 49 }
48 50
49 } // namespace 51 } // namespace
50 #endif 52 #endif
51 53
52 namespace { 54 namespace {
53 55
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
96 98
97 bool BluetoothGetNameFunction::RunImpl() { 99 bool BluetoothGetNameFunction::RunImpl() {
98 SetResult(Value::CreateStringValue(GetAdapter(profile()).name())); 100 SetResult(Value::CreateStringValue(GetAdapter(profile()).name()));
99 return true; 101 return true;
100 } 102 }
101 103
102 BluetoothGetDevicesFunction::BluetoothGetDevicesFunction() 104 BluetoothGetDevicesFunction::BluetoothGetDevicesFunction()
103 : callbacks_pending_(0) {} 105 : callbacks_pending_(0) {}
104 106
105 void BluetoothGetDevicesFunction::DispatchDeviceSearchResult( 107 void BluetoothGetDevicesFunction::DispatchDeviceSearchResult(
106 const chromeos::BluetoothDevice& device) { 108 const device_bluetooth::BluetoothDevice& device) {
107 experimental_bluetooth::Device extension_device; 109 experimental_bluetooth::Device extension_device;
108 experimental_bluetooth::BluetoothDeviceToApiDevice(device, &extension_device); 110 experimental_bluetooth::BluetoothDeviceToApiDevice(device, &extension_device);
109 GetEventRouter(profile())->DispatchDeviceEvent( 111 GetEventRouter(profile())->DispatchDeviceEvent(
110 extensions::event_names::kBluetoothOnDeviceSearchResult, 112 extensions::event_names::kBluetoothOnDeviceSearchResult,
111 extension_device); 113 extension_device);
112 } 114 }
113 115
114 void BluetoothGetDevicesFunction::ProvidesServiceCallback( 116 void BluetoothGetDevicesFunction::ProvidesServiceCallback(
115 const chromeos::BluetoothDevice* device, 117 const device_bluetooth::BluetoothDevice* device,
116 bool providesService) { 118 bool providesService) {
117 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 119 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
118 120
119 CHECK(device); 121 CHECK(device);
120 if (providesService) 122 if (providesService)
121 DispatchDeviceSearchResult(*device); 123 DispatchDeviceSearchResult(*device);
122 124
123 callbacks_pending_--; 125 callbacks_pending_--;
124 if (callbacks_pending_ == -1) 126 if (callbacks_pending_ == -1)
125 SendResponse(true); 127 SendResponse(true);
126 } 128 }
127 129
128 bool BluetoothGetDevicesFunction::RunImpl() { 130 bool BluetoothGetDevicesFunction::RunImpl() {
129 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 131 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
130 132
131 scoped_ptr<GetDevices::Params> params(GetDevices::Params::Create(*args_)); 133 scoped_ptr<GetDevices::Params> params(GetDevices::Params::Create(*args_));
132 EXTENSION_FUNCTION_VALIDATE(params.get() != NULL); 134 EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
133 const experimental_bluetooth::GetDevicesOptions& options = params->options; 135 const experimental_bluetooth::GetDevicesOptions& options = params->options;
134 136
135 std::string uuid; 137 std::string uuid;
136 if (options.uuid.get() != NULL) { 138 if (options.uuid.get() != NULL) {
137 uuid = chromeos::bluetooth_utils::CanonicalUuid(*options.uuid.get()); 139 uuid = device_bluetooth::bluetooth_utils::CanonicalUuid(
140 *options.uuid.get());
138 if (uuid.empty()) { 141 if (uuid.empty()) {
139 SetError(kInvalidUuid); 142 SetError(kInvalidUuid);
140 return false; 143 return false;
141 } 144 }
142 } 145 }
143 146
144 CHECK_EQ(0, callbacks_pending_); 147 CHECK_EQ(0, callbacks_pending_);
145 148
146 chromeos::BluetoothAdapter::DeviceList devices = 149 BluetoothAdapter::DeviceList devices =
147 GetMutableAdapter(profile())->GetDevices(); 150 GetMutableAdapter(profile())->GetDevices();
148 for (chromeos::BluetoothAdapter::DeviceList::iterator i = devices.begin(); 151 for (BluetoothAdapter::DeviceList::iterator i = devices.begin();
149 i != devices.end(); ++i) { 152 i != devices.end(); ++i) {
150 chromeos::BluetoothDevice* device = *i; 153 device_bluetooth::BluetoothDevice* device = *i;
151 CHECK(device); 154 CHECK(device);
152 155
153 if (!uuid.empty() && !(device->ProvidesServiceWithUUID(uuid))) 156 if (!uuid.empty() && !(device->ProvidesServiceWithUUID(uuid)))
154 continue; 157 continue;
155 158
156 if (options.name.get() == NULL) { 159 if (options.name.get() == NULL) {
157 DispatchDeviceSearchResult(*device); 160 DispatchDeviceSearchResult(*device);
158 continue; 161 continue;
159 } 162 }
160 163
(...skipping 10 matching lines...) Expand all
171 // for-loop, which ensures that all requests have been made before 174 // for-loop, which ensures that all requests have been made before
172 // SendResponse happens. 175 // SendResponse happens.
173 if (callbacks_pending_ == -1) 176 if (callbacks_pending_ == -1)
174 SendResponse(true); 177 SendResponse(true);
175 178
176 return true; 179 return true;
177 } 180 }
178 181
179 void BluetoothGetServicesFunction::GetServiceRecordsCallback( 182 void BluetoothGetServicesFunction::GetServiceRecordsCallback(
180 base::ListValue* services, 183 base::ListValue* services,
181 const chromeos::BluetoothDevice::ServiceRecordList& records) { 184 const device_bluetooth::BluetoothDevice::ServiceRecordList& records) {
182 for (chromeos::BluetoothDevice::ServiceRecordList::const_iterator i = 185 for (device_bluetooth::BluetoothDevice::ServiceRecordList::const_iterator i =
183 records.begin(); i != records.end(); ++i) { 186 records.begin(); i != records.end(); ++i) {
184 const chromeos::BluetoothServiceRecord& record = **i; 187 const device_bluetooth::BluetoothServiceRecord& record = **i;
185 experimental_bluetooth::ServiceRecord api_record; 188 experimental_bluetooth::ServiceRecord api_record;
186 api_record.name = record.name(); 189 api_record.name = record.name();
187 if (!record.uuid().empty()) 190 if (!record.uuid().empty())
188 api_record.uuid.reset(new std::string(record.uuid())); 191 api_record.uuid.reset(new std::string(record.uuid()));
189 services->Append(api_record.ToValue().release()); 192 services->Append(api_record.ToValue().release());
190 } 193 }
191 194
192 SendResponse(true); 195 SendResponse(true);
193 } 196 }
194 197
195 void BluetoothGetServicesFunction::OnErrorCallback() { 198 void BluetoothGetServicesFunction::OnErrorCallback() {
196 SetError(kServiceDiscoveryFailed); 199 SetError(kServiceDiscoveryFailed);
197 SendResponse(false); 200 SendResponse(false);
198 } 201 }
199 202
200 bool BluetoothGetServicesFunction::RunImpl() { 203 bool BluetoothGetServicesFunction::RunImpl() {
201 scoped_ptr<GetServices::Params> params(GetServices::Params::Create(*args_)); 204 scoped_ptr<GetServices::Params> params(GetServices::Params::Create(*args_));
202 EXTENSION_FUNCTION_VALIDATE(params.get() != NULL); 205 EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
203 const experimental_bluetooth::GetServicesOptions& options = params->options; 206 const experimental_bluetooth::GetServicesOptions& options = params->options;
204 207
205 chromeos::BluetoothDevice* device = 208 device_bluetooth::BluetoothDevice* device =
206 GetMutableAdapter(profile())->GetDevice(options.device_address); 209 GetMutableAdapter(profile())->GetDevice(options.device_address);
207 if (!device) { 210 if (!device) {
208 SetError(kInvalidDevice); 211 SetError(kInvalidDevice);
209 return false; 212 return false;
210 } 213 }
211 214
212 ListValue* services = new ListValue; 215 ListValue* services = new ListValue;
213 SetResult(services); 216 SetResult(services);
214 217
215 device->GetServiceRecords( 218 device->GetServiceRecords(
216 base::Bind(&BluetoothGetServicesFunction::GetServiceRecordsCallback, 219 base::Bind(&BluetoothGetServicesFunction::GetServiceRecordsCallback,
217 this, 220 this,
218 services), 221 services),
219 base::Bind(&BluetoothGetServicesFunction::OnErrorCallback, 222 base::Bind(&BluetoothGetServicesFunction::OnErrorCallback,
220 this)); 223 this));
221 224
222 return true; 225 return true;
223 } 226 }
224 227
225 void BluetoothConnectFunction::ConnectToServiceCallback( 228 void BluetoothConnectFunction::ConnectToServiceCallback(
226 const chromeos::BluetoothDevice* device, 229 const device_bluetooth::BluetoothDevice* device,
227 const std::string& service_uuid, 230 const std::string& service_uuid,
228 scoped_refptr<chromeos::BluetoothSocket> socket) { 231 scoped_refptr<device_bluetooth::BluetoothSocket> socket) {
229 if (socket.get()) { 232 if (socket.get()) {
230 int socket_id = GetEventRouter(profile())->RegisterSocket(socket); 233 int socket_id = GetEventRouter(profile())->RegisterSocket(socket);
231 234
232 experimental_bluetooth::Socket result_socket; 235 experimental_bluetooth::Socket result_socket;
233 experimental_bluetooth::BluetoothDeviceToApiDevice( 236 experimental_bluetooth::BluetoothDeviceToApiDevice(
234 *device, &result_socket.device); 237 *device, &result_socket.device);
235 result_socket.service_uuid = service_uuid; 238 result_socket.service_uuid = service_uuid;
236 result_socket.id = socket_id; 239 result_socket.id = socket_id;
237 SetResult(result_socket.ToValue().release()); 240 SetResult(result_socket.ToValue().release());
238 SendResponse(true); 241 SendResponse(true);
239 } else { 242 } else {
240 SetError(kFailedToConnect); 243 SetError(kFailedToConnect);
241 SendResponse(false); 244 SendResponse(false);
242 } 245 }
243 } 246 }
244 247
245 bool BluetoothConnectFunction::RunImpl() { 248 bool BluetoothConnectFunction::RunImpl() {
246 scoped_ptr<Connect::Params> params(Connect::Params::Create(*args_)); 249 scoped_ptr<Connect::Params> params(Connect::Params::Create(*args_));
247 EXTENSION_FUNCTION_VALIDATE(params.get() != NULL); 250 EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
248 const experimental_bluetooth::ConnectOptions& options = params->options; 251 const experimental_bluetooth::ConnectOptions& options = params->options;
249 252
250 std::string uuid = chromeos::bluetooth_utils::CanonicalUuid( 253 std::string uuid = device_bluetooth::bluetooth_utils::CanonicalUuid(
251 options.service_uuid); 254 options.service_uuid);
252 if (uuid.empty()) { 255 if (uuid.empty()) {
253 SetError(kInvalidUuid); 256 SetError(kInvalidUuid);
254 return false; 257 return false;
255 } 258 }
256 259
257 chromeos::BluetoothDevice* device = 260 device_bluetooth::BluetoothDevice* device =
258 GetMutableAdapter(profile())->GetDevice(options.device_address); 261 GetMutableAdapter(profile())->GetDevice(options.device_address);
259 if (!device) { 262 if (!device) {
260 SetError(kInvalidDevice); 263 SetError(kInvalidDevice);
261 return false; 264 return false;
262 } 265 }
263 266
264 device->ConnectToService(uuid, 267 device->ConnectToService(uuid,
265 base::Bind(&BluetoothConnectFunction::ConnectToServiceCallback, 268 base::Bind(&BluetoothConnectFunction::ConnectToServiceCallback,
266 this, 269 this,
267 device, 270 device,
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
388 } 391 }
389 392
390 bool BluetoothSetOutOfBandPairingDataFunction::RunImpl() { 393 bool BluetoothSetOutOfBandPairingDataFunction::RunImpl() {
391 // TODO(bryeung): update to new-style parameter passing when ArrayBuffer 394 // TODO(bryeung): update to new-style parameter passing when ArrayBuffer
392 // support is added 395 // support is added
393 DictionaryValue* options; 396 DictionaryValue* options;
394 EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &options)); 397 EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &options));
395 std::string address; 398 std::string address;
396 EXTENSION_FUNCTION_VALIDATE(options->GetString("deviceAddress", &address)); 399 EXTENSION_FUNCTION_VALIDATE(options->GetString("deviceAddress", &address));
397 400
398 chromeos::BluetoothDevice* device = 401 device_bluetooth::BluetoothDevice* device =
399 GetMutableAdapter(profile())->GetDevice(address); 402 GetMutableAdapter(profile())->GetDevice(address);
400 if (!device) { 403 if (!device) {
401 SetError(kInvalidDevice); 404 SetError(kInvalidDevice);
402 return false; 405 return false;
403 } 406 }
404 407
405 if (options->HasKey("data")) { 408 if (options->HasKey("data")) {
406 DictionaryValue* data_in; 409 DictionaryValue* data_in;
407 EXTENSION_FUNCTION_VALIDATE(options->GetDictionary("data", &data_in)); 410 EXTENSION_FUNCTION_VALIDATE(options->GetDictionary("data", &data_in));
408 411
409 chromeos::BluetoothOutOfBandPairingData data_out; 412 device_bluetooth::BluetoothOutOfBandPairingData data_out;
410 413
411 base::BinaryValue* tmp_data; 414 base::BinaryValue* tmp_data;
412 EXTENSION_FUNCTION_VALIDATE(data_in->GetBinary("hash", &tmp_data)); 415 EXTENSION_FUNCTION_VALIDATE(data_in->GetBinary("hash", &tmp_data));
413 EXTENSION_FUNCTION_VALIDATE( 416 EXTENSION_FUNCTION_VALIDATE(
414 tmp_data->GetSize() == chromeos::kBluetoothOutOfBandPairingDataSize); 417 tmp_data->GetSize() ==
418 device_bluetooth::kBluetoothOutOfBandPairingDataSize);
415 memcpy(data_out.hash, 419 memcpy(data_out.hash,
416 reinterpret_cast<uint8_t*>(tmp_data->GetBuffer()), 420 reinterpret_cast<uint8_t*>(tmp_data->GetBuffer()),
417 chromeos::kBluetoothOutOfBandPairingDataSize); 421 device_bluetooth::kBluetoothOutOfBandPairingDataSize);
418 422
419 EXTENSION_FUNCTION_VALIDATE(data_in->GetBinary("randomizer", &tmp_data)); 423 EXTENSION_FUNCTION_VALIDATE(data_in->GetBinary("randomizer", &tmp_data));
420 EXTENSION_FUNCTION_VALIDATE( 424 EXTENSION_FUNCTION_VALIDATE(
421 tmp_data->GetSize() == chromeos::kBluetoothOutOfBandPairingDataSize); 425 tmp_data->GetSize() ==
426 device_bluetooth::kBluetoothOutOfBandPairingDataSize);
422 memcpy(data_out.randomizer, 427 memcpy(data_out.randomizer,
423 reinterpret_cast<uint8_t*>(tmp_data->GetBuffer()), 428 reinterpret_cast<uint8_t*>(tmp_data->GetBuffer()),
424 chromeos::kBluetoothOutOfBandPairingDataSize); 429 device_bluetooth::kBluetoothOutOfBandPairingDataSize);
425 430
426 device->SetOutOfBandPairingData( 431 device->SetOutOfBandPairingData(
427 data_out, 432 data_out,
428 base::Bind(&BluetoothSetOutOfBandPairingDataFunction::OnSuccessCallback, 433 base::Bind(&BluetoothSetOutOfBandPairingDataFunction::OnSuccessCallback,
429 this), 434 this),
430 base::Bind(&BluetoothSetOutOfBandPairingDataFunction::OnErrorCallback, 435 base::Bind(&BluetoothSetOutOfBandPairingDataFunction::OnErrorCallback,
431 this)); 436 this));
432 } else { 437 } else {
433 device->ClearOutOfBandPairingData( 438 device->ClearOutOfBandPairingData(
434 base::Bind(&BluetoothSetOutOfBandPairingDataFunction::OnSuccessCallback, 439 base::Bind(&BluetoothSetOutOfBandPairingDataFunction::OnSuccessCallback,
435 this), 440 this),
436 base::Bind(&BluetoothSetOutOfBandPairingDataFunction::OnErrorCallback, 441 base::Bind(&BluetoothSetOutOfBandPairingDataFunction::OnErrorCallback,
437 this)); 442 this));
438 } 443 }
439 444
440 return true; 445 return true;
441 } 446 }
442 447
443 void BluetoothGetLocalOutOfBandPairingDataFunction::ReadCallback( 448 void BluetoothGetLocalOutOfBandPairingDataFunction::ReadCallback(
444 const chromeos::BluetoothOutOfBandPairingData& data) { 449 const device_bluetooth::BluetoothOutOfBandPairingData& data) {
445 base::BinaryValue* hash = base::BinaryValue::CreateWithCopiedBuffer( 450 base::BinaryValue* hash = base::BinaryValue::CreateWithCopiedBuffer(
446 reinterpret_cast<const char*>(data.hash), 451 reinterpret_cast<const char*>(data.hash),
447 chromeos::kBluetoothOutOfBandPairingDataSize); 452 device_bluetooth::kBluetoothOutOfBandPairingDataSize);
448 base::BinaryValue* randomizer = base::BinaryValue::CreateWithCopiedBuffer( 453 base::BinaryValue* randomizer = base::BinaryValue::CreateWithCopiedBuffer(
449 reinterpret_cast<const char*>(data.randomizer), 454 reinterpret_cast<const char*>(data.randomizer),
450 chromeos::kBluetoothOutOfBandPairingDataSize); 455 device_bluetooth::kBluetoothOutOfBandPairingDataSize);
451 456
452 // TODO(bryeung): convert to experimental_bluetooth::OutOfBandPairingData 457 // TODO(bryeung): convert to experimental_bluetooth::OutOfBandPairingData
453 // when ArrayBuffer support within objects is completed. 458 // when ArrayBuffer support within objects is completed.
454 DictionaryValue* result = new DictionaryValue(); 459 DictionaryValue* result = new DictionaryValue();
455 result->Set("hash", hash); 460 result->Set("hash", hash);
456 result->Set("randomizer", randomizer); 461 result->Set("randomizer", randomizer);
457 462
458 SetResult(result); 463 SetResult(result);
459 464
460 SendResponse(true); 465 SendResponse(true);
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
610 #endif 615 #endif
611 616
612 BluetoothReadFunction::BluetoothReadFunction() {} 617 BluetoothReadFunction::BluetoothReadFunction() {}
613 BluetoothReadFunction::~BluetoothReadFunction() {} 618 BluetoothReadFunction::~BluetoothReadFunction() {}
614 619
615 BluetoothWriteFunction::BluetoothWriteFunction() {} 620 BluetoothWriteFunction::BluetoothWriteFunction() {}
616 BluetoothWriteFunction::~BluetoothWriteFunction() {} 621 BluetoothWriteFunction::~BluetoothWriteFunction() {}
617 622
618 } // namespace api 623 } // namespace api
619 } // namespace extensions 624 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698