#include "stdafx.h" using namespace ABI::Windows::UI::Notifications; ToastEventHandler::ToastEventHandler() : _ref(1), _callback(nullptr), _arg(nullptr) { } ToastEventHandler::ToastEventHandler(_In_ pEventHandler callback, _In_ void* arg) : _ref(1), _callback(callback), _arg(arg) { } ToastEventHandler::~ToastEventHandler() { mir_free(_arg); } IFACEMETHODIMP_(ULONG) ToastEventHandler::AddRef() { return InterlockedIncrement(&_ref); } IFACEMETHODIMP_(ULONG) ToastEventHandler::Release() { ULONG l = InterlockedDecrement(&_ref); if (l == 0) delete this; return l; } IFACEMETHODIMP ToastEventHandler::QueryInterface(_In_ REFIID riid, _COM_Outptr_ void **ppv) { if (IsEqualIID(riid, IID_IUnknown)) *ppv = static_cast(static_cast(this)); else if (IsEqualIID(riid, __uuidof(DesktopToastActivatedEventHandler))) *ppv = static_cast(this); else if (IsEqualIID(riid, __uuidof(DesktopToastDismissedEventHandler))) *ppv = static_cast(this); else if (IsEqualIID(riid, __uuidof(DesktopToastFailedEventHandler))) *ppv = static_cast(this); else *ppv = nullptr; if (*ppv) { reinterpret_cast(*ppv)->AddRef(); return S_OK; } return E_NOINTERFACE; } IFACEMETHODIMP ToastEventHandler::Invoke(_In_ IToastNotification* /* sender */, _In_ IInspectable* /* args */) { if (_callback != nullptr) _callback(_arg); return S_OK; } IFACEMETHODIMP ToastEventHandler::Invoke(_In_ IToastNotification* /* sender */, _In_ IToastDismissedEventArgs* /* e */) { callbackArg *cb = (callbackArg*)_arg; lstNotifications.remove(cb->notification); return S_OK; } IFACEMETHODIMP ToastEventHandler::Invoke(_In_ IToastNotification* /* sender */, _In_ IToastFailedEventArgs* /* e */) { callbackArg *cb = (callbackArg*)_arg; lstNotifications.remove(cb->notification); return S_OK; }