summaryrefslogtreecommitdiffstats
path: root/widget/windows/ToastNotificationHandler.h
blob: 106756d9ce6a59b5cf9294f0fc764d961c22b577 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* 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 ToastNotificationHandler_h__
#define ToastNotificationHandler_h__

#include <windows.ui.notifications.h>
#include <windows.data.xml.dom.h>
#include <wrl.h>
#include "nsCOMPtr.h"
#include "nsIAlertsService.h"
#include "nsICancelable.h"
#include "nsIFile.h"
#include "nsString.h"

namespace mozilla {
namespace widget {

class ToastNotification;

class ToastNotificationHandler final
    : public nsIAlertNotificationImageListener {
 public:
  NS_DECL_ISUPPORTS
  NS_DECL_NSIALERTNOTIFICATIONIMAGELISTENER

  ToastNotificationHandler(ToastNotification* backend,
                           nsIObserver* aAlertListener, const nsAString& aName,
                           const nsAString& aCookie, const nsAString& aTitle,
                           const nsAString& aMsg, const nsAString& aHostPort,
                           bool aClickable)
      : mBackend(backend),
        mHasImage(false),
        mAlertListener(aAlertListener),
        mName(aName),
        mCookie(aCookie),
        mTitle(aTitle),
        mMsg(aMsg),
        mHostPort(aHostPort),
        mClickable(aClickable),
        mSentFinished(!aAlertListener) {}

  nsresult InitAlertAsync(nsIAlertNotification* aAlert);

  void OnWriteBitmapFinished(nsresult rv);

  void UnregisterHandler();

 protected:
  virtual ~ToastNotificationHandler();

  typedef ABI::Windows::Data::Xml::Dom::IXmlDocument IXmlDocument;
  typedef ABI::Windows::UI::Notifications::IToastNotifier IToastNotifier;
  typedef ABI::Windows::UI::Notifications::IToastNotification
      IToastNotification;
  typedef ABI::Windows::UI::Notifications::IToastDismissedEventArgs
      IToastDismissedEventArgs;
  typedef ABI::Windows::UI::Notifications::IToastFailedEventArgs
      IToastFailedEventArgs;
  typedef ABI::Windows::UI::Notifications::ToastTemplateType ToastTemplateType;

  Microsoft::WRL::ComPtr<IToastNotification> mNotification;
  Microsoft::WRL::ComPtr<IToastNotifier> mNotifier;

  RefPtr<ToastNotification> mBackend;

  nsCOMPtr<nsICancelable> mImageRequest;
  nsCOMPtr<nsIFile> mImageFile;
  nsString mImageUri;
  bool mHasImage;

  EventRegistrationToken mActivatedToken;
  EventRegistrationToken mDismissedToken;
  EventRegistrationToken mFailedToken;

  nsCOMPtr<nsIObserver> mAlertListener;
  nsString mName;
  nsString mCookie;
  nsString mTitle;
  nsString mMsg;
  nsString mHostPort;
  bool mClickable;
  bool mSentFinished;

  nsresult TryShowAlert();
  bool ShowAlert();
  nsresult AsyncSaveImage(imgIRequest* aRequest);
  nsresult OnWriteBitmapSuccess();
  void SendFinished();

  bool CreateWindowsNotificationFromXml(IXmlDocument* aToastXml);
  Microsoft::WRL::ComPtr<IXmlDocument> InitializeXmlForTemplate(
      ToastTemplateType templateType);

  HRESULT OnActivate(IToastNotification* notification,
                     IInspectable* inspectable);
  HRESULT OnDismiss(IToastNotification* notification,
                    IToastDismissedEventArgs* aArgs);
  HRESULT OnFail(IToastNotification* notification,
                 IToastFailedEventArgs* aArgs);
};

}  // namespace widget
}  // namespace mozilla

#endif