1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "content/browser/geolocation/wifi_data_provider_common_win.h"
9 #include "base/strings/utf_string_conversions.h"
10 #include "content/browser/geolocation/wifi_data_provider_common.h"
14 bool ConvertToAccessPointData(const NDIS_WLAN_BSSID
& data
,
15 AccessPointData
*access_point_data
) {
16 // Currently we get only MAC address, signal strength and SSID.
17 // TODO(steveblock): Work out how to get age, channel and signal-to-noise.
18 DCHECK(access_point_data
);
19 access_point_data
->mac_address
= MacAddressAsString16(data
.MacAddress
);
20 access_point_data
->radio_signal_strength
= data
.Rssi
;
21 // Note that _NDIS_802_11_SSID::Ssid::Ssid is not null-terminated.
22 base::UTF8ToUTF16(reinterpret_cast<const char*>(data
.Ssid
.Ssid
),
24 &access_point_data
->ssid
);
28 int GetDataFromBssIdList(const NDIS_802_11_BSSID_LIST
& bss_id_list
,
30 WifiData::AccessPointDataSet
* data
) {
31 // Walk through the BSS IDs.
33 const uint8
*iterator
= reinterpret_cast<const uint8
*>(&bss_id_list
.Bssid
[0]);
34 const uint8
*end_of_buffer
=
35 reinterpret_cast<const uint8
*>(&bss_id_list
) + list_size
;
36 for (int i
= 0; i
< static_cast<int>(bss_id_list
.NumberOfItems
); ++i
) {
37 const NDIS_WLAN_BSSID
*bss_id
=
38 reinterpret_cast<const NDIS_WLAN_BSSID
*>(iterator
);
39 // Check that the length of this BSS ID is reasonable.
40 if (bss_id
->Length
< sizeof(NDIS_WLAN_BSSID
) ||
41 iterator
+ bss_id
->Length
> end_of_buffer
) {
44 AccessPointData access_point_data
;
45 if (ConvertToAccessPointData(*bss_id
, &access_point_data
)) {
46 data
->insert(access_point_data
);
49 // Move to the next BSS ID.
50 iterator
+= bss_id
->Length
;
55 } // namespace content