/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef WIFICOND_SCANNING_SCAN_RESULT_H_
#define WIFICOND_SCANNING_SCAN_RESULT_H_

#include <vector>

#include <binder/Parcel.h>
#include <binder/Parcelable.h>

#include "wificond/scanning/radio_chain_info.h"

namespace com {
namespace android {
namespace server {
namespace wifi {
namespace wificond {

// This is the class to represent a scan result for wificond internal use.
class NativeScanResult : public ::android::Parcelable {
 public:
  NativeScanResult() = default;
  NativeScanResult(std::vector<uint8_t>& ssid,
                   std::vector<uint8_t>& bssid,
                   std::vector<uint8_t>& info_element,
                   uint32_t frequency,
                   int32_t signal_mbm,
                   uint64_t tsf,
                   uint16_t capability,
                   bool associated,
                   std::vector<RadioChainInfo>& radio_chain_infos);
  ::android::status_t writeToParcel(::android::Parcel* parcel) const override;
  ::android::status_t readFromParcel(const ::android::Parcel* parcel) override;

  void DebugLog();

  // SSID of the BSS.
  std::vector<uint8_t> ssid;
  // BSSID of the BSS.
  std::vector<uint8_t> bssid;
  // Binary array containing the raw information elements from the probe
  // response/beacon.
  std::vector<uint8_t> info_element;
  // Frequency in MHz.
  uint32_t frequency;
  // Signal strength of probe response/beacon in (100 * dBm).
  int32_t signal_mbm;
  // TSF of the received probe response/beacon.
  uint64_t tsf;
  // This is a bit mask describing the capabilities of a BSS.
  // See IEEE Std 802.11: 8.4.1.4
  // Bit 0 - ESS
  // Bit 1 - IBSS
  // Bit 2 - CF Pollable
  // Bit 3 - CF-Poll Request
  // Bit 4 - Privacy
  // Bit 5 - Short Preamble
  // Bit 6 - PBCC
  // Bit 7 - Channel Agility
  // Bit 8 - Spectrum Mgmt
  // Bit 9 - QoS
  // Bit 10 - Short Slot Time
  // Bit 11 - APSD
  // Bit 12 - Radio Measurement
  // Bit 13 - DSSS-OFDM
  // Bit 14 - Delayed Block Ack
  // Bit 15 - Immediate Block Ack
  uint16_t capability;
  bool associated;
  std::vector<RadioChainInfo> radio_chain_infos;
};

}  // namespace wificond
}  // namespace wifi
}  // namespace server
}  // namespace android
}  // namespace com

#endif  // WIFICOND_SCANNING_SCAN_RESULT_H_
