Skip to content

Commit 092b4cc

Browse files
committed
Merge branch 'main-refactor'
2 parents 21a8b9f + 7f81d42 commit 092b4cc

File tree

3 files changed

+81
-104
lines changed

3 files changed

+81
-104
lines changed

example/qt-gui-example/WinToastExample/mainwindow.cpp

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,33 @@ void MainWindow::on_imagePathSelector_clicked()
3333

3434
}
3535

36+
class CustomHandler : public IWinToastHandler {
37+
public:
38+
void toastActivated() const {
39+
std::wcout << L"The user clicked in this toast" << std::endl;
40+
}
41+
42+
void toastFailed() const {
43+
std::wcout << L"Error showing current toast" << std::endl;
44+
}
45+
void toastDismissed(WinToastDismissalReason state) const {
46+
switch (state) {
47+
case UserCanceled:
48+
std::wcout << L"The user dismissed this toast" << std::endl;
49+
break;
50+
case ApplicationHidden:
51+
std::wcout << L"The application hid the toast using ToastNotifier.hide()" << std::endl;
52+
break;
53+
case TimedOut:
54+
std::wcout << L"The toast has timed out" << std::endl;
55+
break;
56+
default:
57+
std::wcout << L"Toast not activated" << std::endl;
58+
break;
59+
}
60+
}
61+
};
62+
3663
void MainWindow::on_showToast_clicked()
3764
{
3865
WinToastTemplate templ = WinToastTemplate(WinToastTemplate::ImageAndText04);
@@ -41,7 +68,9 @@ void MainWindow::on_showToast_clicked()
4168
templ.setTextField(ui->secondLine->text().toStdWString(), WinToastTemplate::SecondLine);
4269
templ.setTextField(ui->secondLine->text().toStdWString(), WinToastTemplate::ThirdLine);
4370

44-
if (!WinToast::instance()->showToast(templ, new WinToastHandler)) {
71+
72+
73+
if (!WinToast::instance()->showToast(templ, new CustomHandler())) {
4574
QMessageBox::warning(this, "Error", "Could not launch your toast notification!");
4675
}
4776
}

src/wintoastlib.cpp

Lines changed: 33 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
#else
1111
#define DEBUG_MSG(str) do { std::wcout << str << std::endl; } while( false )
1212
#endif
13-
1413
using namespace WinToastLib;
1514
namespace DllImporter {
1615

@@ -64,6 +63,30 @@ namespace DllImporter {
6463
}
6564
}
6665

66+
class WinToastStringWrapper {
67+
public:
68+
WinToastStringWrapper(_In_reads_(length) PCWSTR stringRef, _In_ UINT32 length) throw() {
69+
HRESULT hr = DllImporter::WindowsCreateStringReference(stringRef, length, &_header, &_hstring);
70+
if (!SUCCEEDED(hr)) {
71+
RaiseException(static_cast<DWORD>(STATUS_INVALID_PARAMETER), EXCEPTION_NONCONTINUABLE, 0, nullptr);
72+
}
73+
}
74+
WinToastStringWrapper(_In_ const std::wstring &stringRef) throw() {
75+
HRESULT hr = DllImporter::WindowsCreateStringReference(stringRef.c_str(), static_cast<UINT32>(stringRef.length()), &_header, &_hstring);
76+
if (FAILED(hr)) {
77+
RaiseException(static_cast<DWORD>(STATUS_INVALID_PARAMETER), EXCEPTION_NONCONTINUABLE, 0, nullptr);
78+
}
79+
}
80+
~WinToastStringWrapper() {
81+
DllImporter::WindowsDeleteString(_hstring);
82+
}
83+
inline HSTRING Get() const throw() { return _hstring; }
84+
private:
85+
HSTRING _hstring;
86+
HSTRING_HEADER _header;
87+
88+
};
89+
6790
namespace Util {
6891
inline HRESULT defaultExecutablePath(_In_ WCHAR* path, _In_ DWORD nSize = MAX_PATH) {
6992
DWORD written = GetModuleFileNameEx(GetCurrentProcess(), nullptr, path, nSize);
@@ -109,7 +132,7 @@ namespace Util {
109132
return hr;
110133
}
111134

112-
inline HRESULT setEventHandlers(_In_ IToastNotification* notification, _In_ std::shared_ptr<WinToastHandler> eventHandler) {
135+
inline HRESULT setEventHandlers(_In_ IToastNotification* notification, _In_ std::shared_ptr<IWinToastHandler> eventHandler) {
113136
EventRegistrationToken activatedToken, dismissedToken, failedToken;
114137
HRESULT hr = notification->add_Activated(
115138
Callback < Implements < RuntimeClassFlags<ClassicCom>,
@@ -128,7 +151,7 @@ namespace Util {
128151
ToastDismissalReason reason;
129152
if (SUCCEEDED(e->get_Reason(&reason)))
130153
{
131-
eventHandler->toastDismissed(static_cast<WinToastHandler::WinToastDismissalReason>(reason));
154+
eventHandler->toastDismissed(static_cast<IWinToastHandler::WinToastDismissalReason>(reason));
132155
}
133156
return S_OK;
134157
}).Get(), &dismissedToken);
@@ -146,6 +169,8 @@ namespace Util {
146169
}
147170
}
148171

172+
173+
149174
WinToast* WinToast::_instance = nullptr;
150175
WinToast* WinToast::instance() {
151176
if (_instance == nullptr) {
@@ -159,6 +184,9 @@ WinToast::WinToast() : _isInitialized(false)
159184
DllImporter::initialize();
160185
}
161186

187+
WinToast::~WinToast() {
188+
}
189+
162190
void WinToast::setAppName(_In_ const std::wstring& appName) {
163191
_appName = appName;
164192
}
@@ -338,7 +366,7 @@ HRESULT WinToast::createShellLink() {
338366

339367

340368

341-
bool WinToast::showToast(_In_ const WinToastTemplate& toast, _In_ WinToastHandler* handler) {
369+
bool WinToast::showToast(_In_ const WinToastTemplate& toast, _In_ IWinToastHandler* handler) {
342370
if (!isInitialized()) {
343371
DEBUG_MSG("Error when launching the toast. WinToast is not initialized =(");
344372
return _isInitialized;
@@ -355,7 +383,7 @@ bool WinToast::showToast(_In_ const WinToastTemplate& toast, _In_ WinToastHandl
355383
if (SUCCEEDED(hr)) {
356384
hr = _notificationFactory->CreateToastNotification(xmlDocument(), &_notification);
357385
if (SUCCEEDED(hr)) {
358-
hr = Util::setEventHandlers(notification(), std::shared_ptr<WinToastHandler>(handler));
386+
hr = Util::setEventHandlers(notification(), std::shared_ptr<IWinToastHandler>(handler));
359387
if (SUCCEEDED(hr)) {
360388
hr = _notifier->Show(notification());
361389
}
@@ -413,7 +441,6 @@ WinToastTemplate::WinToastTemplate(const WinToastTemplateType& type) :
413441
initComponentsFromType();
414442
}
415443

416-
417444
WinToastTemplate::~WinToastTemplate()
418445
{
419446
_textFields.clear();
@@ -433,55 +460,3 @@ void WinToastTemplate::initComponentsFromType() {
433460
_hasImage = _type < Text01;
434461
_textFields = std::vector<std::wstring>(TextFieldsCount[_type], L"");
435462
}
436-
437-
438-
void WinToastHandler::toastActivated() const {
439-
std::wcout << L"The user clicked in this toast" << std::endl;
440-
441-
}
442-
443-
void WinToastHandler::toastFailed() const {
444-
std::wcout << L"Error showing current toast" << std::endl;
445-
}
446-
447-
void WinToastHandler::toastDismissed(WinToastHandler::WinToastDismissalReason state) const {
448-
switch (state) {
449-
case UserCanceled:
450-
std::wcout << L"The user dismissed this toast" << std::endl;
451-
break;
452-
case ApplicationHidden:
453-
std::wcout << L"The application hid the toast using ToastNotifier.hide()" << std::endl;
454-
break;
455-
case TimedOut:
456-
std::wcout << L"The toast has timed out" << std::endl;
457-
break;
458-
default:
459-
std::wcout << L"Toast not activated" << std::endl;
460-
break;
461-
}
462-
}
463-
464-
465-
WinToastStringWrapper::WinToastStringWrapper(_In_reads_(length) PCWSTR stringRef, _In_ UINT32 length) throw() {
466-
HRESULT hr = DllImporter::WindowsCreateStringReference(stringRef, length, &_header, &_hstring);
467-
if (!SUCCEEDED(hr)) {
468-
RaiseException(static_cast<DWORD>(STATUS_INVALID_PARAMETER), EXCEPTION_NONCONTINUABLE, 0, nullptr);
469-
}
470-
}
471-
472-
473-
WinToastStringWrapper::WinToastStringWrapper(const std::wstring &stringRef)
474-
{
475-
HRESULT hr = DllImporter::WindowsCreateStringReference(stringRef.c_str(), static_cast<UINT32>(stringRef.length()), &_header, &_hstring);
476-
if (FAILED(hr)) {
477-
RaiseException(static_cast<DWORD>(STATUS_INVALID_PARAMETER), EXCEPTION_NONCONTINUABLE, 0, nullptr);
478-
}
479-
}
480-
481-
WinToastStringWrapper::~WinToastStringWrapper() {
482-
DllImporter::WindowsDeleteString(_hstring);
483-
}
484-
485-
HSTRING WinToastStringWrapper::Get() const throw() {
486-
return _hstring;
487-
}

src/wintoastlib.h

Lines changed: 18 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -25,46 +25,22 @@ using namespace Windows::Foundation;
2525

2626
#define DEFAULT_SHELL_LINKS_PATH L"\\Microsoft\\Windows\\Start Menu\\Programs\\"
2727
#define DEFAULT_LINK_FORMAT L".lnk"
28-
2928
namespace WinToastLib {
30-
class WinToastStringWrapper {
31-
public:
32-
WinToastStringWrapper(_In_reads_(length) PCWSTR stringRef, _In_ UINT32 length) throw();
33-
WinToastStringWrapper(_In_ const std::wstring &stringRef) throw();
34-
~WinToastStringWrapper();
35-
HSTRING Get() const throw();
36-
private:
37-
HSTRING _hstring;
38-
HSTRING_HEADER _header;
39-
40-
};
41-
42-
43-
class WinToastHandler {
29+
class IWinToastHandler {
4430
public:
4531
enum WinToastDismissalReason {
4632
UserCanceled = ToastDismissalReason::ToastDismissalReason_UserCanceled,
4733
ApplicationHidden = ToastDismissalReason::ToastDismissalReason_ApplicationHidden,
4834
TimedOut = ToastDismissalReason::ToastDismissalReason_TimedOut
4935
};
50-
51-
virtual ~WinToastHandler() {}
52-
53-
virtual void toastActivated() const;
54-
virtual void toastDismissed(WinToastDismissalReason state) const;
55-
virtual void toastFailed() const;
36+
virtual void toastActivated() const = 0;
37+
virtual void toastDismissed(WinToastDismissalReason state) const = 0;
38+
virtual void toastFailed() const = 0;
5639
};
5740

58-
class WinToastTemplate
59-
{
41+
class WinToastTemplate {
6042
public:
61-
enum TextField {
62-
FirstLine = 0,
63-
SecondLine,
64-
ThirdLine,
65-
LineCount
66-
};
67-
43+
enum TextField { FirstLine = 0, SecondLine, ThirdLine };
6844
enum WinToastTemplateType {
6945
ImageAndText01 = ToastTemplateType::ToastTemplateType_ToastImageAndText01,
7046
ImageAndText02 = ToastTemplateType::ToastTemplateType_ToastImageAndText02,
@@ -79,7 +55,6 @@ namespace WinToastLib {
7955

8056
WinToastTemplate(_In_ const WinToastTemplateType& type = ImageAndText02);
8157
~WinToastTemplate();
82-
8358
int textFieldsCount() const { return _textFields.size(); }
8459
bool hasImage() const { return _hasImage; }
8560
std::vector<std::wstring> textFields() const { return _textFields; }
@@ -99,20 +74,29 @@ namespace WinToastLib {
9974

10075
class WinToast {
10176
public:
77+
WinToast(void);
78+
virtual ~WinToast();
10279
static WinToast* instance();
10380
static bool isCompatible();
10481
static std::wstring configureAUMI(_In_ const std::wstring& company,
10582
_In_ const std::wstring& name,
10683
_In_ const std::wstring& surname,
10784
_In_ const std::wstring& versionInfo
10885
);
109-
bool initialize();
110-
bool isInitialized() const { return _isInitialized; }
111-
bool showToast(_In_ const WinToastTemplate& toast, _In_ WinToastHandler* handler);
86+
virtual bool initialize();
87+
virtual bool isInitialized() const { return _isInitialized; }
88+
virtual bool showToast(_In_ const WinToastTemplate& toast, _In_ IWinToastHandler* handler);
11289
std::wstring appName() const;
11390
std::wstring appUserModelId() const;
11491
void setAppUserModelId(_In_ const std::wstring& appName);
11592
void setAppName(_In_ const std::wstring& appName);
93+
94+
protected:
95+
inline IXmlDocument* xmlDocument() const { return _xmlDocument.Get(); }
96+
inline IToastNotifier* notifier() const { return _notifier.Get(); }
97+
inline IToastNotificationFactory* notificationFactory() const { return _notificationFactory.Get(); }
98+
inline IToastNotificationManagerStatics* notificationManager() const { return _notificationManager.Get(); }
99+
inline IToastNotification* notification() const { return _notification.Get(); }
116100
private:
117101
bool _isInitialized;
118102
std::wstring _appName;
@@ -124,21 +108,10 @@ namespace WinToastLib {
124108
ComPtr<IToastNotification> _notification;
125109
static WinToast* _instance;
126110

127-
WinToast(void);
128-
IXmlDocument* xmlDocument() const { return _xmlDocument.Get(); }
129-
IToastNotifier* notifier() const { return _notifier.Get(); }
130-
IToastNotificationFactory* notificationFactory() const { return _notificationFactory.Get(); }
131-
IToastNotificationManagerStatics* notificationManager() const { return _notificationManager.Get(); }
132-
IToastNotification* notification() const { return _notification.Get(); }
133-
134111
HRESULT validateShellLink();
135112
HRESULT createShellLink();
136113
HRESULT setImageField(_In_ const std::wstring& path);
137114
HRESULT setTextField(_In_ const std::wstring& text, _In_ int pos);
138115
};
139-
140-
141-
142116
}
143-
144117
#endif // WINTOASTLIB_H

0 commit comments

Comments
 (0)