chromium/device/bluetooth/test/fake_gatt_characteristics_result_winrt.cc

// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "device/bluetooth/test/fake_gatt_characteristics_result_winrt.h"

#include "base/win/vector.h"
#include "device/bluetooth/test/fake_gatt_characteristic_winrt.h"

namespace {

using ABI::Windows::Foundation::Collections::IVectorView;
using ABI::Windows::Foundation::IReference;
using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
    GattCharacteristic;
using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
    GattCommunicationStatus;
using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
    GattCommunicationStatus_Success;
using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
    IGattCharacteristic;
using Microsoft::WRL::ComPtr;
using Microsoft::WRL::Make;

}  // namespace

// Note: As UWP does not provide GattCharacteristic specializations for
// IObservableVector, VectorChangedEventHandler and IVector we need to supply
// our own. UUIDs were generated using `uuidgen`.
namespace ABI {
namespace Windows {
namespace Foundation {
namespace Collections {

template <>
struct __declspec(uuid("423c3781-7383-4e38-ad42-01b0d9ee160e"))
    IObservableVector<GattCharacteristic*>
    : IObservableVector_impl<
          Internal::AggregateType<GattCharacteristic*, IGattCharacteristic*>> {
};

template <>
struct __declspec(uuid("b334a2e8-90d1-48fc-8893-aecea6b23202"))
    VectorChangedEventHandler<GattCharacteristic*>
    : VectorChangedEventHandler_impl<
          Internal::AggregateType<GattCharacteristic*, IGattCharacteristic*>> {
};

template <>
struct __declspec(
    uuid("072c852b-da31-4d46-884d-3a3a2157c986")) IVector<GattCharacteristic*>
    : IVector_impl<
          Internal::AggregateType<GattCharacteristic*, IGattCharacteristic*>> {
};

}  // namespace Collections
}  // namespace Foundation
}  // namespace Windows
}  // namespace ABI

namespace device {

FakeGattCharacteristicsResultWinrt::FakeGattCharacteristicsResultWinrt(
    const std::vector<ComPtr<FakeGattCharacteristicWinrt>>&
        fake_characteristics)
    : characteristics_(fake_characteristics.begin(),
                       fake_characteristics.end()) {}

FakeGattCharacteristicsResultWinrt::~FakeGattCharacteristicsResultWinrt() =
    default;

HRESULT FakeGattCharacteristicsResultWinrt::get_Status(
    GattCommunicationStatus* value) {
  *value = GattCommunicationStatus_Success;
  return S_OK;
}

HRESULT FakeGattCharacteristicsResultWinrt::get_ProtocolError(
    IReference<uint8_t>** value) {
  return E_NOTIMPL;
}

HRESULT FakeGattCharacteristicsResultWinrt::get_Characteristics(
    IVectorView<GattCharacteristic*>** value) {
  return Make<base::win::Vector<GattCharacteristic*>>(characteristics_)
      ->GetView(value);
}

}  // namespace device