summary refs log tree commit diff stats
path: root/src/fe-gtk/notifications
diff options
context:
space:
mode:
authorMark Jansen <learn0more@gmail.com>2017-04-06 00:10:53 +0200
committerTingPing <tingping@tingping.se>2017-04-28 07:33:36 -0400
commitec94565cb90134dfedd585a45c8266cc2e21ef4c (patch)
tree35d5a821b92fbd6d5c646881d369578975e3a069 /src/fe-gtk/notifications
parent552b2b1315b45286b063e99510d6d6cb1b6f7575 (diff)
winrt: Show some exceptions
Diffstat (limited to 'src/fe-gtk/notifications')
-rw-r--r--src/fe-gtk/notifications/notification-backend.h2
-rw-r--r--src/fe-gtk/notifications/notification-windows.c7
-rw-r--r--src/fe-gtk/notifications/notification-winrt.cpp36
3 files changed, 38 insertions, 7 deletions
diff --git a/src/fe-gtk/notifications/notification-backend.h b/src/fe-gtk/notifications/notification-backend.h
index b60ced4e..4bcaa7d8 100644
--- a/src/fe-gtk/notifications/notification-backend.h
+++ b/src/fe-gtk/notifications/notification-backend.h
@@ -21,7 +21,7 @@
 
 int notification_backend_supported (void);
 void notification_backend_show (const char *title, const char *text);
-int notification_backend_init (void);
+int notification_backend_init (const char **error);
 void notification_backend_deinit (void);
 
 #endif
diff --git a/src/fe-gtk/notifications/notification-windows.c b/src/fe-gtk/notifications/notification-windows.c
index 3fade306..9033f36a 100644
--- a/src/fe-gtk/notifications/notification-windows.c
+++ b/src/fe-gtk/notifications/notification-windows.c
@@ -24,7 +24,7 @@
 #include <Windows.h>
 
 void (*winrt_notification_backend_show) (const char *title, const char *text) = NULL;
-int (*winrt_notification_backend_init) (void) = NULL;
+int (*winrt_notification_backend_init) (const char **error) = NULL;
 void (*winrt_notification_backend_deinit) (void) = NULL;
 int (*winrt_notification_backend_supported) (void) = NULL;
 
@@ -40,7 +40,7 @@ notification_backend_show (const char *title, const char *text)
 }
 
 int
-notification_backend_init (void)
+notification_backend_init (const char **error)
 {
 	UINT original_error_mode;
 	GModule *module;
@@ -53,6 +53,7 @@ notification_backend_init (void)
 
 	if (module == NULL)
 	{
+		*error = "hcnotifications-winrt not found.";
 		return 0;
 	}
 
@@ -61,7 +62,7 @@ notification_backend_init (void)
 	g_module_symbol (module, "notification_backend_deinit", (gpointer *) &winrt_notification_backend_deinit);
 	g_module_symbol (module, "notification_backend_supported", (gpointer *) &winrt_notification_backend_supported);
 
-	return winrt_notification_backend_init ();
+	return winrt_notification_backend_init (error);
 }
 
 void
diff --git a/src/fe-gtk/notifications/notification-winrt.cpp b/src/fe-gtk/notifications/notification-winrt.cpp
index 338214ee..3b966cf0 100644
--- a/src/fe-gtk/notifications/notification-winrt.cpp
+++ b/src/fe-gtk/notifications/notification-winrt.cpp
@@ -22,6 +22,7 @@
 
 #include <string>
 #include <codecvt>
+#include <strsafe.h>
 
 #include <roapi.h>
 #include <windows.ui.notifications.h>
@@ -38,6 +39,14 @@ widen(const std::string & to_widen)
 	return converter.from_bytes(to_widen);
 }
 
+static std::string
+narrow(const std::wstring & to_narrow)
+{
+	std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
+	return converter.to_bytes(to_narrow);
+}
+
+
 extern "C"
 {
 	__declspec (dllexport) void
@@ -74,13 +83,34 @@ extern "C"
 	}
 
 	__declspec (dllexport) int
-	notification_backend_init (void)
+	notification_backend_init (const char **error)
 	{
-		if (!notifier)
-			notifier = ToastNotificationManager::CreateToastNotifier (L"HexChat.Desktop.Notify");
+		try
+		{
+			if (!notifier)
+				notifier = ToastNotificationManager::CreateToastNotifier (L"HexChat.Desktop.Notify");
+		}
+		catch (Platform::Exception ^ ex)
+		{
+			static char exc_message[1024];
+			std::string tmp = narrow(std::wstring(ex->Message->Data()));
+			if (SUCCEEDED(StringCchPrintfA(exc_message, _countof(exc_message), "Error (0x%x): %s", ex->HResult, tmp.c_str())))
+				*error = exc_message;
+			else
+				*error = "Exception + error converting exception message.";
+			return 0;
+		}
+		catch (...)
+		{
+			*error = "Generic c++ exception.";
+			return 0;
+		}
 
 		if (FAILED (Windows::Foundation::Initialize (RO_INIT_SINGLETHREADED)))
+		{
+			*error = "Error initializing Windows::Foundation.";
 			return 0;
+		}
 
 		return 1;
 	}