Home | History | Annotate | Download | only in geolocation
      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.
      4 
      5 #include "content/browser/geolocation/wifi_data_provider_common_win.h"
      6 
      7 #include <assert.h>
      8 
      9 #include "base/strings/utf_string_conversions.h"
     10 #include "content/browser/geolocation/wifi_data_provider_common.h"
     11 
     12 namespace content {
     13 
     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),
     23                     data.Ssid.SsidLength,
     24                     &access_point_data->ssid);
     25   return true;
     26 }
     27 
     28 int GetDataFromBssIdList(const NDIS_802_11_BSSID_LIST& bss_id_list,
     29                          int list_size,
     30                          WifiData::AccessPointDataSet* data) {
     31   // Walk through the BSS IDs.
     32   int found = 0;
     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) {
     42       break;
     43     }
     44     AccessPointData access_point_data;
     45     if (ConvertToAccessPointData(*bss_id, &access_point_data)) {
     46       data->insert(access_point_data);
     47       ++found;
     48     }
     49     // Move to the next BSS ID.
     50     iterator += bss_id->Length;
     51   }
     52   return found;
     53 }
     54 
     55 }  // namespace content
     56