//
//  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/scan_settings.h"

namespace bluetooth {

ScanSettings::ScanSettings()
    : mode_(MODE_LOW_POWER),
      callback_type_(CALLBACK_TYPE_ALL_MATCHES),
      result_type_(RESULT_TYPE_FULL),
      match_count_per_filter_(MATCH_COUNT_MAX_ADVERTISEMENTS) {}

ScanSettings::ScanSettings(Mode mode, CallbackTypeBitField callback_type,
                           ResultType result_type,
                           base::TimeDelta report_delay_ms,
                           MatchMode match_mode,
                           MatchCount match_count_per_filter)
    : mode_(mode),
      callback_type_(callback_type),
      result_type_(result_type),
      report_delay_ms_(report_delay_ms),
      match_mode_(match_mode),
      match_count_per_filter_(match_count_per_filter) {}

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

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

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

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

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

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

  return true;
}

}  // namespace bluetooth
