Index: chrome/browser/extensions/api/bluetooth_socket/bluetooth_socket_api.cc |
diff --git a/chrome/browser/extensions/api/bluetooth_socket/bluetooth_socket_api.cc b/chrome/browser/extensions/api/bluetooth_socket/bluetooth_socket_api.cc |
index 12213598455d054db6ed1fe2a83d6c51d3abf887..184311bd7ee6577aab59e39f8105026f07fe0752 100644 |
--- a/chrome/browser/extensions/api/bluetooth_socket/bluetooth_socket_api.cc |
+++ b/chrome/browser/extensions/api/bluetooth_socket/bluetooth_socket_api.cc |
@@ -45,9 +45,8 @@ linked_ptr<SocketInfo> CreateSocketInfo(int socket_id, |
socket_info->paused = socket->paused(); |
socket_info->connected = socket->IsConnected(); |
- // TODO(keybuk): These should not be present if socket isn't connected or |
- // listening. |
- socket_info->address.reset(new std::string(socket->device_address())); |
+ if (socket->IsConnected()) |
armansito
2014/05/08 22:00:16
Does IsConnected imply listening?
keybuk
2014/05/08 22:02:46
A BluetoothApiSocket can be:
- created
- connect
armansito
2014/05/08 22:25:14
OK. I commented on this because your previous comm
|
+ socket_info->address.reset(new std::string(socket->device_address())); |
socket_info->uuid.reset(new std::string(socket->uuid().canonical_value())); |
return socket_info; |
@@ -223,22 +222,195 @@ void BluetoothSocketSetPausedFunction::Work() { |
results_ = bluetooth_socket::SetPaused::Results::Create(); |
} |
-bool BluetoothSocketListenUsingRfcommFunction::RunAsync() { |
- // TODO(keybuk): Implement. |
- SetError("Not yet implemented."); |
- return false; |
+BluetoothSocketListenFunction::BluetoothSocketListenFunction() {} |
+ |
+BluetoothSocketListenFunction::~BluetoothSocketListenFunction() {} |
+ |
+bool BluetoothSocketListenFunction::Prepare() { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ if (!CreateParams()) |
+ return false; |
+ socket_event_dispatcher_ = GetSocketEventDispatcher(browser_context()); |
+ return socket_event_dispatcher_ != NULL; |
+} |
+ |
+void BluetoothSocketListenFunction::AsyncWorkStart() { |
+ DCHECK(BrowserThread::CurrentlyOn(work_thread_id())); |
+ device::BluetoothAdapterFactory::GetAdapter( |
+ base::Bind(&BluetoothSocketListenFunction::OnGetAdapter, this)); |
+} |
+ |
+void BluetoothSocketListenFunction::OnGetAdapter( |
+ scoped_refptr<device::BluetoothAdapter> adapter) { |
+ DCHECK(BrowserThread::CurrentlyOn(work_thread_id())); |
+ BluetoothApiSocket* socket = GetSocket(socket_id()); |
+ if (!socket) { |
+ error_ = kSocketNotFoundError; |
+ AsyncWorkCompleted(); |
+ return; |
+ } |
+ |
+ device::BluetoothUUID bluetooth_uuid(uuid()); |
+ if (!bluetooth_uuid.IsValid()) { |
+ error_ = kInvalidUuidError; |
+ AsyncWorkCompleted(); |
+ return; |
+ } |
+ |
+ BluetoothPermissionRequest param(uuid()); |
+ if (!BluetoothManifestData::CheckRequest(GetExtension(), param)) { |
+ error_ = kPermissionDeniedError; |
+ AsyncWorkCompleted(); |
+ return; |
+ } |
+ |
+ CreateService( |
+ adapter, |
+ bluetooth_uuid, |
+ base::Bind(&BluetoothSocketListenFunction::OnCreateService, this), |
+ base::Bind(&BluetoothSocketListenFunction::OnCreateServiceError, this)); |
+} |
+ |
+ |
+void BluetoothSocketListenFunction::OnCreateService( |
+ scoped_refptr<device::BluetoothSocket> socket) { |
+ DCHECK(BrowserThread::CurrentlyOn(work_thread_id())); |
+ |
+ // Fetch the socket again since this is not a reference-counted object, and |
+ // it may have gone away in the meantime (we check earlier to avoid making |
+ // a connection in the case of an obvious programming error). |
+ BluetoothApiSocket* api_socket = GetSocket(socket_id()); |
+ if (!api_socket) { |
+ error_ = kSocketNotFoundError; |
+ AsyncWorkCompleted(); |
+ return; |
+ } |
+ |
+ api_socket->AdoptListeningSocket(socket, |
+ device::BluetoothUUID(uuid())); |
+ socket_event_dispatcher_->OnSocketListen(extension_id(), socket_id()); |
+ |
+ CreateResults(); |
+ AsyncWorkCompleted(); |
} |
-bool BluetoothSocketListenUsingInsecureRfcommFunction::RunAsync() { |
- // TODO(keybuk): Implement. |
- SetError("Not yet implemented."); |
- return false; |
+void BluetoothSocketListenFunction::OnCreateServiceError( |
+ const std::string& message) { |
+ DCHECK(BrowserThread::CurrentlyOn(work_thread_id())); |
+ error_ = message; |
+ AsyncWorkCompleted(); |
+} |
+ |
+BluetoothSocketListenUsingRfcommFunction:: |
+ BluetoothSocketListenUsingRfcommFunction() {} |
+ |
+BluetoothSocketListenUsingRfcommFunction:: |
+ ~BluetoothSocketListenUsingRfcommFunction() {} |
+ |
+int BluetoothSocketListenUsingRfcommFunction::socket_id() const { |
+ return params_->socket_id; |
+} |
+ |
+const std::string& BluetoothSocketListenUsingRfcommFunction::uuid() const { |
+ return params_->uuid; |
+} |
+ |
+bool BluetoothSocketListenUsingRfcommFunction::CreateParams() { |
+ params_ = bluetooth_socket::ListenUsingRfcomm::Params::Create(*args_); |
+ EXTENSION_FUNCTION_VALIDATE(params_.get()); |
+ return true; |
+} |
+ |
+void BluetoothSocketListenUsingRfcommFunction::CreateService( |
+ scoped_refptr<device::BluetoothAdapter> adapter, |
+ const device::BluetoothUUID& uuid, |
+ const device::BluetoothAdapter::CreateServiceCallback& callback, |
+ const device::BluetoothAdapter::CreateServiceErrorCallback& |
+ error_callback) { |
+ int channel = params_->channel; |
+ if (!channel) |
+ channel = device::BluetoothAdapter::kChannelAuto; |
+ |
+ adapter->CreateRfcommService(uuid, channel, false, callback, error_callback); |
+} |
+ |
+void BluetoothSocketListenUsingRfcommFunction::CreateResults() { |
+ results_ = bluetooth_socket::ListenUsingRfcomm::Results::Create(); |
+} |
+ |
+BluetoothSocketListenUsingInsecureRfcommFunction:: |
+ BluetoothSocketListenUsingInsecureRfcommFunction() {} |
+ |
+BluetoothSocketListenUsingInsecureRfcommFunction:: |
+ ~BluetoothSocketListenUsingInsecureRfcommFunction() {} |
+ |
+int BluetoothSocketListenUsingInsecureRfcommFunction::socket_id() const { |
+ return params_->socket_id; |
+} |
+ |
+const std::string& |
+BluetoothSocketListenUsingInsecureRfcommFunction::uuid() const { |
+ return params_->uuid; |
+} |
+ |
+bool BluetoothSocketListenUsingInsecureRfcommFunction::CreateParams() { |
+ params_ = bluetooth_socket::ListenUsingInsecureRfcomm::Params::Create(*args_); |
+ EXTENSION_FUNCTION_VALIDATE(params_.get()); |
+ return true; |
+} |
+ |
+void BluetoothSocketListenUsingInsecureRfcommFunction::CreateService( |
+ scoped_refptr<device::BluetoothAdapter> adapter, |
+ const device::BluetoothUUID& uuid, |
+ const device::BluetoothAdapter::CreateServiceCallback& callback, |
+ const device::BluetoothAdapter::CreateServiceErrorCallback& |
+ error_callback) { |
+ int channel = params_->channel; |
+ if (!channel) |
+ channel = device::BluetoothAdapter::kChannelAuto; |
+ |
+ adapter->CreateRfcommService(uuid, channel, true, callback, error_callback); |
+} |
+ |
+void BluetoothSocketListenUsingInsecureRfcommFunction::CreateResults() { |
+ results_ = bluetooth_socket::ListenUsingInsecureRfcomm::Results::Create(); |
+} |
+ |
+BluetoothSocketListenUsingL2capFunction:: |
+ BluetoothSocketListenUsingL2capFunction() {} |
+ |
+BluetoothSocketListenUsingL2capFunction:: |
+ ~BluetoothSocketListenUsingL2capFunction() {} |
+ |
+int BluetoothSocketListenUsingL2capFunction::socket_id() const { |
+ return params_->socket_id; |
+} |
+ |
+const std::string& BluetoothSocketListenUsingL2capFunction::uuid() const { |
+ return params_->uuid; |
+} |
+ |
+bool BluetoothSocketListenUsingL2capFunction::CreateParams() { |
+ params_ = bluetooth_socket::ListenUsingL2cap::Params::Create(*args_); |
+ EXTENSION_FUNCTION_VALIDATE(params_.get()); |
+ return true; |
+} |
+ |
+void BluetoothSocketListenUsingL2capFunction::CreateService( |
+ scoped_refptr<device::BluetoothAdapter> adapter, |
+ const device::BluetoothUUID& uuid, |
+ const device::BluetoothAdapter::CreateServiceCallback& callback, |
+ const device::BluetoothAdapter::CreateServiceErrorCallback& |
+ error_callback) { |
+ int psm = params_->psm; |
+ if (!psm) |
+ psm = device::BluetoothAdapter::kPsmAuto; |
+ |
+ adapter->CreateL2capService(uuid, psm, callback, error_callback); |
} |
-bool BluetoothSocketListenUsingL2capFunction::RunAsync() { |
- // TODO(keybuk): Implement. |
- SetError("Not yet implemented."); |
- return false; |
+void BluetoothSocketListenUsingL2capFunction::CreateResults() { |
+ results_ = bluetooth_socket::ListenUsingL2cap::Results::Create(); |
} |
BluetoothSocketConnectFunction::BluetoothSocketConnectFunction() {} |