2025-11-28 00:35:46 +09:00

178 lines
4.2 KiB
C++

// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright (c) Microsoft Corporation. All rights reserved.
#pragma once
class CCallBack
{
public:
virtual HRESULT Call(
const CONTENT_ID /*contentId*/,
ISideShowContent** /*ppIContent*/
){return S_FALSE;}
virtual HRESULT Call(
ISideShowCapabilities* /*pICapabilities*/,
const DWORD /*dwEventId*/,
const DWORD /*dwEventSize*/,
const BYTE* /*pbEventData*/
){return S_FALSE;}
virtual HRESULT Call(
ISideShowCapabilities* /*pIDevice*/
){return S_FALSE;}
};
template <class T>
class CContentMissingEvent : public CCallBack
{
private:
HRESULT (T::*m_fpt)(const CONTENT_ID contentId, ISideShowContent** ppIContent);
T* m_pInstance;
public:
CContentMissingEvent(
T* pInstance,
HRESULT(T::*fpt)(const CONTENT_ID contentId, ISideShowContent** ppIContent)
)
{
m_pInstance = pInstance;
m_fpt = fpt;
}
virtual HRESULT Call(
const CONTENT_ID contentId,
ISideShowContent** ppIContent
)
{
return (*m_pInstance.*m_fpt)(contentId, ppIContent);
}
};
template <class T>
class CApplicationEvent : public CCallBack
{
private:
HRESULT (T::*m_fpt)(ISideShowCapabilities* pICapabilities,
const DWORD dwEventId,
const DWORD dwEventSize,
const BYTE* pbEventData);
T* m_pInstance;
public:
CApplicationEvent(
T* pInstance,
HRESULT(T::*fpt)(ISideShowCapabilities* pICapabilities,
const DWORD dwEventId,
const DWORD dwEventSize,
const BYTE* pbEventData)
)
{
m_pInstance = pInstance;
m_fpt = fpt;
}
virtual HRESULT Call(
ISideShowCapabilities* pICapabilities,
const DWORD dwEventId,
const DWORD dwEventSize,
const BYTE* pbEventData
)
{
return (*m_pInstance.*m_fpt)(pICapabilities,
dwEventId,
dwEventSize,
pbEventData);
}
};
template <class T>
class CDeviceEvent : public CCallBack
{
private:
HRESULT (T::*m_fpt)(ISideShowCapabilities* pIDevice);
T* m_pInstance;
public:
CDeviceEvent(
T* pInstance,
HRESULT(T::*fpt)(ISideShowCapabilities* pIDevice)
)
{
m_pInstance = pInstance;
m_fpt = fpt;
}
virtual HRESULT Call(
ISideShowCapabilities* pIDevice
)
{
return (*m_pInstance.*m_fpt)(pIDevice);
}
};
class CBaseEvents : public ISideShowEvents
{
private:
LONG m_nRef;
CCallBack* m_pDeviceAddEvent;
CCallBack* m_pDeviceRemoveEvent;
CCallBack* m_pContentMissingEvent;
CCallBack* m_pApplicationEventEvent;
protected:
//
// ISideShowEvents methods
//
STDMETHOD(ContentMissing)(
const CONTENT_ID contentId,
ISideShowContent** ppIContent
);
STDMETHOD(ApplicationEvent)(
ISideShowCapabilities* pICapabilities,
const DWORD dwEventId,
const DWORD dwEventSize,
const BYTE* pbEventData
);
STDMETHOD(DeviceAdded)(
ISideShowCapabilities* pIDevice
);
STDMETHOD(DeviceRemoved)(
ISideShowCapabilities* pIDevice
);
public:
//
// IUnknown methods
//
STDMETHOD_(ULONG, AddRef)();
STDMETHOD_(ULONG, Release)();
STDMETHOD(QueryInterface)(
REFIID riid,
LPVOID* ppvObject
);
CBaseEvents();
virtual ~CBaseEvents();
public:
//
// Event Registration methods
//
void RegisterDeviceAddEvent(CCallBack* pCallBack);
void RegisterDeviceRemoveEvent(CCallBack* pCallBack);
void RegisterContentMissingEvent(CCallBack* pCallBack);
void RegisterApplicationEvent(CCallBack* pCallBack);
};