// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef DEVICE_BLUETOOTH_BLUETOOTH_SERVICE_RECORD_WIN_H_
#define DEVICE_BLUETOOTH_BLUETOOTH_SERVICE_RECORD_WIN_H_

#include <stdint.h>

#include <string>
#include <vector>

#include "base/macros.h"
#include "device/bluetooth/bluetooth_export.h"
#include "device/bluetooth/bluetooth_init_win.h"
#include "device/bluetooth/bluetooth_uuid.h"

namespace device {

class DEVICE_BLUETOOTH_EXPORT BluetoothServiceRecordWin {
 public:
  BluetoothServiceRecordWin(const std::string& device_address,
                            const std::string& name,
                            const std::vector<uint8_t>& sdp_bytes,
                            const BluetoothUUID& gatt_uuid);

  bool IsEqual(const BluetoothServiceRecordWin& other);

  // The BTH_ADDR address of the BluetoothDevice providing this service.
  BTH_ADDR device_bth_addr() const { return device_bth_addr_; }

  // The address of the BluetoothDevice providing this service.
  const std::string& device_address() const { return device_address_; }

  // The human-readable name of this service.
  const std::string& name() const { return name_; }

  // The UUID of the service.  This field may be empty if no UUID was
  // specified in the service record.
  const BluetoothUUID& uuid() const { return uuid_; }

  // Indicates if this service supports RFCOMM communication.
  bool SupportsRfcomm() const { return supports_rfcomm_; }

  // The RFCOMM channel to use, if this service supports RFCOMM communication.
  // The return value is undefined if SupportsRfcomm() returns false.
  uint8_t rfcomm_channel() const { return rfcomm_channel_; }

 private:
  BTH_ADDR device_bth_addr_;
  std::string device_address_;
  std::string name_;
  BluetoothUUID uuid_;

  bool supports_rfcomm_;
  uint8_t rfcomm_channel_;

  DISALLOW_COPY_AND_ASSIGN(BluetoothServiceRecordWin);
};

}  // namespace device

#endif  // DEVICE_BLUETOOTH_BLUETOOTH_SERVICE_RECORD_WIN_H_
