diff --git a/brightray/brightray.gyp b/brightray/brightray.gyp index db04f5672ce..9b548e70a7f 100644 --- a/brightray/brightray.gyp +++ b/brightray/brightray.gyp @@ -164,8 +164,11 @@ 'msvs_settings': { 'VCLinkerTool': { 'AdditionalDependencies': [ + # Windows Runtime. + 'crypt32.lib', 'runtimeobject.lib', - 'windowsapp.lib' + 'shlwapi.lib', + 'windowsapp.lib', ], }, }, @@ -203,8 +206,6 @@ 'msvs_settings': { 'VCLinkerTool': { 'AdditionalDependencies': [ - 'Shlwapi.lib', - 'Crypt32.lib', 'advapi32.lib', 'dbghelp.lib', 'delayimp.lib', diff --git a/brightray/browser/win/notification_presenter_win.cc b/brightray/browser/win/notification_presenter_win.cc index 8870de36e3e..20b2a3333a8 100644 --- a/brightray/browser/win/notification_presenter_win.cc +++ b/brightray/browser/win/notification_presenter_win.cc @@ -5,13 +5,12 @@ #include "browser/win/notification_presenter_win.h" #include "base/win/windows_version.h" +#include "common/application_info.h" #include "content/public/browser/desktop_notification_delegate.h" #include "content/public/common/platform_notification_data.h" #include "third_party/skia/include/core/SkBitmap.h" -#include "common/application_info.h" #pragma comment(lib, "runtimeobject.lib") -#pragma comment(lib, "Crypt32.lib") using namespace WinToasts; using namespace Microsoft::WRL; @@ -34,14 +33,13 @@ NotificationPresenterWin::~NotificationPresenterWin() { } void NotificationPresenterWin::ShowNotification( - const content::PlatformNotificationData& data, - const SkBitmap& icon, - scoped_ptr delegate_ptr, - base::Closure* cancel_callback) { - + const content::PlatformNotificationData& data, + const SkBitmap& icon, + scoped_ptr delegate_ptr, + base::Closure* cancel_callback) { std::wstring title = data.title; std::wstring body = data.body; - std::string iconPath = data.icon.spec(); + std::string iconPath = data.icon.spec(); std::string appName = GetApplicationName(); // toast notification supported in version >= Windows 8 @@ -50,7 +48,7 @@ void NotificationPresenterWin::ShowNotification( wtn = new WindowsToastNotification(appName.c_str(), delegate_ptr.release()); wtn->ShowNotification(title.c_str(), body.c_str(), iconPath, m_lastNotification); } - + if (cancel_callback) { *cancel_callback = base::Bind( &NotificationPresenterWin::RemoveNotification, @@ -64,4 +62,4 @@ void NotificationPresenterWin::RemoveNotification() { } } -} // namespace brightray \ No newline at end of file +} // namespace brightray diff --git a/brightray/browser/win/notification_presenter_win.h b/brightray/browser/win/notification_presenter_win.h index a2ecd81b952..fa7ccf40d1f 100644 --- a/brightray/browser/win/notification_presenter_win.h +++ b/brightray/browser/win/notification_presenter_win.h @@ -13,9 +13,8 @@ // windowsNotification.onclick = function () { console.log("Notification clicked") }; // windowsNotification.onclose = function () { console.log("Notification dismissed") }; - -#ifndef BRIGHTRAY_BROWSER_NOTIFICATION_PRESENTER_WIN_H_ -#define BRIGHTRAY_BROWSER_NOTIFICATION_PRESENTER_WIN_H_ +#ifndef BRIGHTRAY_BROWSER_WIN_NOTIFICATION_PRESENTER_WIN_H_ +#define BRIGHTRAY_BROWSER_WIN_NOTIFICATION_PRESENTER_WIN_H_ #include "base/compiler_specific.h" #include "browser/notification_presenter.h" @@ -38,7 +37,7 @@ class NotificationPresenterWin : public NotificationPresenter { const SkBitmap& icon, scoped_ptr delegate, base::Closure* cancel_callback) override; - + void RemoveNotification(); private: @@ -48,4 +47,4 @@ class NotificationPresenterWin : public NotificationPresenter { } // namespace -#endif // BRIGHTRAY_BROWSER_NOTIFICATION_PRESENTER_WIN_H_ +#endif // BRIGHTRAY_BROWSER_WIN_NOTIFICATION_PRESENTER_WIN_H_ diff --git a/brightray/browser/win/windows_toast_notification.cc b/brightray/browser/win/windows_toast_notification.cc index 830a6f67003..79aa2b4a0e6 100644 --- a/brightray/browser/win/windows_toast_notification.cc +++ b/brightray/browser/win/windows_toast_notification.cc @@ -3,100 +3,100 @@ // Thanks to both of those folks mentioned above who first thought up a bunch of this code // and released it as MIT to the world. -#include "windows_toast_notification.h" +#include "browser/win/windows_toast_notification.h" + #include "content/public/browser/desktop_notification_delegate.h" using namespace WinToasts; -using namespace Microsoft::WRL; -using namespace ABI::Windows::UI::Notifications; using namespace ABI::Windows::Data::Xml::Dom; -#define BREAK_IF_BAD(hr) if(!SUCCEEDED(hr)) break; +#define BREAK_IF_BAD(hr) if(!SUCCEEDED(hr)) break; namespace WinToasts { +namespace { + // Initialize Windows Runtime -static HRESULT init = Windows::Foundation::Initialize(RO_INIT_MULTITHREADED); +HRESULT init = Windows::Foundation::Initialize(RO_INIT_MULTITHREADED); -WindowsToastNotification::WindowsToastNotification(const char* appName, content::DesktopNotificationDelegate* delegate) -{ - HSTRING toastNotifMgrStr = NULL; - HSTRING appId = NULL; +} // namespace - HRESULT hr = CreateHString(RuntimeClass_Windows_UI_Notifications_ToastNotificationManager, &toastNotifMgrStr); +WindowsToastNotification::WindowsToastNotification( + const char* appName, content::DesktopNotificationDelegate* delegate) { + HSTRING toastNotifMgrStr = nullptr; + HSTRING appId = nullptr; - hr = Windows::Foundation::GetActivationFactory(toastNotifMgrStr, &m_toastManager); + HRESULT hr = CreateHString(RuntimeClass_Windows_UI_Notifications_ToastNotificationManager, &toastNotifMgrStr); - WCHAR wAppName[MAX_PATH]; - swprintf(wAppName, ARRAYSIZE(wAppName), L"%S", appName); - hr = CreateHString(wAppName, &appId); + hr = Windows::Foundation::GetActivationFactory(toastNotifMgrStr, &m_toastManager); - m_toastManager->CreateToastNotifierWithId(appId, &m_toastNotifier); + WCHAR wAppName[MAX_PATH]; + swprintf(wAppName, ARRAYSIZE(wAppName), L"%S", appName); + hr = CreateHString(wAppName, &appId); - if (toastNotifMgrStr != NULL) { - WindowsDeleteString(toastNotifMgrStr); - } + m_toastManager->CreateToastNotifierWithId(appId, &m_toastNotifier); - if (appId != NULL) { - WindowsDeleteString(appId); - } + if (toastNotifMgrStr) { + WindowsDeleteString(toastNotifMgrStr); + } - n_delegate = delegate; + if (appId) { + WindowsDeleteString(appId); + } + + n_delegate = delegate; } -WindowsToastNotification::~WindowsToastNotification() -{ - if (n_delegate) { - delete n_delegate; - } +WindowsToastNotification::~WindowsToastNotification() { + if (n_delegate) { + delete n_delegate; + } } -void WindowsToastNotification::ShowNotification(const WCHAR* title, const WCHAR* msg, std::string iconPath, ComPtr& toast) -{ - HRESULT hr; - HSTRING toastNotifStr = NULL; +void WindowsToastNotification::ShowNotification( + const WCHAR* title, const WCHAR* msg, std::string iconPath, ComPtr& toast) { + HRESULT hr; + HSTRING toastNotifStr = nullptr; - do { - ComPtr toastXml; - hr = GetToastXml(m_toastManager.Get(), title, msg, iconPath, &toastXml); - BREAK_IF_BAD(hr); + do { + ComPtr toastXml; + hr = GetToastXml(m_toastManager.Get(), title, msg, iconPath, &toastXml); + BREAK_IF_BAD(hr); - hr = CreateHString(RuntimeClass_Windows_UI_Notifications_ToastNotification, &toastNotifStr); - BREAK_IF_BAD(hr); + hr = CreateHString(RuntimeClass_Windows_UI_Notifications_ToastNotification, &toastNotifStr); + BREAK_IF_BAD(hr); - ComPtr toastFactory; - hr = Windows::Foundation::GetActivationFactory(toastNotifStr, &toastFactory); - BREAK_IF_BAD(hr); + ComPtr toastFactory; + hr = Windows::Foundation::GetActivationFactory(toastNotifStr, &toastFactory); + BREAK_IF_BAD(hr); - hr = toastFactory->CreateToastNotification(toastXml.Get(), &toast); - BREAK_IF_BAD(hr); + hr = toastFactory->CreateToastNotification(toastXml.Get(), &toast); + BREAK_IF_BAD(hr); - hr = SetupCallbacks(toast.Get()); - BREAK_IF_BAD(hr); + hr = SetupCallbacks(toast.Get()); + BREAK_IF_BAD(hr); - hr = m_toastNotifier->Show(toast.Get()); - BREAK_IF_BAD(hr); + hr = m_toastNotifier->Show(toast.Get()); + BREAK_IF_BAD(hr); - n_delegate->NotificationDisplayed(); - } while (FALSE); + n_delegate->NotificationDisplayed(); + } while (FALSE); - if (toastNotifStr != NULL) { - WindowsDeleteString(toastNotifStr); - } + if (toastNotifStr) { + WindowsDeleteString(toastNotifStr); + } } -void WindowsToastNotification::DismissNotification(ComPtr toast) -{ - m_toastNotifier->Hide(toast.Get()); +void WindowsToastNotification::DismissNotification( + ComPtr toast) { + m_toastNotifier->Hide(toast.Get()); } -void WindowsToastNotification::NotificationClicked() -{ +void WindowsToastNotification::NotificationClicked() { delete this; } -void WindowsToastNotification::NotificationDismissed() -{ +void WindowsToastNotification::NotificationDismissed() { delete this; } @@ -106,261 +106,260 @@ HRESULT WindowsToastNotification::GetToastXml( const WCHAR* msg, std::string iconPath, IXmlDocument** toastXml) { - - HRESULT hr; - ToastTemplateType templateType; - if (title == NULL || msg == NULL) { - // Single line toast - templateType = iconPath.length() == 0 ? ToastTemplateType_ToastText01 : ToastTemplateType_ToastImageAndText01; - hr = m_toastManager->GetTemplateContent(templateType, toastXml); - if (SUCCEEDED(hr)) { - const WCHAR* text = title != NULL ? title : msg; - hr = SetXmlText(*toastXml, text); - } - } else { - // Title and body toast - templateType = iconPath.length() == 0 ? ToastTemplateType_ToastText02 : ToastTemplateType_ToastImageAndText02; - hr = toastManager->GetTemplateContent(templateType, toastXml); - if (SUCCEEDED(hr)) { - hr = SetXmlText(*toastXml, title, msg); - } - } - - if (iconPath.length() != 0 && SUCCEEDED(hr)) { - // Toast has image - if (SUCCEEDED(hr)) { - hr = SetXmlImage(*toastXml, iconPath); - } - - // Don't stop a notification from showing just because an image couldn't be displayed. By default the app icon will be shown. - hr = S_OK; - } - - return hr; -} - -HRESULT WindowsToastNotification::SetXmlText(IXmlDocument* doc, const WCHAR* text) -{ - HSTRING tag = NULL; - - ComPtr nodeList; - HRESULT hr = GetTextNodeList(&tag, doc, &nodeList, 1); - do { - BREAK_IF_BAD(hr); - - ComPtr node; - hr = nodeList->Item(0, &node); - BREAK_IF_BAD(hr); - - hr = AppendTextToXml(doc, node.Get(), text); - } while (FALSE); - - if (tag != NULL) { - WindowsDeleteString(tag); - } - - return hr; -} - -HRESULT WindowsToastNotification::SetXmlText(IXmlDocument* doc, const WCHAR* title, const WCHAR* body) -{ - HSTRING tag = NULL; - ComPtr nodeList; - HRESULT hr = GetTextNodeList(&tag, doc, &nodeList, 2); - do { - BREAK_IF_BAD(hr); - - ComPtr node; - hr = nodeList->Item(0, &node); - BREAK_IF_BAD(hr); - - hr = AppendTextToXml(doc, node.Get(), title); - BREAK_IF_BAD(hr); - - hr = nodeList->Item(1, &node); - BREAK_IF_BAD(hr); - - hr = AppendTextToXml(doc, node.Get(), body); - } while (FALSE); - - if (tag != NULL) { - WindowsDeleteString(tag); - } - - return hr; -} - -HRESULT WindowsToastNotification::SetXmlImage(IXmlDocument* doc, std::string iconPath) -{ - HSTRING tag = NULL; - HSTRING src = NULL; - HSTRING imgPath = NULL; - HRESULT hr = CreateHString(L"image", &tag); - - do { - BREAK_IF_BAD(hr); - - ComPtr nodeList; - hr = doc->GetElementsByTagName(tag, &nodeList); - BREAK_IF_BAD(hr); - - ComPtr imageNode; - hr = nodeList->Item(0, &imageNode); - BREAK_IF_BAD(hr); - - ComPtr attrs; - hr = imageNode->get_Attributes(&attrs); - BREAK_IF_BAD(hr); - - hr = CreateHString(L"src", &src); - BREAK_IF_BAD(hr); - - ComPtr srcAttr; - hr = attrs->GetNamedItem(src, &srcAttr); - BREAK_IF_BAD(hr); - - WCHAR xmlPath[MAX_PATH]; - swprintf(xmlPath, ARRAYSIZE(xmlPath), L"%S", iconPath); - hr = CreateHString(xmlPath, &imgPath); - BREAK_IF_BAD(hr); - - ComPtr srcText; - hr = doc->CreateTextNode(imgPath, &srcText); - BREAK_IF_BAD(hr); - - ComPtr srcNode; - hr = srcText.As(&srcNode); - BREAK_IF_BAD(hr); - - ComPtr childNode; - hr = srcAttr->AppendChild(srcNode.Get(), &childNode); - } while (FALSE); - - if (tag != NULL) { - WindowsDeleteString(tag); - } - if (src != NULL) { - WindowsDeleteString(src); - } - if (imgPath != NULL) { - WindowsDeleteString(imgPath); - } - - return hr; -} - -HRESULT WindowsToastNotification::GetTextNodeList(HSTRING* tag, IXmlDocument* doc, IXmlNodeList** nodeList, UINT32 reqLength) -{ - HRESULT hr = CreateHString(L"text", tag); - do{ - BREAK_IF_BAD(hr); - - hr = doc->GetElementsByTagName(*tag, nodeList); - BREAK_IF_BAD(hr); - - UINT32 nodeLength; - hr = (*nodeList)->get_Length(&nodeLength); - BREAK_IF_BAD(hr); - - if (nodeLength < reqLength) { - hr = E_INVALIDARG; - } - } while (FALSE); - - if (!SUCCEEDED(hr)) { - // Allow the caller to delete this string on success - WindowsDeleteString(*tag); - } - - return hr; -} - -HRESULT WindowsToastNotification::AppendTextToXml(IXmlDocument* doc, IXmlNode* node, const WCHAR* text) -{ - HSTRING str = NULL; - HRESULT hr = CreateHString(text, &str); - do { - BREAK_IF_BAD(hr); - - ComPtr xmlText; - hr = doc->CreateTextNode(str, &xmlText); - BREAK_IF_BAD(hr); - - ComPtr textNode; - hr = xmlText.As(&textNode); - BREAK_IF_BAD(hr); - - ComPtr appendNode; - hr = node->AppendChild(textNode.Get(), &appendNode); - } while (FALSE); - - if (str != NULL) { - WindowsDeleteString(str); - } - - return hr; -} - -HRESULT WindowsToastNotification::SetupCallbacks(IToastNotification* toast) -{ - EventRegistrationToken activatedToken, dismissedToken; - m_eventHandler = Make(this, n_delegate); - HRESULT hr = toast->add_Activated(m_eventHandler.Get(), &activatedToken); - + HRESULT hr; + ToastTemplateType templateType; + if (title == NULL || msg == NULL) { + // Single line toast + templateType = iconPath.length() == 0 ? ToastTemplateType_ToastText01 : ToastTemplateType_ToastImageAndText01; + hr = m_toastManager->GetTemplateContent(templateType, toastXml); if (SUCCEEDED(hr)) { - hr = toast->add_Dismissed(m_eventHandler.Get(), &dismissedToken); + const WCHAR* text = title != NULL ? title : msg; + hr = SetXmlText(*toastXml, text); + } + } else { + // Title and body toast + templateType = iconPath.length() == 0 ? ToastTemplateType_ToastText02 : ToastTemplateType_ToastImageAndText02; + hr = toastManager->GetTemplateContent(templateType, toastXml); + if (SUCCEEDED(hr)) { + hr = SetXmlText(*toastXml, title, msg); + } + } + + if (iconPath.length() != 0 && SUCCEEDED(hr)) { + // Toast has image + if (SUCCEEDED(hr)) { + hr = SetXmlImage(*toastXml, iconPath); } - return hr; + // Don't stop a notification from showing just because an image couldn't be displayed. By default the app icon will be shown. + hr = S_OK; + } + + return hr; } -HRESULT WindowsToastNotification::CreateHString(const WCHAR* source, HSTRING* dest) -{ - if (source == NULL || dest == NULL) { - return E_INVALIDARG; - } +HRESULT WindowsToastNotification::SetXmlText( + IXmlDocument* doc, const WCHAR* text) { + HSTRING tag = NULL; - HRESULT hr = WindowsCreateString(source, wcslen(source), dest); - return hr; + ComPtr nodeList; + HRESULT hr = GetTextNodeList(&tag, doc, &nodeList, 1); + do { + BREAK_IF_BAD(hr); + + ComPtr node; + hr = nodeList->Item(0, &node); + BREAK_IF_BAD(hr); + + hr = AppendTextToXml(doc, node.Get(), text); + } while (FALSE); + + if (tag != NULL) { + WindowsDeleteString(tag); + } + + return hr; +} + +HRESULT WindowsToastNotification::SetXmlText( + IXmlDocument* doc, const WCHAR* title, const WCHAR* body) { + HSTRING tag = NULL; + ComPtr nodeList; + HRESULT hr = GetTextNodeList(&tag, doc, &nodeList, 2); + do { + BREAK_IF_BAD(hr); + + ComPtr node; + hr = nodeList->Item(0, &node); + BREAK_IF_BAD(hr); + + hr = AppendTextToXml(doc, node.Get(), title); + BREAK_IF_BAD(hr); + + hr = nodeList->Item(1, &node); + BREAK_IF_BAD(hr); + + hr = AppendTextToXml(doc, node.Get(), body); + } while (FALSE); + + if (tag != NULL) { + WindowsDeleteString(tag); + } + + return hr; +} + +HRESULT WindowsToastNotification::SetXmlImage( + IXmlDocument* doc, std::string iconPath) { + HSTRING tag = NULL; + HSTRING src = NULL; + HSTRING imgPath = NULL; + HRESULT hr = CreateHString(L"image", &tag); + + do { + BREAK_IF_BAD(hr); + + ComPtr nodeList; + hr = doc->GetElementsByTagName(tag, &nodeList); + BREAK_IF_BAD(hr); + + ComPtr imageNode; + hr = nodeList->Item(0, &imageNode); + BREAK_IF_BAD(hr); + + ComPtr attrs; + hr = imageNode->get_Attributes(&attrs); + BREAK_IF_BAD(hr); + + hr = CreateHString(L"src", &src); + BREAK_IF_BAD(hr); + + ComPtr srcAttr; + hr = attrs->GetNamedItem(src, &srcAttr); + BREAK_IF_BAD(hr); + + WCHAR xmlPath[MAX_PATH]; + swprintf(xmlPath, ARRAYSIZE(xmlPath), L"%S", iconPath); + hr = CreateHString(xmlPath, &imgPath); + BREAK_IF_BAD(hr); + + ComPtr srcText; + hr = doc->CreateTextNode(imgPath, &srcText); + BREAK_IF_BAD(hr); + + ComPtr srcNode; + hr = srcText.As(&srcNode); + BREAK_IF_BAD(hr); + + ComPtr childNode; + hr = srcAttr->AppendChild(srcNode.Get(), &childNode); + } while (FALSE); + + if (tag != NULL) { + WindowsDeleteString(tag); + } + if (src != NULL) { + WindowsDeleteString(src); + } + if (imgPath != NULL) { + WindowsDeleteString(imgPath); + } + + return hr; +} + +HRESULT WindowsToastNotification::GetTextNodeList( + HSTRING* tag, + IXmlDocument* doc, + IXmlNodeList** nodeList, + UINT32 reqLength) { + HRESULT hr = CreateHString(L"text", tag); + do { + BREAK_IF_BAD(hr); + + hr = doc->GetElementsByTagName(*tag, nodeList); + BREAK_IF_BAD(hr); + + UINT32 nodeLength; + hr = (*nodeList)->get_Length(&nodeLength); + BREAK_IF_BAD(hr); + + if (nodeLength < reqLength) { + hr = E_INVALIDARG; + } + } while (FALSE); + + if (!SUCCEEDED(hr)) { + // Allow the caller to delete this string on success + WindowsDeleteString(*tag); + } + + return hr; +} + +HRESULT WindowsToastNotification::AppendTextToXml( + IXmlDocument* doc, IXmlNode* node, const WCHAR* text) { + HSTRING str = NULL; + HRESULT hr = CreateHString(text, &str); + do { + BREAK_IF_BAD(hr); + + ComPtr xmlText; + hr = doc->CreateTextNode(str, &xmlText); + BREAK_IF_BAD(hr); + + ComPtr textNode; + hr = xmlText.As(&textNode); + BREAK_IF_BAD(hr); + + ComPtr appendNode; + hr = node->AppendChild(textNode.Get(), &appendNode); + } while (FALSE); + + if (str != NULL) { + WindowsDeleteString(str); + } + + return hr; +} + +HRESULT WindowsToastNotification::SetupCallbacks(IToastNotification* toast) { + EventRegistrationToken activatedToken, dismissedToken; + m_eventHandler = Make(this, n_delegate); + HRESULT hr = toast->add_Activated(m_eventHandler.Get(), &activatedToken); + + if (SUCCEEDED(hr)) { + hr = toast->add_Dismissed(m_eventHandler.Get(), &dismissedToken); + } + + return hr; +} + +HRESULT WindowsToastNotification::CreateHString( + const WCHAR* source, HSTRING* dest) { + if (source == NULL || dest == NULL) { + return E_INVALIDARG; + } + + HRESULT hr = WindowsCreateString(source, wcslen(source), dest); + return hr; } /* / Toast Event Handler */ -ToastEventHandler::ToastEventHandler(WindowsToastNotification* notification, content::DesktopNotificationDelegate* delegate) -{ - m_notification = notification; - n_delegate = delegate; +ToastEventHandler::ToastEventHandler( + WindowsToastNotification* notification, + content::DesktopNotificationDelegate* delegate) { + m_notification = notification; + n_delegate = delegate; } -ToastEventHandler::~ToastEventHandler() -{ - // Empty +ToastEventHandler::~ToastEventHandler() { } -IFACEMETHODIMP ToastEventHandler::Invoke(IToastNotification* sender, IInspectable* args) -{ - // Notification "activated" (clicked) - n_delegate->NotificationClick(); - - if (m_notification != NULL) { - m_notification->NotificationClicked(); - } - - return S_OK; +IFACEMETHODIMP ToastEventHandler::Invoke( + IToastNotification* sender, IInspectable* args) { + // Notification "activated" (clicked) + n_delegate->NotificationClick(); + + if (m_notification != NULL) { + m_notification->NotificationClicked(); + } + + return S_OK; } -IFACEMETHODIMP ToastEventHandler::Invoke(IToastNotification* sender, IToastDismissedEventArgs* e) -{ - // Notification dismissed - n_delegate->NotificationClosed(); +IFACEMETHODIMP ToastEventHandler::Invoke( + IToastNotification* sender, IToastDismissedEventArgs* e) { + // Notification dismissed + n_delegate->NotificationClosed(); - if (m_notification != NULL) { - m_notification->NotificationDismissed(); - - } - - return S_OK; + if (m_notification != NULL) { + m_notification->NotificationDismissed(); + } + + return S_OK; } } //namespace diff --git a/brightray/browser/win/windows_toast_notification.h b/brightray/browser/win/windows_toast_notification.h index d501954ec5c..8b354309742 100644 --- a/brightray/browser/win/windows_toast_notification.h +++ b/brightray/browser/win/windows_toast_notification.h @@ -3,70 +3,73 @@ // Thanks to both of those folks mentioned above who first thought up a bunch of this code // and released it as MIT to the world. -#ifndef __WINDOWS_TOAST_NOTIFICATION_H__ -#define __WINDOWS_TOAST_NOTIFICATION_H__ - -#include "content/public/browser/desktop_notification_delegate.h" -#include "content/public/common/platform_notification_data.h" -#include "base/bind.h" +#ifndef BRIGHTRAY_BROWSER_WIN_WINDOWS_TOAST_NOTIFICATION_H_ +#define BRIGHTRAY_BROWSER_WIN_WINDOWS_TOAST_NOTIFICATION_H_ #include #include #include +#include "base/bind.h" +#include "content/public/browser/desktop_notification_delegate.h" +#include "content/public/common/platform_notification_data.h" + using namespace Microsoft::WRL; using namespace ABI::Windows::UI::Notifications; using namespace ABI::Windows::Foundation; namespace WinToasts { - typedef ITypedEventHandler DesktopToastActivatedEventHandler; - typedef ITypedEventHandler DesktopToastDismissedEventHandler; +using DesktopToastActivatedEventHandler = + ITypedEventHandler; +using DesktopToastDismissedEventHandler = + ITypedEventHandler; - class ToastEventHandler; +class ToastEventHandler; - class WindowsToastNotification - { - public: - WindowsToastNotification(const char* appName, content::DesktopNotificationDelegate* delegate); - ~WindowsToastNotification(); - void ShowNotification(const WCHAR* title, const WCHAR* msg, std::string iconPath, ComPtr& toast); - void DismissNotification(ComPtr toast); - void NotificationClicked(); - void NotificationDismissed(); +class WindowsToastNotification { + public: + WindowsToastNotification(const char* appName, content::DesktopNotificationDelegate* delegate); + ~WindowsToastNotification(); - private: - ComPtr m_eventHandler; + void ShowNotification(const WCHAR* title, const WCHAR* msg, std::string iconPath, ComPtr& toast); + void DismissNotification(ComPtr toast); + void NotificationClicked(); + void NotificationDismissed(); - content::DesktopNotificationDelegate* n_delegate; - ComPtr m_toastManager; - ComPtr m_toastNotifier; + private: + ComPtr m_eventHandler; - HRESULT GetToastXml(IToastNotificationManagerStatics* toastManager, const WCHAR* title, const WCHAR* msg, std::string iconPath, ABI::Windows::Data::Xml::Dom::IXmlDocument** toastXml); - HRESULT SetXmlText(ABI::Windows::Data::Xml::Dom::IXmlDocument* doc, const WCHAR* text); - HRESULT SetXmlText(ABI::Windows::Data::Xml::Dom::IXmlDocument* doc, const WCHAR* title, const WCHAR* body); - HRESULT SetXmlImage(ABI::Windows::Data::Xml::Dom::IXmlDocument* doc, std::string iconPath); - HRESULT GetTextNodeList(HSTRING* tag, ABI::Windows::Data::Xml::Dom::IXmlDocument* doc, ABI::Windows::Data::Xml::Dom::IXmlNodeList** nodeList, UINT32 reqLength); - HRESULT AppendTextToXml(ABI::Windows::Data::Xml::Dom::IXmlDocument* doc, ABI::Windows::Data::Xml::Dom::IXmlNode* node, const WCHAR* text); - HRESULT SetupCallbacks(IToastNotification* toast); - HRESULT CreateHString(const WCHAR* source, HSTRING* dest); - }; + content::DesktopNotificationDelegate* n_delegate; + ComPtr m_toastManager; + ComPtr m_toastNotifier; + + HRESULT GetToastXml(IToastNotificationManagerStatics* toastManager, const WCHAR* title, const WCHAR* msg, std::string iconPath, ABI::Windows::Data::Xml::Dom::IXmlDocument** toastXml); + HRESULT SetXmlText(ABI::Windows::Data::Xml::Dom::IXmlDocument* doc, const WCHAR* text); + HRESULT SetXmlText(ABI::Windows::Data::Xml::Dom::IXmlDocument* doc, const WCHAR* title, const WCHAR* body); + HRESULT SetXmlImage(ABI::Windows::Data::Xml::Dom::IXmlDocument* doc, std::string iconPath); + HRESULT GetTextNodeList(HSTRING* tag, ABI::Windows::Data::Xml::Dom::IXmlDocument* doc, ABI::Windows::Data::Xml::Dom::IXmlNodeList** nodeList, UINT32 reqLength); + HRESULT AppendTextToXml(ABI::Windows::Data::Xml::Dom::IXmlDocument* doc, ABI::Windows::Data::Xml::Dom::IXmlNode* node, const WCHAR* text); + HRESULT SetupCallbacks(IToastNotification* toast); + HRESULT CreateHString(const WCHAR* source, HSTRING* dest); +}; - class ToastEventHandler : - public RuntimeClass, DesktopToastActivatedEventHandler, DesktopToastDismissedEventHandler> - { - public: - ToastEventHandler(WindowsToastNotification* notification, content::DesktopNotificationDelegate* delegate); - ~ToastEventHandler(); - IFACEMETHODIMP Invoke(IToastNotification* sender, IInspectable* args); - IFACEMETHODIMP Invoke(IToastNotification* sender, IToastDismissedEventArgs* e); +class ToastEventHandler : public RuntimeClass, + DesktopToastActivatedEventHandler, + DesktopToastDismissedEventHandler> { + public: + ToastEventHandler(WindowsToastNotification* notification, content::DesktopNotificationDelegate* delegate); + ~ToastEventHandler(); - private: - WindowsToastNotification* m_notification; - content::DesktopNotificationDelegate* n_delegate; - }; + IFACEMETHODIMP Invoke(IToastNotification* sender, IInspectable* args); + IFACEMETHODIMP Invoke(IToastNotification* sender, IToastDismissedEventArgs* e); + + private: + WindowsToastNotification* m_notification; + content::DesktopNotificationDelegate* n_delegate; +}; } // namespace -#endif //__WINDOWS_TOAST_NOTIFICATION_H__ \ No newline at end of file +#endif // BRIGHTRAY_BROWSER_WIN_WINDOWS_TOAST_NOTIFICATION_H_