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

Unified Diff: device/bluetooth/bluetooth_task_manager_win.cc

Issue 476823003: Fix Bluetooth Classic device polling issue. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address code review feedback. Created 6 years, 4 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_task_manager_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_task_manager_win.cc
diff --git a/device/bluetooth/bluetooth_task_manager_win.cc b/device/bluetooth/bluetooth_task_manager_win.cc
index db2540b12e77ddf41d8132c8b1ab5a904e590c6a..d89c1a03fde3b11707bd23b2ebff4132d2fb77f4 100644
--- a/device/bluetooth/bluetooth_task_manager_win.cc
+++ b/device/bluetooth/bluetooth_task_manager_win.cc
@@ -537,6 +537,28 @@ bool BluetoothTaskManagerWin::DiscoverClassicDeviceServices(
const GUID& protocol_uuid,
bool search_cached_services_only,
ScopedVector<ServiceRecordState>* service_record_states) {
+ int error_code =
+ DiscoverClassicDeviceServicesWorker(device_address,
+ protocol_uuid,
+ search_cached_services_only,
+ service_record_states);
+ // If the device is "offline", no services are returned when specifying
+ // "LUP_FLUSHCACHE". Try again without flushing the cache so that the list
+ // of previously known services is returned.
+ if (!search_cached_services_only &&
+ (error_code == WSASERVICE_NOT_FOUND || error_code == WSANO_DATA)) {
+ error_code = DiscoverClassicDeviceServicesWorker(
+ device_address, protocol_uuid, true, service_record_states);
+ }
+
+ return (error_code == ERROR_SUCCESS);
+}
+
+int BluetoothTaskManagerWin::DiscoverClassicDeviceServicesWorker(
+ const std::string& device_address,
+ const GUID& protocol_uuid,
+ bool search_cached_services_only,
+ 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));
@@ -562,8 +584,15 @@ bool BluetoothTaskManagerWin::DiscoverClassicDeviceServices(
HANDLE sdp_handle;
if (ERROR_SUCCESS !=
WSALookupServiceBegin(&sdp_query, control_flags, &sdp_handle)) {
- LogPollingError("Error calling WSALookupServiceBegin", WSAGetLastError());
- return false;
+ int last_error = WSAGetLastError();
+ // If the device is "offline", no services are returned when specifying
+ // "LUP_FLUSHCACHE". Don't log error in that case.
+ if (!search_cached_services_only &&
+ (last_error == WSASERVICE_NOT_FOUND || last_error == WSANO_DATA)) {
+ return last_error;
+ }
+ LogPollingError("Error calling WSALookupServiceBegin", last_error);
+ return last_error;
}
char sdp_buffer[kServiceDiscoveryResultBufferSize];
LPWSAQUERYSET sdp_result_data = reinterpret_cast<LPWSAQUERYSET>(sdp_buffer);
@@ -578,7 +607,7 @@ bool BluetoothTaskManagerWin::DiscoverClassicDeviceServices(
}
LogPollingError("Error calling WSALookupServiceNext", last_error);
WSALookupServiceEnd(sdp_handle);
- return false;
+ return last_error;
}
ServiceRecordState* service_record_state = new ServiceRecordState();
service_record_state->name =
@@ -590,11 +619,12 @@ bool BluetoothTaskManagerWin::DiscoverClassicDeviceServices(
service_record_states->push_back(service_record_state);
}
if (ERROR_SUCCESS != WSALookupServiceEnd(sdp_handle)) {
- LogPollingError("Error calling WSALookupServiceEnd", WSAGetLastError());
- return false;
+ int last_error = WSAGetLastError();
+ LogPollingError("Error calling WSALookupServiceEnd", last_error);
+ return last_error;
}
- return true;
+ return ERROR_SUCCESS;
}
bool BluetoothTaskManagerWin::DiscoverLowEnergyDeviceServices(
« no previous file with comments | « device/bluetooth/bluetooth_task_manager_win.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698