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

Unified Diff: device/bluetooth/bluetooth_socket_win.cc

Issue 320463002: Bluetooth: Implement socket API for Windows. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: DeviceWin return SDRWin to avoid cast Created 6 years, 6 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_win.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_win.cc
diff --git a/device/bluetooth/bluetooth_socket_win.cc b/device/bluetooth/bluetooth_socket_win.cc
index 8c77651e8197f750e8cc608abc44730a7e4c0136..a46f4b5ec402fb573b0e7d7e457bc4a36b38dac7 100644
--- a/device/bluetooth/bluetooth_socket_win.cc
+++ b/device/bluetooth/bluetooth_socket_win.cc
@@ -11,9 +11,11 @@
#include "base/logging.h"
#include "base/memory/ref_counted.h"
#include "base/sequenced_task_runner.h"
+#include "base/strings/stringprintf.h"
#include "base/strings/sys_string_conversions.h"
#include "base/strings/utf_string_conversions.h"
#include "base/threading/thread_restrictions.h"
+#include "device/bluetooth/bluetooth_device_win.h"
#include "device/bluetooth/bluetooth_init_win.h"
#include "device/bluetooth/bluetooth_service_record_win.h"
#include "device/bluetooth/bluetooth_socket_thread.h"
@@ -31,9 +33,25 @@ const char kFailedToCreateSocket[] = "Failed to create socket.";
const char kFailedToBindSocket[] = "Failed to bind socket.";
const char kFailedToListenOnSocket[] = "Failed to listen on socket.";
const char kFailedToGetSockNameForSocket[] = "Failed to getsockname.";
-const char kBadUuid[] = "Bad uuid.";
+const char kFailedToAccept[] = "Failed to accept.";
+const char kInvalidUUID[] = "Invalid UUID";
const char kWsaSetServiceError[] = "WSASetService error.";
+std::string IPEndPointToBluetoothAddress(const net::IPEndPoint& end_point) {
+ if (end_point.address().size() != net::kBluetoothAddressSize)
+ return std::string();
+ // The address is copied from BTH_ADDR field of SOCKADDR_BTH, which is a
+ // 64-bit ULONGLONG that stores Bluetooth address in little-endian. Print in
+ // reverse order to preserve the correct ordering.
+ return base::StringPrintf("%02X:%02X:%02X:%02X:%02X:%02X",
+ end_point.address()[5],
+ end_point.address()[4],
+ end_point.address()[3],
+ end_point.address()[2],
+ end_point.address()[1],
+ end_point.address()[0]);
+}
+
} // namespace
namespace device {
@@ -80,37 +98,28 @@ BluetoothSocketWin::BluetoothSocketWin(
BluetoothSocketWin::~BluetoothSocketWin() {
}
-void BluetoothSocketWin::StartService(
- const BluetoothUUID& uuid,
- const std::string& name,
- int rfcomm_channel,
- const base::Closure& success_callback,
- const ErrorCompletionCallback& error_callback,
- const OnNewConnectionCallback& new_connection_callback) {
- DCHECK(ui_task_runner()->RunsTasksOnCurrentThread());
-
- socket_thread()->task_runner()->PostTask(
- FROM_HERE,
- base::Bind(&BluetoothSocketWin::DoStartService,
- this,
- uuid,
- name,
- rfcomm_channel,
- success_callback,
- error_callback,
- new_connection_callback));
-}
-
void BluetoothSocketWin::Connect(
- const BluetoothServiceRecord& service_record,
+ const BluetoothDeviceWin* device,
+ const BluetoothUUID& uuid,
const base::Closure& success_callback,
const ErrorCompletionCallback& error_callback) {
DCHECK(ui_task_runner()->RunsTasksOnCurrentThread());
+ DCHECK(device);
+
+ if (!uuid.IsValid()) {
+ error_callback.Run(kInvalidUUID);
+ return;
+ }
const BluetoothServiceRecordWin* service_record_win =
- static_cast<const BluetoothServiceRecordWin*>(&service_record);
+ device->GetServiceRecord(uuid);
+ if (!service_record_win) {
+ error_callback.Run(kInvalidUUID);
+ return;
+ }
+
device_address_ = service_record_win->address();
- if (service_record.SupportsRfcomm()) {
+ if (service_record_win->SupportsRfcomm()) {
supports_rfcomm_ = true;
rfcomm_channel_ = service_record_win->rfcomm_channel();
bth_addr_ = service_record_win->bth_addr();
@@ -126,6 +135,24 @@ void BluetoothSocketWin::Connect(
&BluetoothSocketWin::PostErrorCompletion, this, error_callback)));
}
+void BluetoothSocketWin::Listen(scoped_refptr<BluetoothAdapter> adapter,
+ const BluetoothUUID& uuid,
+ int rfcomm_channel,
+ const base::Closure& success_callback,
+ const ErrorCompletionCallback& error_callback) {
+ DCHECK(ui_task_runner()->RunsTasksOnCurrentThread());
+
+ adapter_ = adapter;
+
+ socket_thread()->task_runner()->PostTask(
+ FROM_HERE,
+ base::Bind(&BluetoothSocketWin::DoListen,
+ this,
+ uuid,
+ rfcomm_channel,
+ success_callback,
+ error_callback));
+}
void BluetoothSocketWin::ResetData() {
if (service_reg_data_) {
@@ -140,7 +167,14 @@ void BluetoothSocketWin::ResetData() {
void BluetoothSocketWin::Accept(
const AcceptCompletionCallback& success_callback,
const ErrorCompletionCallback& error_callback) {
- NOTIMPLEMENTED();
+ DCHECK(ui_task_runner()->RunsTasksOnCurrentThread());
+
+ socket_thread()->task_runner()->PostTask(
+ FROM_HERE,
+ base::Bind(&BluetoothSocketWin::DoAccept,
+ this,
+ success_callback,
+ error_callback));
}
void BluetoothSocketWin::DoConnect(
@@ -196,17 +230,13 @@ void BluetoothSocketWin::DoConnect(
success_callback.Run();
}
-void BluetoothSocketWin::DoStartService(
+void BluetoothSocketWin::DoListen(
const BluetoothUUID& uuid,
- const std::string& name,
int rfcomm_channel,
const base::Closure& success_callback,
- const ErrorCompletionCallback& error_callback,
- const OnNewConnectionCallback& new_connection_callback) {
+ const ErrorCompletionCallback& error_callback) {
DCHECK(socket_thread()->task_runner()->RunsTasksOnCurrentThread());
- DCHECK(!tcp_socket() &&
- !service_reg_data_ &&
- on_new_connection_callback_.is_null());
+ DCHECK(!tcp_socket() && !service_reg_data_);
// The valid range is 0-30. 0 means BT_PORT_ANY and 1-30 are the
// valid RFCOMM port numbers of SOCKADDR_BTH.
@@ -255,7 +285,7 @@ void BluetoothSocketWin::DoStartService(
}
scoped_ptr<ServiceRegData> reg_data(new ServiceRegData);
- reg_data->name = base::UTF8ToUTF16(name);
+ reg_data->name = base::UTF8ToUTF16(uuid.canonical_value());
if (getsockname(socket_fd, sock_addr, &sock_addr_len)) {
LOG(WARNING) << "Failed to start service: getsockname, "
@@ -275,8 +305,8 @@ void BluetoothSocketWin::DoStartService(
uuid.canonical_value()) + L"}";
if (!SUCCEEDED(CLSIDFromString(cannonical_uuid.c_str(), &reg_data->uuid))) {
LOG(WARNING) << "Failed to start service: "
- << ", bad uuid=" << cannonical_uuid;
- PostErrorCompletion(error_callback, kBadUuid);
+ << ", invalid uuid=" << cannonical_uuid;
+ PostErrorCompletion(error_callback, kInvalidUUID);
return;
}
@@ -298,26 +328,35 @@ void BluetoothSocketWin::DoStartService(
SetTCPSocket(scoped_socket.Pass());
service_reg_data_ = reg_data.Pass();
- on_new_connection_callback_ = new_connection_callback;
- DoAccept();
PostSuccess(success_callback);
}
-void BluetoothSocketWin::DoAccept() {
+void BluetoothSocketWin::DoAccept(
+ const AcceptCompletionCallback& success_callback,
+ const ErrorCompletionCallback& error_callback) {
DCHECK(socket_thread()->task_runner()->RunsTasksOnCurrentThread());
int result = tcp_socket()->Accept(
&accept_socket_,
&accept_address_,
- base::Bind(&BluetoothSocketWin::OnAcceptOnSocketThread, this));
- if (result != net::OK && result != net::ERR_IO_PENDING)
+ base::Bind(&BluetoothSocketWin::OnAcceptOnSocketThread,
+ this,
+ success_callback,
+ error_callback));
+ if (result != net::OK && result != net::ERR_IO_PENDING) {
LOG(WARNING) << "Failed to accept, net err=" << result;
+ PostErrorCompletion(error_callback, kFailedToAccept);
+ }
}
-void BluetoothSocketWin::OnAcceptOnSocketThread(int accept_result) {
+void BluetoothSocketWin::OnAcceptOnSocketThread(
+ const AcceptCompletionCallback& success_callback,
+ const ErrorCompletionCallback& error_callback,
+ int accept_result) {
DCHECK(socket_thread()->task_runner()->RunsTasksOnCurrentThread());
if (accept_result != net::OK) {
LOG(WARNING) << "OnAccept error, net err=" << accept_result;
+ PostErrorCompletion(error_callback, kFailedToAccept);
return;
}
@@ -326,23 +365,35 @@ void BluetoothSocketWin::OnAcceptOnSocketThread(int accept_result) {
base::Bind(&BluetoothSocketWin::OnAcceptOnUI,
this,
base::Passed(&accept_socket_),
- accept_address_));
- DoAccept();
+ accept_address_,
+ success_callback,
+ error_callback));
}
void BluetoothSocketWin::OnAcceptOnUI(
scoped_ptr<net::TCPSocket> accept_socket,
- const net::IPEndPoint& peer_address) {
+ const net::IPEndPoint& peer_address,
+ const AcceptCompletionCallback& success_callback,
+ const ErrorCompletionCallback& error_callback) {
DCHECK(ui_task_runner()->RunsTasksOnCurrentThread());
- scoped_refptr<BluetoothSocketWin> peer = CreateBluetoothSocket(
+ const std::string peer_device_address =
+ IPEndPointToBluetoothAddress(peer_address);
+ const BluetoothDevice* peer_device = adapter_->GetDevice(peer_device_address);
+ if (!peer_device) {
+ LOG(WARNING) << "OnAccept failed with unknown device, addr="
+ << peer_device_address;
+ error_callback.Run(kFailedToAccept);
+ return;
+ }
+
+ scoped_refptr<BluetoothSocketWin> peer_socket = CreateBluetoothSocket(
ui_task_runner(),
socket_thread(),
net_log(),
source());
- peer->SetTCPSocket(accept_socket.Pass());
-
- on_new_connection_callback_.Run(peer, peer_address);
+ peer_socket->SetTCPSocket(accept_socket.Pass());
+ success_callback.Run(peer_device, peer_socket);
}
} // namespace device
« no previous file with comments | « device/bluetooth/bluetooth_socket_win.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698