1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4 
5 #ifndef nsSyncRunnableHelpers_h
6 #define nsSyncRunnableHelpers_h
7 
8 #include "nsThreadUtils.h"
9 #include "nsProxyRelease.h"
10 
11 #include "mozilla/Monitor.h"
12 #include "msgIOAuth2Module.h"
13 #include "nsIStreamListener.h"
14 #include "nsIImapMailFolderSink.h"
15 #include "nsIImapServerSink.h"
16 #include "nsIImapProtocolSink.h"
17 #include "nsIImapMessageSink.h"
18 
19 // The classes in this file proxy method calls to the main thread
20 // synchronously. The main thread must not block on this thread, or a
21 // deadlock condition can occur.
22 
23 class StreamListenerProxy final : public nsIStreamListener {
24  public:
StreamListenerProxy(nsIStreamListener * receiver)25   explicit StreamListenerProxy(nsIStreamListener* receiver)
26       : mReceiver(receiver) {
27     MOZ_DIAGNOSTIC_ASSERT(
28         receiver, "Null receiver, crash now to get feedback instead of later");
29   }
30 
31   NS_DECL_THREADSAFE_ISUPPORTS
32   NS_DECL_NSIREQUESTOBSERVER
33   NS_DECL_NSISTREAMLISTENER
34 
35  private:
~StreamListenerProxy()36   ~StreamListenerProxy() {
37     NS_ReleaseOnMainThread("StreamListenerProxy::mReceiver",
38                            mReceiver.forget());
39   }
40   nsCOMPtr<nsIStreamListener> mReceiver;
41 };
42 
43 class ImapMailFolderSinkProxy final : public nsIImapMailFolderSink {
44  public:
ImapMailFolderSinkProxy(nsIImapMailFolderSink * receiver)45   explicit ImapMailFolderSinkProxy(nsIImapMailFolderSink* receiver)
46       : mReceiver(receiver) {
47     MOZ_DIAGNOSTIC_ASSERT(
48         receiver, "Null receiver, crash now to get feedback instead of later");
49   }
50 
51   NS_DECL_THREADSAFE_ISUPPORTS
52   NS_DECL_NSIIMAPMAILFOLDERSINK
53 
54  private:
~ImapMailFolderSinkProxy()55   ~ImapMailFolderSinkProxy() {
56     NS_ReleaseOnMainThread("ImapMailFolderSinkProxy::mReceiver",
57                            mReceiver.forget());
58   }
59   nsCOMPtr<nsIImapMailFolderSink> mReceiver;
60 };
61 
62 class ImapServerSinkProxy final : public nsIImapServerSink {
63  public:
ImapServerSinkProxy(nsIImapServerSink * receiver)64   explicit ImapServerSinkProxy(nsIImapServerSink* receiver)
65       : mReceiver(receiver) {
66     MOZ_DIAGNOSTIC_ASSERT(
67         receiver, "Null receiver, crash now to get feedback instead of later");
68   }
69 
70   NS_DECL_THREADSAFE_ISUPPORTS
71   NS_DECL_NSIIMAPSERVERSINK
72 
73  private:
~ImapServerSinkProxy()74   ~ImapServerSinkProxy() {
75     NS_ReleaseOnMainThread("ImapServerSinkProxy::mReceiver",
76                            mReceiver.forget());
77   }
78   nsCOMPtr<nsIImapServerSink> mReceiver;
79 };
80 
81 class ImapMessageSinkProxy final : public nsIImapMessageSink {
82  public:
ImapMessageSinkProxy(nsIImapMessageSink * receiver)83   explicit ImapMessageSinkProxy(nsIImapMessageSink* receiver)
84       : mReceiver(receiver) {
85     MOZ_DIAGNOSTIC_ASSERT(
86         receiver, "Null receiver, crash now to get feedback instead of later");
87   }
88 
89   NS_DECL_THREADSAFE_ISUPPORTS
90   NS_DECL_NSIIMAPMESSAGESINK
91 
92  private:
~ImapMessageSinkProxy()93   ~ImapMessageSinkProxy() {
94     NS_ReleaseOnMainThread("ImapMessageSinkProxy::mReceiver",
95                            mReceiver.forget());
96   }
97   nsCOMPtr<nsIImapMessageSink> mReceiver;
98 };
99 
100 class ImapProtocolSinkProxy final : public nsIImapProtocolSink {
101  public:
ImapProtocolSinkProxy(nsIImapProtocolSink * receiver)102   explicit ImapProtocolSinkProxy(nsIImapProtocolSink* receiver)
103       : mReceiver(receiver) {
104     MOZ_DIAGNOSTIC_ASSERT(
105         receiver, "Null receiver, crash now to get feedback instead of later");
106   }
107 
108   NS_DECL_THREADSAFE_ISUPPORTS
109   NS_DECL_NSIIMAPPROTOCOLSINK
110 
111  private:
~ImapProtocolSinkProxy()112   ~ImapProtocolSinkProxy() {
113     NS_ReleaseOnMainThread("ImapProtocolSinkProxy::mReceiver",
114                            mReceiver.forget());
115   }
116   nsCOMPtr<nsIImapProtocolSink> mReceiver;
117 };
118 
119 class msgIOAuth2Module;
120 class nsIMsgIncomingServer;
121 
122 namespace mozilla {
123 namespace mailnews {
124 
125 class OAuth2ThreadHelper final : public msgIOAuth2ModuleListener {
126  public:
127   explicit OAuth2ThreadHelper(nsIMsgIncomingServer* aServer);
128 
129   NS_DECL_THREADSAFE_ISUPPORTS
130   NS_DECL_MSGIOAUTH2MODULELISTENER
131 
132   bool SupportsOAuth2();
133   void GetXOAuth2String(nsACString& base64Str);
134 
135  private:
136   ~OAuth2ThreadHelper();
137   void Init();
138   void Connect();
139 
140   Monitor mMonitor;
141   nsCOMPtr<msgIOAuth2Module> mOAuth2Support;
142   nsCOMPtr<nsIMsgIncomingServer> mServer;
143   nsCString mOAuth2String;
144 };
145 
146 }  // namespace mailnews
147 }  // namespace mozilla
148 
149 #endif  // nsSyncRunnableHelpers_h
150