Index: device/bluetooth/bluetooth_task_manager_win.cc |
diff --git a/device/bluetooth/bluetooth_task_manager_win.cc b/device/bluetooth/bluetooth_task_manager_win.cc |
index 3347f0f17534fd3e501a4addf56b0cbfca2453fc..74b81fba6d1d88e700f190400c08972bc068735d 100644 |
--- a/device/bluetooth/bluetooth_task_manager_win.cc |
+++ b/device/bluetooth/bluetooth_task_manager_win.cc |
@@ -30,6 +30,8 @@ const int kMaxNumDeviceAddressChar = 127; |
const int kServiceDiscoveryResultBufferSize = 5000; |
const int kMaxDeviceDiscoveryTimeout = 48; |
+typedef device::BluetoothTaskManagerWin::ServiceRecordState ServiceRecordState; |
+ |
// Populates bluetooth adapter state using adapter_handle. |
void GetAdapterState(HANDLE adapter_handle, |
device::BluetoothTaskManagerWin::AdapterState* state) { |
@@ -71,6 +73,46 @@ void GetDeviceState(const BLUETOOTH_DEVICE_INFO& device_info, |
state->authenticated = !!device_info.fAuthenticated; |
} |
+void DiscoverDeviceServices( |
+ const std::string& device_address, |
+ const GUID& protocol_uuid, |
+ ScopedVector<ServiceRecordState>* service_record_states) { |
+ // Bluetooth and WSAQUERYSET for Service Inquiry. See http://goo.gl/2v9pyt. |
+ WSAQUERYSET sdp_query; |
+ ZeroMemory(&sdp_query, sizeof(sdp_query)); |
+ sdp_query.dwSize = sizeof(sdp_query); |
+ GUID protocol = protocol_uuid; |
+ sdp_query.lpServiceClassId = &protocol; |
+ sdp_query.dwNameSpace = NS_BTH; |
+ wchar_t device_address_context[kMaxNumDeviceAddressChar]; |
+ std::size_t length = base::SysUTF8ToWide("(" + device_address + ")").copy( |
+ device_address_context, kMaxNumDeviceAddressChar); |
+ device_address_context[length] = NULL; |
+ sdp_query.lpszContext = device_address_context; |
+ HANDLE sdp_handle; |
+ if (ERROR_SUCCESS != |
+ WSALookupServiceBegin(&sdp_query, LUP_RETURN_ALL, &sdp_handle)) { |
+ return; |
+ } |
+ char sdp_buffer[kServiceDiscoveryResultBufferSize]; |
+ LPWSAQUERYSET sdp_result_data = reinterpret_cast<LPWSAQUERYSET>(sdp_buffer); |
+ DWORD sdp_buffer_size = sizeof(sdp_buffer); |
+ while (ERROR_SUCCESS == |
+ WSALookupServiceNext( |
+ sdp_handle, LUP_RETURN_ALL, &sdp_buffer_size, sdp_result_data)) { |
+ ServiceRecordState* service_record_state = new ServiceRecordState(); |
+ service_record_state->name = |
+ base::SysWideToUTF8(sdp_result_data->lpszServiceInstanceName); |
+ service_record_state->address = device_address; |
+ for (uint64 i = 0; i < sdp_result_data->lpBlob->cbSize; i++) { |
+ service_record_state->sdp_bytes.push_back( |
+ sdp_result_data->lpBlob->pBlobData[i]); |
+ } |
+ service_record_states->push_back(service_record_state); |
+ } |
+ WSALookupServiceEnd(sdp_handle); |
+} |
+ |
} // namespace |
namespace device { |
@@ -375,41 +417,56 @@ void BluetoothTaskManagerWin::DiscoverServices( |
const std::string device_address = (*iter)->address; |
ScopedVector<ServiceRecordState>* service_record_states = |
&(*iter)->service_record_states; |
- WSAQUERYSET sdp_query; |
- ZeroMemory(&sdp_query, sizeof(sdp_query)); |
- sdp_query.dwSize = sizeof(sdp_query); |
- GUID protocol = L2CAP_PROTOCOL_UUID; |
- sdp_query.lpServiceClassId = &protocol; |
- sdp_query.dwNameSpace = NS_BTH; |
- wchar_t device_address_context[kMaxNumDeviceAddressChar]; |
- std::size_t length = |
- base::SysUTF8ToWide("(" + device_address + ")").copy( |
- device_address_context, kMaxNumDeviceAddressChar); |
- device_address_context[length] = NULL; |
- sdp_query.lpszContext = device_address_context; |
- HANDLE sdp_handle; |
- if (ERROR_SUCCESS != |
- WSALookupServiceBegin(&sdp_query, LUP_RETURN_ALL, &sdp_handle)) { |
- return; |
- } |
- char sdp_buffer[kServiceDiscoveryResultBufferSize]; |
- LPWSAQUERYSET sdp_result_data = reinterpret_cast<LPWSAQUERYSET>(sdp_buffer); |
- DWORD sdp_buffer_size = sizeof(sdp_buffer); |
- while (ERROR_SUCCESS == WSALookupServiceNext(sdp_handle, |
- LUP_RETURN_ALL, |
- &sdp_buffer_size, |
- sdp_result_data)) { |
- ServiceRecordState* service_record_state = new ServiceRecordState(); |
- service_record_state->name = |
- base::SysWideToUTF8(sdp_result_data->lpszServiceInstanceName); |
- service_record_state->address = device_address; |
- for (uint64 i = 0; i < sdp_result_data->lpBlob->cbSize; i++) { |
- service_record_state->sdp_bytes.push_back( |
- sdp_result_data->lpBlob->pBlobData[i]); |
- } |
- service_record_states->push_back(service_record_state); |
- } |
- WSALookupServiceEnd(sdp_handle); |
+ |
+ // TODO(rpaquay): Find a better way to enumerate registered protocols. |
+ DiscoverDeviceServices( |
+ device_address, SDP_PROTOCOL_UUID, service_record_states); |
+ DiscoverDeviceServices( |
+ device_address, UDP_PROTOCOL_UUID, service_record_states); |
+ DiscoverDeviceServices( |
+ device_address, RFCOMM_PROTOCOL_UUID, service_record_states); |
+ DiscoverDeviceServices( |
+ device_address, TCP_PROTOCOL_UUID, service_record_states); |
+ DiscoverDeviceServices( |
+ device_address, TCSBIN_PROTOCOL_UUID, service_record_states); |
+ DiscoverDeviceServices( |
+ device_address, TCSAT_PROTOCOL_UUID, service_record_states); |
+ DiscoverDeviceServices( |
+ device_address, OBEX_PROTOCOL_UUID, service_record_states); |
+ DiscoverDeviceServices( |
+ device_address, IP_PROTOCOL_UUID, service_record_states); |
+ DiscoverDeviceServices( |
+ device_address, FTP_PROTOCOL_UUID, service_record_states); |
+ DiscoverDeviceServices( |
+ device_address, HTTP_PROTOCOL_UUID, service_record_states); |
+ DiscoverDeviceServices( |
+ device_address, WSP_PROTOCOL_UUID, service_record_states); |
+ DiscoverDeviceServices( |
+ device_address, BNEP_PROTOCOL_UUID, service_record_states); |
+ DiscoverDeviceServices( |
+ device_address, UPNP_PROTOCOL_UUID, service_record_states); |
+ DiscoverDeviceServices( |
+ device_address, HID_PROTOCOL_UUID, service_record_states); |
+ DiscoverDeviceServices( |
+ device_address, HCCC_PROTOCOL_UUID, service_record_states); |
+ DiscoverDeviceServices( |
+ device_address, HCDC_PROTOCOL_UUID, service_record_states); |
+ DiscoverDeviceServices( |
+ device_address, HN_PROTOCOL_UUID, service_record_states); |
+ DiscoverDeviceServices( |
+ device_address, AVCTP_PROTOCOL_UUID, service_record_states); |
+ DiscoverDeviceServices( |
+ device_address, AVDTP_PROTOCOL_UUID, service_record_states); |
+ DiscoverDeviceServices( |
+ device_address, CMPT_PROTOCOL_UUID, service_record_states); |
+ DiscoverDeviceServices( |
+ device_address, UDI_C_PLANE_PROTOCOL_UUID, service_record_states); |
+ DiscoverDeviceServices( |
+ device_address, L2CAP_PROTOCOL_UUID, service_record_states); |
xiyuan
2014/03/17 22:55:11
It seems we only need enumerate L2CAP_PROTOCOL_UUI
rpaquay
2014/03/20 00:48:18
Done.
|
+ |
+ // TODO(rpaquay): Workaround issue where this profile is not discovered. |
+ DiscoverDeviceServices( |
+ device_address, OBEXObjectPushServiceClass_UUID, service_record_states); |
} |
} |