diff options
Diffstat (limited to 'toolkit/mozapps/notificationserver/NotificationCallback.h')
-rw-r--r-- | toolkit/mozapps/notificationserver/NotificationCallback.h | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/toolkit/mozapps/notificationserver/NotificationCallback.h b/toolkit/mozapps/notificationserver/NotificationCallback.h new file mode 100644 index 0000000000..0611186e0f --- /dev/null +++ b/toolkit/mozapps/notificationserver/NotificationCallback.h @@ -0,0 +1,73 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef NotificationCallback_h__ +#define NotificationCallback_h__ + +#include <filesystem> +#include <tuple> +#include <unknwn.h> +#include <wrl.h> + +#include "mozilla/Maybe.h" +#include "nsWindowsHelpers.h" + +using namespace Microsoft::WRL; +using namespace std::filesystem; + +// Windows 10+ declarations. +// TODO remove declarations and add `#include +// <notificationactivationcallback.h>` when Windows 10 is the minimum supported. +typedef struct NOTIFICATION_USER_INPUT_DATA { + LPCWSTR Key; + LPCWSTR Value; +} NOTIFICATION_USER_INPUT_DATA; + +MIDL_INTERFACE("53E31837-6600-4A81-9395-75CFFE746F94") +INotificationActivationCallback : public IUnknown { + public: + virtual HRESULT STDMETHODCALLTYPE Activate( + LPCWSTR appUserModelId, LPCWSTR invokedArgs, + const NOTIFICATION_USER_INPUT_DATA* data, ULONG count) = 0; +}; + +struct ToastArgs { + std::wstring profile; + std::wstring windowsTag; + std::wstring action; +}; + +class NotificationCallback final + : public RuntimeClass<RuntimeClassFlags<ClassicCom>, + INotificationActivationCallback> { + public: + HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject) final; + + HRESULT STDMETHODCALLTYPE Activate(LPCWSTR appUserModelId, + LPCWSTR invokedArgs, + const NOTIFICATION_USER_INPUT_DATA* data, + ULONG dataCount) final; + + explicit NotificationCallback(const GUID& runtimeGuid, + const path& dllInstallDir) + : guid(runtimeGuid), installDir(dllInstallDir) {} + + private: + const GUID guid = {}; + const path installDir = {}; + + void HandleActivation(LPCWSTR invokedArgs); + mozilla::Maybe<ToastArgs> ParseToastArguments(LPCWSTR invokedArgs); + std::tuple<path, mozilla::UniquePtr<wchar_t[]>> BuildRunCommand( + const ToastArgs& args); + + static mozilla::Maybe<nsAutoHandle> CreatePipe(const std::wstring& tag); + static bool ConnectPipeWithTimeout(const nsAutoHandle& pipe); + static void HandlePipeMessages(const nsAutoHandle& pipe); + static DWORD TransferForegroundPermission(const DWORD pid); +}; + +#endif |