//
//  Copyright (C) 2015 Google, Inc.
//
//  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.
//

#include "bluetooth/advertise_settings.h"

namespace bluetooth {

AdvertiseSettings::AdvertiseSettings(Mode mode, base::TimeDelta timeout,
                                     TxPowerLevel tx_power_level,
                                     bool connectable)
    : mode_(mode),
      timeout_(timeout),
      tx_power_level_(tx_power_level),
      connectable_(connectable) {}

// Default values are taken from the AdvertiseSettings.java
AdvertiseSettings::AdvertiseSettings()
    : mode_(MODE_LOW_POWER),
      tx_power_level_(TX_POWER_LEVEL_MEDIUM),
      connectable_(true) {}

bool AdvertiseSettings::operator==(const AdvertiseSettings& rhs) const {
  if (mode_ != rhs.mode_) return false;

  if (timeout_ != rhs.timeout_) return false;

  if (tx_power_level_ != rhs.tx_power_level_) return false;

  if (connectable_ != rhs.connectable_) return false;

  return true;
}

}  // namespace bluetooth
