embedding/components/printingui/src/unixshared/nsPrintProgress.cpp

changeset 0
6474c204b198
equal deleted inserted replaced
-1:000000000000 0:a583f37e2254
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5
6 #include "nsPrintProgress.h"
7
8 #include "nsIBaseWindow.h"
9 #include "nsISupportsArray.h"
10 #include "nsXPCOM.h"
11 #include "nsISupportsPrimitives.h"
12 #include "nsIComponentManager.h"
13
14 NS_IMPL_ADDREF(nsPrintProgress)
15 NS_IMPL_RELEASE(nsPrintProgress)
16
17 NS_INTERFACE_MAP_BEGIN(nsPrintProgress)
18 NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIPrintStatusFeedback)
19 NS_INTERFACE_MAP_ENTRY(nsIPrintProgress)
20 NS_INTERFACE_MAP_ENTRY(nsIPrintStatusFeedback)
21 NS_INTERFACE_MAP_ENTRY(nsIWebProgressListener)
22 NS_INTERFACE_MAP_END_THREADSAFE
23
24
25 nsPrintProgress::nsPrintProgress(nsIPrintSettings* aPrintSettings)
26 {
27 m_closeProgress = false;
28 m_processCanceled = false;
29 m_pendingStateFlags = -1;
30 m_pendingStateValue = NS_OK;
31 m_PrintSetting = aPrintSettings;
32 }
33
34 nsPrintProgress::~nsPrintProgress()
35 {
36 (void)ReleaseListeners();
37 }
38
39 /* void openProgressDialog (in nsIDOMWindow parent, in string dialogURL, in nsISupports parameters); */
40 NS_IMETHODIMP nsPrintProgress::OpenProgressDialog(nsIDOMWindow *parent,
41 const char *dialogURL,
42 nsISupports *parameters,
43 nsIObserver *openDialogObserver,
44 bool *notifyOnOpen)
45 {
46 *notifyOnOpen = true;
47 m_observer = openDialogObserver;
48 nsresult rv = NS_ERROR_FAILURE;
49
50 if (m_dialog)
51 return NS_ERROR_ALREADY_INITIALIZED;
52
53 if (!dialogURL || !*dialogURL)
54 return NS_ERROR_INVALID_ARG;
55
56 if (parent)
57 {
58 // Set up window.arguments[0]...
59 nsCOMPtr<nsISupportsArray> array;
60 rv = NS_NewISupportsArray(getter_AddRefs(array));
61 NS_ENSURE_SUCCESS(rv, rv);
62
63 nsCOMPtr<nsISupportsInterfacePointer> ifptr =
64 do_CreateInstance(NS_SUPPORTS_INTERFACE_POINTER_CONTRACTID, &rv);
65 NS_ENSURE_SUCCESS(rv, rv);
66
67 ifptr->SetData(static_cast<nsIPrintProgress*>(this));
68 ifptr->SetDataIID(&NS_GET_IID(nsIPrintProgress));
69
70 array->AppendElement(ifptr);
71
72 array->AppendElement(parameters);
73
74 // Open the dialog.
75 nsCOMPtr<nsIDOMWindow> newWindow;
76 rv = parent->OpenDialog(NS_ConvertASCIItoUTF16(dialogURL),
77 NS_LITERAL_STRING("_blank"),
78 NS_LITERAL_STRING("chrome,titlebar,dependent,centerscreen"),
79 array, getter_AddRefs(newWindow));
80 }
81
82 return rv;
83 }
84
85 /* void closeProgressDialog (in boolean forceClose); */
86 NS_IMETHODIMP nsPrintProgress::CloseProgressDialog(bool forceClose)
87 {
88 m_closeProgress = true;
89 // XXX Invalid cast of bool to nsresult (bug 778106)
90 return OnStateChange(nullptr, nullptr, nsIWebProgressListener::STATE_STOP,
91 (nsresult)forceClose);
92 }
93
94 /* nsIPrompt GetPrompter (); */
95 NS_IMETHODIMP nsPrintProgress::GetPrompter(nsIPrompt **_retval)
96 {
97 NS_ENSURE_ARG_POINTER(_retval);
98 *_retval = nullptr;
99
100 if (! m_closeProgress && m_dialog)
101 return m_dialog->GetPrompter(_retval);
102
103 return NS_ERROR_FAILURE;
104 }
105
106 /* attribute boolean processCanceledByUser; */
107 NS_IMETHODIMP nsPrintProgress::GetProcessCanceledByUser(bool *aProcessCanceledByUser)
108 {
109 NS_ENSURE_ARG_POINTER(aProcessCanceledByUser);
110 *aProcessCanceledByUser = m_processCanceled;
111 return NS_OK;
112 }
113 NS_IMETHODIMP nsPrintProgress::SetProcessCanceledByUser(bool aProcessCanceledByUser)
114 {
115 if(m_PrintSetting)
116 m_PrintSetting->SetIsCancelled(true);
117 m_processCanceled = aProcessCanceledByUser;
118 OnStateChange(nullptr, nullptr, nsIWebProgressListener::STATE_STOP, NS_OK);
119 return NS_OK;
120 }
121
122 /* void RegisterListener (in nsIWebProgressListener listener); */
123 NS_IMETHODIMP nsPrintProgress::RegisterListener(nsIWebProgressListener * listener)
124 {
125 if (!listener) //Nothing to do with a null listener!
126 return NS_OK;
127
128 m_listenerList.AppendObject(listener);
129 if (m_closeProgress || m_processCanceled)
130 listener->OnStateChange(nullptr, nullptr, nsIWebProgressListener::STATE_STOP, NS_OK);
131 else
132 {
133 listener->OnStatusChange(nullptr, nullptr, NS_OK, m_pendingStatus.get());
134 if (m_pendingStateFlags != -1)
135 listener->OnStateChange(nullptr, nullptr, m_pendingStateFlags, m_pendingStateValue);
136 }
137
138 return NS_OK;
139 }
140
141 /* void UnregisterListener (in nsIWebProgressListener listener); */
142 NS_IMETHODIMP nsPrintProgress::UnregisterListener(nsIWebProgressListener *listener)
143 {
144 if (listener)
145 m_listenerList.RemoveObject(listener);
146
147 return NS_OK;
148 }
149
150 /* void doneIniting (); */
151 NS_IMETHODIMP nsPrintProgress::DoneIniting()
152 {
153 if (m_observer) {
154 m_observer->Observe(nullptr, nullptr, nullptr);
155 }
156 return NS_OK;
157 }
158
159 /* void onStateChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in unsigned long aStateFlags, in nsresult aStatus); */
160 NS_IMETHODIMP nsPrintProgress::OnStateChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, uint32_t aStateFlags, nsresult aStatus)
161 {
162 m_pendingStateFlags = aStateFlags;
163 m_pendingStateValue = aStatus;
164
165 uint32_t count = m_listenerList.Count();
166 for (uint32_t i = count - 1; i < count; i --)
167 {
168 nsCOMPtr<nsIWebProgressListener> progressListener = m_listenerList.SafeObjectAt(i);
169 if (progressListener)
170 progressListener->OnStateChange(aWebProgress, aRequest, aStateFlags, aStatus);
171 }
172
173 return NS_OK;
174 }
175
176 /* void onProgressChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in long aCurSelfProgress, in long aMaxSelfProgress, in long aCurTotalProgress, in long aMaxTotalProgress); */
177 NS_IMETHODIMP nsPrintProgress::OnProgressChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, int32_t aCurSelfProgress, int32_t aMaxSelfProgress, int32_t aCurTotalProgress, int32_t aMaxTotalProgress)
178 {
179 uint32_t count = m_listenerList.Count();
180 for (uint32_t i = count - 1; i < count; i --)
181 {
182 nsCOMPtr<nsIWebProgressListener> progressListener = m_listenerList.SafeObjectAt(i);
183 if (progressListener)
184 progressListener->OnProgressChange(aWebProgress, aRequest, aCurSelfProgress, aMaxSelfProgress, aCurTotalProgress, aMaxTotalProgress);
185 }
186
187 return NS_OK;
188 }
189
190 /* void onLocationChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in nsIURI location, in unsigned long aFlags); */
191 NS_IMETHODIMP nsPrintProgress::OnLocationChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, nsIURI *location, uint32_t aFlags)
192 {
193 return NS_ERROR_NOT_IMPLEMENTED;
194 }
195
196 /* void onStatusChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in nsresult aStatus, in wstring aMessage); */
197 NS_IMETHODIMP nsPrintProgress::OnStatusChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, nsresult aStatus, const char16_t *aMessage)
198 {
199 if (aMessage && *aMessage)
200 m_pendingStatus = aMessage;
201
202 uint32_t count = m_listenerList.Count();
203 for (uint32_t i = count - 1; i < count; i --)
204 {
205 nsCOMPtr<nsIWebProgressListener> progressListener = m_listenerList.SafeObjectAt(i);
206 if (progressListener)
207 progressListener->OnStatusChange(aWebProgress, aRequest, aStatus, aMessage);
208 }
209
210 return NS_OK;
211 }
212
213 /* void onSecurityChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in unsigned long state); */
214 NS_IMETHODIMP nsPrintProgress::OnSecurityChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, uint32_t state)
215 {
216 return NS_OK;
217 }
218
219 nsresult nsPrintProgress::ReleaseListeners()
220 {
221 m_listenerList.Clear();
222
223 return NS_OK;
224 }
225
226 NS_IMETHODIMP nsPrintProgress::ShowStatusString(const char16_t *status)
227 {
228 return OnStatusChange(nullptr, nullptr, NS_OK, status);
229 }
230
231 /* void startMeteors (); */
232 NS_IMETHODIMP nsPrintProgress::StartMeteors()
233 {
234 return NS_ERROR_NOT_IMPLEMENTED;
235 }
236
237 /* void stopMeteors (); */
238 NS_IMETHODIMP nsPrintProgress::StopMeteors()
239 {
240 return NS_ERROR_NOT_IMPLEMENTED;
241 }
242
243 /* void showProgress (in long percent); */
244 NS_IMETHODIMP nsPrintProgress::ShowProgress(int32_t percent)
245 {
246 return NS_ERROR_NOT_IMPLEMENTED;
247 }
248
249 /* [noscript] void setDocShell (in nsIDocShell shell, in nsIDOMWindow window); */
250 NS_IMETHODIMP nsPrintProgress::SetDocShell(nsIDocShell *shell, nsIDOMWindow *window)
251 {
252 return NS_ERROR_NOT_IMPLEMENTED;
253 }
254
255 /* void closeWindow (); */
256 NS_IMETHODIMP nsPrintProgress::CloseWindow()
257 {
258 return NS_ERROR_NOT_IMPLEMENTED;
259 }
260

mercurial