summaryrefslogtreecommitdiff
path: root/network/radio/RadioManagerSample/cpp/SampleInstanceCollection.cpp
blob: 5a4371de513b41f773572d0378e5477c3042496a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include "precomp.h"
#pragma hdrstop

HRESULT CRadioInstanceCollection_CreateInstance(
    _In_                            DWORD cInstances,
    _In_reads_(cInstances)          IRadioInstance **rgpIRadioInstance,
    _COM_Outptr_                    IRadioInstanceCollection **ppInstanceCollection)
{
    return CRadioInstanceCollection::CreateInstance(cInstances, rgpIRadioInstance, ppInstanceCollection);
}

void CRadioInstanceCollection::FinalRelease()
{
    POSITION p;
    while (nullptr != (p = _listRadioInstances.GetHeadPosition()))
    {
        IRadioInstance *pRadioInstance = _listRadioInstances.GetAt(p);
        pRadioInstance->Release();
        _listRadioInstances.SetAt(p, nullptr);
        _listRadioInstances.RemoveHeadNoReturn();
    }
}

// static
HRESULT CRadioInstanceCollection::CreateInstance(
    _In_                            DWORD cInstances,
    _In_reads_(cInstances)       IRadioInstance **rgpIRadioInstance,
    _COM_Outptr_                    IRadioInstanceCollection **ppInstanceCollection)
{
    HRESULT hr;
    CComObject<CRadioInstanceCollection> *pInstanceCollection;
    CComPtr<IRadioInstanceCollection> spInstanceCollection;

    *ppInstanceCollection = nullptr;

    hr = CComObject<CRadioInstanceCollection>::CreateInstance(&pInstanceCollection);

    if (SUCCEEDED(hr) && (pInstanceCollection != nullptr))
    {
        hr = pInstanceCollection->QueryInterface(IID_PPV_ARGS(&spInstanceCollection));
    }

    if (SUCCEEDED(hr) && (pInstanceCollection != nullptr))
    {
        for (DWORD dwIndex = 0; dwIndex < cInstances; dwIndex++)
        {
            _ATLTRY
            {
                pInstanceCollection->_listRadioInstances.AddTail(rgpIRadioInstance[dwIndex]);
                rgpIRadioInstance[dwIndex]->AddRef();
            }
            _ATLCATCH(e)
            {
                hr = e;
                break;
            }
        }
    }

    if (SUCCEEDED(hr))
    {
        *ppInstanceCollection = spInstanceCollection.Detach();
    }

    return hr;
}

IFACEMETHODIMP CRadioInstanceCollection::GetCount(_Out_ UINT32 *pcInstance)
{
    if (nullptr == pcInstance)
    {
        return E_INVALIDARG;
    }

    *pcInstance = static_cast<UINT32>(_listRadioInstances.GetCount());
    return S_OK;
}

IFACEMETHODIMP CRadioInstanceCollection::GetAt(_In_ UINT32 uIndex, _COM_Outptr_ IRadioInstance **ppRadioInstance)
{
    if (nullptr == ppRadioInstance)
    {
        return E_INVALIDARG;
    }

    HRESULT hr;
    *ppRadioInstance = nullptr;

    POSITION p = _listRadioInstances.FindIndex(uIndex);
    *ppRadioInstance = _listRadioInstances.GetAt(p);
    if (nullptr != *ppRadioInstance)
    {
        (*ppRadioInstance)->AddRef();
        hr = S_OK;
    }
    else
    {
        hr = E_FAIL;
    }

    return hr;
}