From cf86eea70d32381c0c036a42c1dd08bdcca332dc Mon Sep 17 00:00:00 2001 From: MikalaiR Date: Sun, 30 Aug 2015 16:26:27 +0000 Subject: Toaster: protocol icon if no avatar; errors logging git-svn-id: http://svn.miranda-ng.org/main/trunk@15118 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/Toaster/src/services.cpp | 62 ++++++++++++++++++++++++++++-- plugins/Toaster/src/stdafx.h | 3 ++ plugins/Toaster/src/toast_event_handler.h | 1 - plugins/Toaster/src/toast_notification.cpp | 40 ++++++++----------- plugins/Toaster/src/toast_notification.h | 2 + plugins/Toaster/src/version.h | 2 +- 6 files changed, 82 insertions(+), 28 deletions(-) (limited to 'plugins') diff --git a/plugins/Toaster/src/services.cpp b/plugins/Toaster/src/services.cpp index 9c3d4b12bd..3369a2ffb8 100644 --- a/plugins/Toaster/src/services.cpp +++ b/plugins/Toaster/src/services.cpp @@ -7,6 +7,41 @@ __forceinline bool isChatRoom(MCONTACT hContact) { return (db_get_b(hContact, GetContactProto(hContact), "ChatRoom", 0) == 1); } +wchar_t* SaveBitmap(HBITMAP bmp, const char *szProto) +{ + wchar_t wszSavePath[MAX_PATH], wszRelativePath[MAX_PATH]; + GetEnvironmentVariableW(L"TEMP", wszSavePath, MAX_PATH); + mir_snwprintf(wszRelativePath, L"\\MirandaToaster.%s.png", _A2T(szProto)); + wcscat_s(wszSavePath, wszRelativePath); + + if (!(GetFileAttributes(wszSavePath) < 0xFFFFFFF)) + { + IMGSRVC_INFO isi = { sizeof(isi) }; + isi.wszName = mir_wstrdup(wszSavePath); + isi.hbm = bmp; + isi.dwMask = IMGI_HBITMAP; + isi.fif = FREE_IMAGE_FORMAT::FIF_PNG; + CallService(MS_IMG_SAVE, (WPARAM)&isi, IMGL_WCHAR); + } + + return mir_wstrdup(wszSavePath); +} + +wchar_t* ProtoIcon(const char *szProto) +{ + HICON hIcon = Skin_LoadProtoIcon(szProto, ID_STATUS_ONLINE, 1); + wchar_t *wszResult = NULL; + ICONINFO icon; + if (GetIconInfo(hIcon, &icon)) + { + wszResult = SaveBitmap(icon.hbmColor, szProto); + + DeleteObject(icon.hbmMask); + DeleteObject(icon.hbmColor); + } + return wszResult; +} + static void __cdecl OnToastNotificationClicked(void* arg) { callbackArg *cb = (callbackArg*)arg; @@ -15,7 +50,7 @@ static void __cdecl OnToastNotificationClicked(void* arg) { if (!isChatRoom(hContact)) { - CallService(MS_MSG_SENDMESSAGE, (WPARAM)hContact, (LPARAM)""); + CallService(MS_MSG_SENDMESSAGE, (WPARAM)hContact); } else { @@ -48,12 +83,33 @@ static void ShowToastNotification(TCHAR* text, TCHAR* title, MCONTACT hContact) { imagePath = mir_tstrdup(pai.filename); } + else + { + imagePath = ProtoIcon(szProto); + } + } + else + { + imagePath = ProtoIcon(szProto); } } arg->notification = new ToastNotification(text, title, imagePath); - arg->notification->Show(new ToastEventHandler(OnToastNotificationClicked, arg)); - lstNotifications.insert(arg->notification); + + HRESULT hr = arg->notification->Initialize(); + if (SUCCEEDED(hr)) + { + arg->notification->Show(new ToastEventHandler(OnToastNotificationClicked, arg)); + lstNotifications.insert(arg->notification); + } + else + { +#ifdef _DEBUG + DebugBreak(); +#else + Netlib_Logf(NULL, "Toaster: " __FUNCTION__ " failed: HRESULT = %lld", hr); +#endif + } } static INT_PTR CreatePopup(WPARAM wParam, LPARAM) diff --git a/plugins/Toaster/src/stdafx.h b/plugins/Toaster/src/stdafx.h index f763765039..ac22e2cf5a 100644 --- a/plugins/Toaster/src/stdafx.h +++ b/plugins/Toaster/src/stdafx.h @@ -16,6 +16,9 @@ #include #include #include +#include +#include +#include #include "version.h" #include "resource.h" diff --git a/plugins/Toaster/src/toast_event_handler.h b/plugins/Toaster/src/toast_event_handler.h index 8cf82b3e21..a5a616d81d 100644 --- a/plugins/Toaster/src/toast_event_handler.h +++ b/plugins/Toaster/src/toast_event_handler.h @@ -21,7 +21,6 @@ public: IFACEMETHODIMP Invoke(_In_ ABI::Windows::UI::Notifications::IToastNotification* sender, _In_ IInspectable* args); IFACEMETHODIMP Invoke(_In_ ABI::Windows::UI::Notifications::IToastNotification* /* sender */, _In_ ABI::Windows::UI::Notifications::IToastDismissedEventArgs* e); IFACEMETHODIMP Invoke(_In_ ABI::Windows::UI::Notifications::IToastNotification* /* sender */, _In_ ABI::Windows::UI::Notifications::IToastFailedEventArgs* /* e */); - private: ULONG _ref; void* _arg; diff --git a/plugins/Toaster/src/toast_notification.cpp b/plugins/Toaster/src/toast_notification.cpp index 47f98dbf28..8c2eebf32b 100644 --- a/plugins/Toaster/src/toast_notification.cpp +++ b/plugins/Toaster/src/toast_notification.cpp @@ -3,13 +3,26 @@ ToastNotification::ToastNotification(_In_ wchar_t* text, _In_ wchar_t* caption, _In_ wchar_t* imagePath) : _text(text), _caption(caption), _imagePath(imagePath) { - } ToastNotification::~ToastNotification() { } +HRESULT ToastNotification::Initialize() +{ + HRESULT hr = Windows::Foundation::GetActivationFactory(StringReferenceWrapper(RuntimeClass_Windows_UI_Notifications_ToastNotificationManager).Get(), ¬ificationManager); + if (SUCCEEDED(hr)) + { + hr = notificationManager->CreateToastNotifierWithId(StringReferenceWrapper(::AppUserModelID).Get(), ¬ifier); + if (SUCCEEDED(hr)) + { + hr = Create(¬ification); + } + } + return hr; +} + HRESULT ToastNotification::GetNodeByTag(_In_ HSTRING tagName, _Outptr_ ABI::Windows::Data::Xml::Dom::IXmlNode **node, _In_ ABI::Windows::Data::Xml::Dom::IXmlDocument* xml) { Microsoft::WRL::ComPtr nodeList; @@ -152,15 +165,11 @@ HRESULT ToastNotification::Setup(_In_ ABI::Windows::Data::Xml::Dom::IXmlDocument HRESULT ToastNotification::CreateXml(_Outptr_ ABI::Windows::Data::Xml::Dom::IXmlDocument** xml) { - Microsoft::WRL::ComPtr notificationManager; - HRESULT hr = Windows::Foundation::GetActivationFactory(StringReferenceWrapper(RuntimeClass_Windows_UI_Notifications_ToastNotificationManager).Get(), ¬ificationManager); - if (FAILED(hr)) - RaiseException(static_cast(STATUS_INVALID_PARAMETER), EXCEPTION_NONCONTINUABLE, 0, nullptr); - ABI::Windows::UI::Notifications::ToastTemplateType templateId = _imagePath == nullptr ? ABI::Windows::UI::Notifications::ToastTemplateType_ToastText02 : ABI::Windows::UI::Notifications::ToastTemplateType_ToastImageAndText02; - hr = notificationManager->GetTemplateContent(templateId, xml); + + HRESULT hr = notificationManager->GetTemplateContent(templateId, xml); if (FAILED(hr)) return hr; @@ -177,9 +186,7 @@ HRESULT ToastNotification::CreateXml(_Outptr_ ABI::Windows::Data::Xml::Dom::IXml wchar_t* textValues[] = { - _caption == nullptr - ? L"Miranda NG" - : _caption, + _caption == nullptr ? L"Miranda NG" : _caption, _text }; @@ -208,19 +215,6 @@ HRESULT ToastNotification::Show() HRESULT ToastNotification::Show(_In_ ToastEventHandler* handler) { - Microsoft::WRL::ComPtr notificationManager; - HRESULT hr = Windows::Foundation::GetActivationFactory(StringReferenceWrapper(RuntimeClass_Windows_UI_Notifications_ToastNotificationManager).Get(), ¬ificationManager); - if (FAILED(hr)) - return hr; - //RaiseException(static_cast(STATUS_INVALID_PARAMETER), EXCEPTION_NONCONTINUABLE, 0, nullptr); - - hr = notificationManager->CreateToastNotifierWithId(StringReferenceWrapper(::AppUserModelID).Get(), ¬ifier); - if (FAILED(hr)) - return hr; - hr = Create(¬ification); - if (FAILED(hr)) - return hr; - EventRegistrationToken activatedToken, dismissedToken, failedToken; Microsoft::WRL::ComPtr eventHandler(handler); diff --git a/plugins/Toaster/src/toast_notification.h b/plugins/Toaster/src/toast_notification.h index 0e4131b945..1f688744bd 100644 --- a/plugins/Toaster/src/toast_notification.h +++ b/plugins/Toaster/src/toast_notification.h @@ -8,6 +8,7 @@ private: wchar_t* _caption; wchar_t* _imagePath; + Microsoft::WRL::ComPtr notificationManager; Microsoft::WRL::ComPtr notifier; Microsoft::WRL::ComPtr notification; @@ -25,6 +26,7 @@ public: COLORREF foreground; ToastNotification(_In_ wchar_t* text, _In_ wchar_t* caption = nullptr, _In_ wchar_t* imagePath = nullptr); + HRESULT Initialize(); ~ToastNotification(); HRESULT Show(); diff --git a/plugins/Toaster/src/version.h b/plugins/Toaster/src/version.h index 7a0f1cdd24..02dc95757d 100644 --- a/plugins/Toaster/src/version.h +++ b/plugins/Toaster/src/version.h @@ -1,7 +1,7 @@ #define __MAJOR_VERSION 0 #define __MINOR_VERSION 11 #define __RELEASE_NUM 1 -#define __BUILD_NUM 0 +#define __BUILD_NUM 1 #include -- cgit v1.2.3