Index: device/bluetooth/bluetooth_socket_mac.h |
diff --git a/device/bluetooth/bluetooth_socket_mac.h b/device/bluetooth/bluetooth_socket_mac.h |
index 806eceb9f3ff99854ca7c83e3e1b081c16bfedf4..76e197ddf6f0798d930778ac2c102a56ea0339c5 100644 |
--- a/device/bluetooth/bluetooth_socket_mac.h |
+++ b/device/bluetooth/bluetooth_socket_mac.h |
@@ -5,9 +5,15 @@ |
#ifndef DEVICE_BLUETOOTH_BLUETOOTH_SOCKET_MAC_H_ |
#define DEVICE_BLUETOOTH_BLUETOOTH_SOCKET_MAC_H_ |
+#include <queue> |
#include <string> |
+#include <IOKit/IOreturn.h> |
+ |
+#include "base/memory/linked_ptr.h" |
#include "base/memory/ref_counted.h" |
+#include "base/sequenced_task_runner.h" |
+#include "base/threading/thread_checker.h" |
#include "device/bluetooth/bluetooth_socket.h" |
#ifdef __OBJC__ |
@@ -21,8 +27,8 @@ class IOBluetoothSDPServiceRecord; |
#endif |
namespace net { |
-class GrowableIOBuffer; |
class IOBuffer; |
+class IOBufferWithSize; |
} // namespace net |
namespace device { |
@@ -30,16 +36,20 @@ namespace device { |
class BluetoothServiceRecord; |
// This class is an implementation of BluetoothSocket class for OSX platform. |
+// All methods of this class must all be called on the UI thread, as per Chrome |
+// guidelines on performing Async IO on UI thread on MacOS. |
class BluetoothSocketMac : public BluetoothSocket { |
public: |
- // TODO(youngki): This method is deprecated; remove this method when |
- // BluetoothServiceRecord is removed. |
- static scoped_refptr<BluetoothSocket> CreateBluetoothSocket( |
- const BluetoothServiceRecord& service_record); |
- |
- static scoped_refptr<BluetoothSocket> CreateBluetoothSocket( |
+ static scoped_refptr<BluetoothSocketMac> CreateBluetoothSocket( |
+ const scoped_refptr<base::SequencedTaskRunner>& ui_task_runner, |
IOBluetoothSDPServiceRecord* record); |
+ // Connect to the peer device and calls |success_callback| when the |
+ // connection has been established successfully. If an error occurs, calls |
+ // |error_callback| with a system error message. |
+ void Connect(const base::Closure& success_callback, |
+ const ErrorCompletionCallback& error_callback); |
+ |
// Overriden from BluetoothSocket: |
virtual void Close() OVERRIDE; |
virtual void Disconnect(const base::Closure& callback) OVERRIDE; |
@@ -53,22 +63,77 @@ class BluetoothSocketMac : public BluetoothSocket { |
const ErrorCompletionCallback& error_callback) OVERRIDE; |
// called by BluetoothRFCOMMChannelDelegate. |
- void OnDataReceived(IOBluetoothRFCOMMChannel* rfcomm_channel, |
- void* data, |
- size_t length); |
+ void OnChannelOpened(IOBluetoothRFCOMMChannel* rfcomm_channel, |
+ IOReturn status); |
+ |
+ // called by BluetoothRFCOMMChannelDelegate. |
+ void OnChannelClosed(IOBluetoothRFCOMMChannel* rfcomm_channel); |
+ |
+ // called by BluetoothRFCOMMChannelDelegate. |
+ void OnChannelDataReceived(IOBluetoothRFCOMMChannel* rfcomm_channel, |
+ void* data, |
+ size_t length); |
+ |
+ // called by BluetoothRFCOMMChannelDelegate. |
+ void OnChannelWriteComplete(IOBluetoothRFCOMMChannel* rfcomm_channel, |
+ void* refcon, |
+ IOReturn status); |
protected: |
virtual ~BluetoothSocketMac(); |
private: |
- explicit BluetoothSocketMac(IOBluetoothRFCOMMChannel* rfcomm_channel); |
- |
- void ResetIncomingDataBuffer(); |
+ BluetoothSocketMac( |
+ const scoped_refptr<base::SequencedTaskRunner>& ui_task_runner, |
+ IOBluetoothSDPServiceRecord* record); |
- IOBluetoothRFCOMMChannel* rfcomm_channel_; |
+ struct SendRequest { |
+ SendRequest(); |
+ ~SendRequest(); |
+ int buffer_size; |
+ SendCompletionCallback success_callback; |
+ ErrorCompletionCallback error_callback; |
+ IOReturn status; |
+ int active_async_writes; |
+ bool error_signaled; |
+ }; |
+ |
+ struct ReceiveCallbacks { |
+ ReceiveCallbacks(); |
+ ~ReceiveCallbacks(); |
+ ReceiveCompletionCallback success_callback; |
+ ReceiveErrorCompletionCallback error_callback; |
+ }; |
+ |
+ struct ConnectCallbacks { |
+ ConnectCallbacks(); |
+ ~ConnectCallbacks(); |
+ base::Closure success_callback; |
+ ErrorCompletionCallback error_callback; |
+ }; |
+ |
+ void ReleaseChannel(); |
+ |
+ bool connecting() const { return connect_callbacks_; } |
+ |
+ // Used to verify all methods are called on the same thread. |
+ base::ThreadChecker thread_checker_; |
+ // Task Runner for the UI thread, used to post tasks. |
+ scoped_refptr<base::SequencedTaskRunner> ui_task_runner_; |
+ // (retained) The Bluetooth Service definition. |
+ IOBluetoothSDPServiceRecord* record_; |
+ // (weak) The RFCOMM channel delegate. Released when the channel is closed. |
BluetoothRFCOMMChannelDelegate* delegate_; |
- scoped_refptr<net::GrowableIOBuffer> incoming_data_buffer_; |
- std::string error_message_; |
+ // (retained) The IOBluetooth RFCOMM channel used to issue commands. |
+ IOBluetoothRFCOMMChannel* rfcomm_channel_; |
+ // Connection callbacks -- when a pending async connection is active. |
+ scoped_ptr<ConnectCallbacks> connect_callbacks_; |
+ // Packets received while there is no pending "receive" callback. |
+ std::queue<scoped_refptr<net::IOBufferWithSize> > receive_queue_; |
+ // Receive callbacks -- when a receive call is active. |
+ scoped_ptr<ReceiveCallbacks> receive_callbacks_; |
+ // Send queue -- one entry per pending send operation. |
+ std::queue<linked_ptr<SendRequest> > send_queue_; |
DISALLOW_COPY_AND_ASSIGN(BluetoothSocketMac); |
}; |