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

Unified Diff: device/bluetooth/bluetooth_socket_mac.mm

Issue 243963002: Implement Bluetooth server socket support for RFCOMM on Mac. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Short url Created 6 years, 8 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « device/bluetooth/bluetooth_socket_mac.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: device/bluetooth/bluetooth_socket_mac.mm
diff --git a/device/bluetooth/bluetooth_socket_mac.mm b/device/bluetooth/bluetooth_socket_mac.mm
index 2eb4ff460e1f52b2206307f8d17cfe8fa58f5587..c33243040bcb4e2c2671ff6c0e3114517b83f4f7 100644
--- a/device/bluetooth/bluetooth_socket_mac.mm
+++ b/device/bluetooth/bluetooth_socket_mac.mm
@@ -4,15 +4,14 @@
#include "device/bluetooth/bluetooth_socket_mac.h"
-#import <IOBluetooth/objc/IOBluetoothDevice.h>
-#import <IOBluetooth/objc/IOBluetoothRFCOMMChannel.h>
-#import <IOBluetooth/objc/IOBluetoothSDPServiceRecord.h>
+#import <IOBluetooth/IOBluetooth.h>
#include <limits>
#include <sstream>
#include <string>
#include "base/basictypes.h"
+#include "base/bind.h"
#include "base/callback_helpers.h"
#include "base/memory/ref_counted.h"
#include "base/numerics/safe_conversions.h"
@@ -107,16 +106,26 @@ BluetoothSocketMac::ConnectCallbacks::ConnectCallbacks() {}
BluetoothSocketMac::ConnectCallbacks::~ConnectCallbacks() {}
// static
-scoped_refptr<BluetoothSocketMac> BluetoothSocketMac::CreateBluetoothSocket(
- IOBluetoothSDPServiceRecord* record) {
- return new BluetoothSocketMac(record);
+void BluetoothSocketMac::Connect(
+ IOBluetoothSDPServiceRecord* record,
+ const ConnectSuccessCallback& success_callback,
+ const ErrorCompletionCallback& error_callback) {
+ scoped_refptr<BluetoothSocketMac> socket(new BluetoothSocketMac());
+ socket->ConnectImpl(record, success_callback, error_callback);
}
-BluetoothSocketMac::BluetoothSocketMac(
- IOBluetoothSDPServiceRecord* record)
- : record_([record retain]),
- delegate_([[BluetoothRFCOMMChannelDelegate alloc] initWithSocket:this]) {
- DCHECK(thread_checker_.CalledOnValidThread());
+// static
+void BluetoothSocketMac::AcceptConnection(
+ IOBluetoothRFCOMMChannel* rfcomm_channel,
+ const ConnectSuccessCallback& success_callback,
+ const ErrorCompletionCallback& error_callback) {
+ scoped_refptr<BluetoothSocketMac> socket(new BluetoothSocketMac());
+ socket->AcceptConnectionImpl(
+ rfcomm_channel, success_callback, error_callback);
+}
+
+BluetoothSocketMac::BluetoothSocketMac()
+ : delegate_([[BluetoothRFCOMMChannelDelegate alloc] initWithSocket:this]) {
}
BluetoothSocketMac::~BluetoothSocketMac() {
@@ -140,8 +149,9 @@ void BluetoothSocketMac::ReleaseChannel() {
empty_queue(send_queue_);
}
-void BluetoothSocketMac::Connect(
- const base::Closure& success_callback,
+void BluetoothSocketMac::ConnectImpl(
+ IOBluetoothSDPServiceRecord* record,
+ const ConnectSuccessCallback& success_callback,
const ErrorCompletionCallback& error_callback) {
DCHECK(thread_checker_.CalledOnValidThread());
@@ -156,14 +166,14 @@ void BluetoothSocketMac::Connect(
}
uint8 rfcomm_channel_id;
- IOReturn status = [record_ getRFCOMMChannelID:&rfcomm_channel_id];
+ IOReturn status = [record getRFCOMMChannelID:&rfcomm_channel_id];
if (status != kIOReturnSuccess) {
// TODO(youngki) add support for L2CAP sockets as well.
error_callback.Run(kL2CAPNotSupported);
return;
}
- IOBluetoothDevice* device = [record_ device];
+ IOBluetoothDevice* device = [record device];
IOBluetoothRFCOMMChannel* rfcomm_channel;
status = [device openRFCOMMChannelAsync:&rfcomm_channel
withChannelID:rfcomm_channel_id
@@ -177,10 +187,22 @@ void BluetoothSocketMac::Connect(
return;
}
+ AcceptConnectionImpl(rfcomm_channel, success_callback, error_callback);
+}
+
+void BluetoothSocketMac::AcceptConnectionImpl(
+ IOBluetoothRFCOMMChannel* rfcomm_channel,
+ const ConnectSuccessCallback& success_callback,
+ const ErrorCompletionCallback& error_callback) {
connect_callbacks_.reset(new ConnectCallbacks());
- connect_callbacks_->success_callback = success_callback;
+ connect_callbacks_->success_callback =
+ base::Bind(success_callback, scoped_refptr<BluetoothSocketMac>(this));
connect_callbacks_->error_callback = error_callback;
- rfcomm_channel_.reset(rfcomm_channel);
+
+ // Note: It's important to set the connect callbacks *prior* to setting the
+ // delegate, as setting the delegate can synchronously call into
+ // OnChannelOpened().
+ rfcomm_channel_.reset([rfcomm_channel retain]);
[rfcomm_channel_ setDelegate:delegate_];
}
@@ -196,7 +218,8 @@ void BluetoothSocketMac::OnChannelOpened(
ReleaseChannel();
std::stringstream error;
error << "Failed to connect bluetooth socket ("
- << base::SysNSStringToUTF8([[record_ device] addressString]) << "): ("
+ << base::SysNSStringToUTF8(
+ [[rfcomm_channel_ getDevice] addressString]) << "): ("
<< status << ")";
temp->error_callback.Run(error.str());
return;
@@ -316,7 +339,8 @@ void BluetoothSocketMac::Send(scoped_refptr<net::IOBuffer> buffer,
if (status != kIOReturnSuccess) {
std::stringstream error;
error << "Failed to connect bluetooth socket ("
- << base::SysNSStringToUTF8([[record_ device] addressString])
+ << base::SysNSStringToUTF8(
+ [[rfcomm_channel_ getDevice] addressString])
<< "): (" << status << ")";
// Remember the first error only
if (request->status == kIOReturnSuccess)
@@ -371,7 +395,8 @@ void BluetoothSocketMac::OnChannelWriteComplete(
if (!request->error_signaled) {
std::stringstream error;
error << "Failed to connect bluetooth socket ("
- << base::SysNSStringToUTF8([[record_ device] addressString])
+ << base::SysNSStringToUTF8(
+ [[rfcomm_channel_ getDevice] addressString])
<< "): (" << status << ")";
request->error_signaled = true;
request->error_callback.Run(error.str());
« no previous file with comments | « device/bluetooth/bluetooth_socket_mac.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698