Index: chrome/browser/chromeos/bluetooth/bluetooth_socket.cc |
diff --git a/chrome/browser/chromeos/bluetooth/bluetooth_socket.cc b/chrome/browser/chromeos/bluetooth/bluetooth_socket.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..40c96e4ba8413f9d29baac7945558408e2513bcf |
--- /dev/null |
+++ b/chrome/browser/chromeos/bluetooth/bluetooth_socket.cc |
@@ -0,0 +1,57 @@ |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/chromeos/bluetooth/bluetooth_socket.h" |
+ |
+#include <vector> |
+ |
+#include <bluetooth/bluetooth.h> |
+#include <bluetooth/rfcomm.h> |
+#include <errno.h> |
+#include <sys/socket.h> |
+#include <sys/types.h> |
+ |
+#include "chrome/browser/chromeos/bluetooth/bluetooth_service_record.h" |
+#include "chrome/browser/chromeos/bluetooth/bluetooth_utils.h" |
+ |
+namespace chromeos { |
+ |
+BluetoothSocket::BluetoothSocket(const std::string& address, int fd) |
+ : address_(address), |
+ fd_(fd) { |
+} |
+ |
+BluetoothSocket::~BluetoothSocket() { |
+ close(fd_); |
+} |
+ |
+// static |
+scoped_refptr<BluetoothSocket> BluetoothSocket::CreateBluetoothSocket( |
+ const BluetoothServiceRecord& service_record) { |
+ BluetoothSocket* bluetooth_socket = NULL; |
+ if (service_record.SupportsRfcomm()) { |
+ int socket_fd = socket( |
+ AF_BLUETOOTH, SOCK_STREAM | SOCK_NONBLOCK, BTPROTO_RFCOMM); |
+ struct sockaddr_rc socket_address = { 0 }; |
+ socket_address.rc_family = AF_BLUETOOTH; |
+ socket_address.rc_channel = service_record.rfcomm_channel(); |
+ bdaddr_t bluetooth_address; |
+ bluetooth_utils::str2ba(service_record.address(), &bluetooth_address); |
+ |
+ int status = connect(socket_fd, (struct sockaddr *)&socket_address, |
+ sizeof(socket_address)); |
+ if (status == 0 || errno == EINPROGRESS) |
+ bluetooth_socket = new BluetoothSocket(service_record.address(), |
+ socket_fd); |
+ else |
+ close(socket_fd); |
+ } else { |
+ // TODO(bryeung): add support for L2CAP sockets as well. |
+ return NULL; |
+ } |
+ |
+ return scoped_refptr<BluetoothSocket>(bluetooth_socket); |
+} |
+ |
+} // namespace chromeos |