summaryrefslogtreecommitdiff
path: root/network/radio/RadioManagerSample/cpp/SampleRadioManager.h
blob: a39673ed50b315e23ac67bb716179098329ee073 (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
#pragma once

typedef struct {
    CString    strRadioInstanceID;
    bool       fExisting;
    CComPtr<ISampleRadioInstanceInternal> spRadioInstance;
} INSTANCE_LIST_OBJ;

EXTERN_C const IID IID_IMediaRadioManagerNotifySink;

class ATL_NO_VTABLE CSampleRadioManager :
    public CComObjectRootEx<CComMultiThreadModel>,
    public CComCoClass<CSampleRadioManager, &CLSID_SampleRadioManager>,
    public IConnectionPointContainerImpl<CSampleRadioManager>,
    public IConnectionPointImpl<CSampleRadioManager, &IID_IMediaRadioManagerNotifySink>,
    public IMediaRadioManager,
    public ISampleRadioManagerInternal
{
public:

    DECLARE_CLASSFACTORY()
    DECLARE_NOT_AGGREGATABLE(CSampleRadioManager)

    DECLARE_NO_REGISTRY()

    BEGIN_COM_MAP(CSampleRadioManager)
        COM_INTERFACE_ENTRY(IMediaRadioManager)
        COM_INTERFACE_ENTRY(ISampleRadioManagerInternal)
        COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer)
    END_COM_MAP()

    BEGIN_CONNECTION_POINT_MAP(CSampleRadioManager)
        CONNECTION_POINT_ENTRY(IID_IMediaRadioManagerNotifySink)
    END_CONNECTION_POINT_MAP()

    DECLARE_PROTECT_FINAL_CONSTRUCT()

    CSampleRadioManager();

    HRESULT FinalConstruct();
    void    FinalRelease();

    // IMediaRadioManager interface
    IFACEMETHOD(GetRadioInstances)(_Out_ IRadioInstanceCollection **ppCollection);
    IFACEMETHOD(OnSystemRadioStateChange)(_In_ SYSTEM_RADIO_STATE sysRadioState, _In_ UINT32 uTimeoutSec);

    // ISampleRadioManagerInternal interface
    IFACEMETHOD(OnInstanceRadioChange)(_In_ BSTR bstrRadioInstanceID, _In_ DEVICE_RADIO_STATE radioState);

private:
    HRESULT _FireEventOnInstanceAdd(_In_ IRadioInstance *pRadioInstance);
    HRESULT _FireEventOnInstanceRemove(_In_ BSTR bstrRadioInstanceID);
    HRESULT _FireEventOnInstanceRadioChange(_In_ BSTR bstrRadioInstanceID, _In_ DEVICE_RADIO_STATE radioState);

    void    _Cleanup();
    HRESULT _AddInstance(_In_ PCWSTR pszKeyName, _Out_opt_ IRadioInstance **ppRadioInstance);
    void    _OnInstanceAddRemove();
    HRESULT _SetSysRadioState(_In_ SYSTEM_RADIO_STATE sysRadioState);
    static DWORD WINAPI s_ThreadRegChange(LPVOID pThis);
    static DWORD WINAPI s_ThreadSetSysRadio(LPVOID pThis);

    CComAutoCriticalSection       _criticalSection;
    CAtlList<INSTANCE_LIST_OBJ *> _listRadioInstances;

    CRegKey  _hKeyRoot;
    CHandle  _hRegChangeEvent;
    CHandle  _hEventThread;
    bool     _fClosing;   // object is closing

    static PCWSTR s_pszRootKey;
};

typedef struct _SET_SYS_RADIO_JOB{
    HRESULT hr;
    CHandle hEvent;
    CSampleRadioManager *pSampleRM;
    SYSTEM_RADIO_STATE  srsTarget;
} SET_SYS_RADIO_JOB;