1 : /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 : /* ***** BEGIN LICENSE BLOCK *****
3 : * Version: MPL 1.1/GPL 2.0/LGPL 2.1
4 : *
5 : * The contents of this file are subject to the Mozilla Public License Version
6 : * 1.1 (the "License"); you may not use this file except in compliance with
7 : * the License. You may obtain a copy of the License at
8 : * http://www.mozilla.org/MPL/
9 : *
10 : * Software distributed under the License is distributed on an "AS IS" basis,
11 : * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
12 : * for the specific language governing rights and limitations under the
13 : * License.
14 : *
15 : * The Original Code is mozilla.org code.
16 : *
17 : * The Initial Developer of the Original Code is
18 : * Netscape Communications Corporation.
19 : * Portions created by the Initial Developer are Copyright (C) 1998
20 : * the Initial Developer. All Rights Reserved.
21 : *
22 : * Contributor(s):
23 : * Jean-Francois Ducarroz <ducarroz@netscape.com>
24 : * Rod Spears <rods@netscape.com>
25 : *
26 : * Alternatively, the contents of this file may be used under the terms of
27 : * either the GNU General Public License Version 2 or later (the "GPL"), or
28 : * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
29 : * in which case the provisions of the GPL or the LGPL are applicable instead
30 : * of those above. If you wish to allow use of your version of this file only
31 : * under the terms of either the GPL or the LGPL, and not to allow others to
32 : * use your version of this file under the terms of the MPL, indicate your
33 : * decision by deleting the provisions above and replace them with the notice
34 : * and other provisions required by the GPL or the LGPL. If you do not delete
35 : * the provisions above, a recipient may use your version of this file under
36 : * the terms of any one of the MPL, the GPL or the LGPL.
37 : *
38 : * ***** END LICENSE BLOCK ***** */
39 :
40 : #include "nsPrintProgress.h"
41 :
42 : #include "nsIBaseWindow.h"
43 : #include "nsISupportsArray.h"
44 : #include "nsXPCOM.h"
45 : #include "nsISupportsPrimitives.h"
46 : #include "nsIComponentManager.h"
47 :
48 0 : NS_IMPL_THREADSAFE_ADDREF(nsPrintProgress)
49 0 : NS_IMPL_THREADSAFE_RELEASE(nsPrintProgress)
50 :
51 0 : NS_INTERFACE_MAP_BEGIN(nsPrintProgress)
52 0 : NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIPrintStatusFeedback)
53 0 : NS_INTERFACE_MAP_ENTRY(nsIPrintProgress)
54 0 : NS_INTERFACE_MAP_ENTRY(nsIPrintStatusFeedback)
55 0 : NS_INTERFACE_MAP_ENTRY(nsIWebProgressListener)
56 0 : NS_INTERFACE_MAP_END_THREADSAFE
57 :
58 :
59 0 : nsPrintProgress::nsPrintProgress(nsIPrintSettings* aPrintSettings)
60 : {
61 0 : m_closeProgress = false;
62 0 : m_processCanceled = false;
63 0 : m_pendingStateFlags = -1;
64 0 : m_pendingStateValue = 0;
65 0 : m_PrintSetting = aPrintSettings;
66 0 : }
67 :
68 0 : nsPrintProgress::~nsPrintProgress()
69 : {
70 0 : (void)ReleaseListeners();
71 0 : }
72 :
73 : /* void openProgressDialog (in nsIDOMWindow parent, in string dialogURL, in nsISupports parameters); */
74 0 : NS_IMETHODIMP nsPrintProgress::OpenProgressDialog(nsIDOMWindow *parent,
75 : const char *dialogURL,
76 : nsISupports *parameters,
77 : nsIObserver *openDialogObserver,
78 : bool *notifyOnOpen)
79 : {
80 0 : *notifyOnOpen = true;
81 0 : m_observer = openDialogObserver;
82 0 : nsresult rv = NS_ERROR_FAILURE;
83 :
84 0 : if (m_dialog)
85 0 : return NS_ERROR_ALREADY_INITIALIZED;
86 :
87 0 : if (!dialogURL || !*dialogURL)
88 0 : return NS_ERROR_INVALID_ARG;
89 :
90 0 : if (parent)
91 : {
92 : // Set up window.arguments[0]...
93 0 : nsCOMPtr<nsISupportsArray> array;
94 0 : rv = NS_NewISupportsArray(getter_AddRefs(array));
95 0 : NS_ENSURE_SUCCESS(rv, rv);
96 :
97 : nsCOMPtr<nsISupportsInterfacePointer> ifptr =
98 0 : do_CreateInstance(NS_SUPPORTS_INTERFACE_POINTER_CONTRACTID, &rv);
99 0 : NS_ENSURE_SUCCESS(rv, rv);
100 :
101 0 : ifptr->SetData(static_cast<nsIPrintProgress*>(this));
102 0 : ifptr->SetDataIID(&NS_GET_IID(nsIPrintProgress));
103 :
104 0 : array->AppendElement(ifptr);
105 :
106 0 : array->AppendElement(parameters);
107 :
108 : // Open the dialog.
109 0 : nsCOMPtr<nsIDOMWindow> newWindow;
110 0 : rv = parent->OpenDialog(NS_ConvertASCIItoUTF16(dialogURL),
111 0 : NS_LITERAL_STRING("_blank"),
112 0 : NS_LITERAL_STRING("chrome,titlebar,dependent,centerscreen"),
113 0 : array, getter_AddRefs(newWindow));
114 : }
115 :
116 0 : return rv;
117 : }
118 :
119 : /* void closeProgressDialog (in boolean forceClose); */
120 0 : NS_IMETHODIMP nsPrintProgress::CloseProgressDialog(bool forceClose)
121 : {
122 0 : m_closeProgress = true;
123 0 : return OnStateChange(nsnull, nsnull, nsIWebProgressListener::STATE_STOP, forceClose);
124 : }
125 :
126 : /* nsIPrompt GetPrompter (); */
127 0 : NS_IMETHODIMP nsPrintProgress::GetPrompter(nsIPrompt **_retval)
128 : {
129 0 : NS_ENSURE_ARG_POINTER(_retval);
130 0 : *_retval = nsnull;
131 :
132 0 : if (! m_closeProgress && m_dialog)
133 0 : return m_dialog->GetPrompter(_retval);
134 :
135 0 : return NS_ERROR_FAILURE;
136 : }
137 :
138 : /* attribute boolean processCanceledByUser; */
139 0 : NS_IMETHODIMP nsPrintProgress::GetProcessCanceledByUser(bool *aProcessCanceledByUser)
140 : {
141 0 : NS_ENSURE_ARG_POINTER(aProcessCanceledByUser);
142 0 : *aProcessCanceledByUser = m_processCanceled;
143 0 : return NS_OK;
144 : }
145 0 : NS_IMETHODIMP nsPrintProgress::SetProcessCanceledByUser(bool aProcessCanceledByUser)
146 : {
147 0 : if(m_PrintSetting)
148 0 : m_PrintSetting->SetIsCancelled(true);
149 0 : m_processCanceled = aProcessCanceledByUser;
150 0 : OnStateChange(nsnull, nsnull, nsIWebProgressListener::STATE_STOP, false);
151 0 : return NS_OK;
152 : }
153 :
154 : /* void RegisterListener (in nsIWebProgressListener listener); */
155 0 : NS_IMETHODIMP nsPrintProgress::RegisterListener(nsIWebProgressListener * listener)
156 : {
157 0 : nsresult rv = NS_OK;
158 :
159 0 : if (!listener) //Nothing to do with a null listener!
160 0 : return NS_OK;
161 :
162 0 : if (!m_listenerList)
163 0 : rv = NS_NewISupportsArray(getter_AddRefs(m_listenerList));
164 :
165 0 : if (NS_SUCCEEDED(rv) && m_listenerList)
166 : {
167 0 : m_listenerList->AppendElement(listener);
168 0 : if (m_closeProgress || m_processCanceled)
169 0 : listener->OnStateChange(nsnull, nsnull, nsIWebProgressListener::STATE_STOP, 0);
170 : else
171 : {
172 0 : listener->OnStatusChange(nsnull, nsnull, 0, m_pendingStatus.get());
173 0 : if (m_pendingStateFlags != -1)
174 0 : listener->OnStateChange(nsnull, nsnull, m_pendingStateFlags, m_pendingStateValue);
175 : }
176 : }
177 :
178 0 : return NS_OK;
179 : }
180 :
181 : /* void UnregisterListener (in nsIWebProgressListener listener); */
182 0 : NS_IMETHODIMP nsPrintProgress::UnregisterListener(nsIWebProgressListener *listener)
183 : {
184 0 : if (m_listenerList && listener)
185 0 : m_listenerList->RemoveElement(listener);
186 :
187 0 : return NS_OK;
188 : }
189 :
190 : /* void doneIniting (); */
191 0 : NS_IMETHODIMP nsPrintProgress::DoneIniting()
192 : {
193 0 : if (m_observer) {
194 0 : m_observer->Observe(nsnull, nsnull, nsnull);
195 : }
196 0 : return NS_OK;
197 : }
198 :
199 : /* void onStateChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in unsigned long aStateFlags, in nsresult aStatus); */
200 0 : NS_IMETHODIMP nsPrintProgress::OnStateChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, PRUint32 aStateFlags, nsresult aStatus)
201 : {
202 0 : nsresult rv = NS_OK;
203 :
204 0 : m_pendingStateFlags = aStateFlags;
205 0 : m_pendingStateValue = aStatus;
206 :
207 0 : if (m_listenerList)
208 : {
209 : PRUint32 count;
210 : PRInt32 i;
211 :
212 0 : rv = m_listenerList->Count(&count);
213 0 : NS_ASSERTION(NS_SUCCEEDED(rv), "m_listenerList->Count() failed");
214 0 : if (NS_FAILED(rv))
215 0 : return rv;
216 :
217 0 : nsCOMPtr<nsISupports> aSupports;
218 0 : nsCOMPtr<nsIWebProgressListener> aProgressListener;
219 0 : for (i = count - 1; i >= 0; i --)
220 : {
221 0 : m_listenerList->GetElementAt(i, getter_AddRefs(aSupports));
222 0 : aProgressListener = do_QueryInterface(aSupports);
223 0 : if (aProgressListener)
224 0 : aProgressListener->OnStateChange(aWebProgress, aRequest, aStateFlags, aStatus);
225 : }
226 : }
227 :
228 0 : return rv;
229 : }
230 :
231 : /* void onProgressChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in long aCurSelfProgress, in long aMaxSelfProgress, in long aCurTotalProgress, in long aMaxTotalProgress); */
232 0 : NS_IMETHODIMP nsPrintProgress::OnProgressChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, PRInt32 aCurSelfProgress, PRInt32 aMaxSelfProgress, PRInt32 aCurTotalProgress, PRInt32 aMaxTotalProgress)
233 : {
234 0 : nsresult rv = NS_OK;
235 :
236 0 : if (m_listenerList)
237 : {
238 : PRUint32 count;
239 : PRInt32 i;
240 :
241 0 : rv = m_listenerList->Count(&count);
242 0 : NS_ASSERTION(NS_SUCCEEDED(rv), "m_listenerList->Count() failed");
243 0 : if (NS_FAILED(rv))
244 0 : return rv;
245 :
246 0 : nsCOMPtr<nsISupports> aSupports;
247 0 : nsCOMPtr<nsIWebProgressListener> aProgressListener;
248 0 : for (i = count - 1; i >= 0; i --)
249 : {
250 0 : m_listenerList->GetElementAt(i, getter_AddRefs(aSupports));
251 0 : aProgressListener = do_QueryInterface(aSupports);
252 0 : if (aProgressListener)
253 0 : aProgressListener->OnProgressChange(aWebProgress, aRequest, aCurSelfProgress, aMaxSelfProgress, aCurTotalProgress, aMaxTotalProgress);
254 : }
255 : }
256 :
257 0 : return rv;
258 : }
259 :
260 : /* void onLocationChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in nsIURI location, in unsigned long aFlags); */
261 0 : NS_IMETHODIMP nsPrintProgress::OnLocationChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, nsIURI *location, PRUint32 aFlags)
262 : {
263 0 : return NS_ERROR_NOT_IMPLEMENTED;
264 : }
265 :
266 : /* void onStatusChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in nsresult aStatus, in wstring aMessage); */
267 0 : NS_IMETHODIMP nsPrintProgress::OnStatusChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, nsresult aStatus, const PRUnichar *aMessage)
268 : {
269 0 : nsresult rv = NS_OK;
270 :
271 0 : if (aMessage && *aMessage)
272 0 : m_pendingStatus = aMessage;
273 0 : if (m_listenerList)
274 : {
275 : PRUint32 count;
276 : PRInt32 i;
277 :
278 0 : rv = m_listenerList->Count(&count);
279 0 : NS_ASSERTION(NS_SUCCEEDED(rv), "m_listenerList->Count() failed");
280 0 : if (NS_FAILED(rv))
281 0 : return rv;
282 :
283 0 : nsCOMPtr<nsISupports> aSupports;
284 0 : nsCOMPtr<nsIWebProgressListener> aProgressListener;
285 0 : for (i = count - 1; i >= 0; i --)
286 : {
287 0 : m_listenerList->GetElementAt(i, getter_AddRefs(aSupports));
288 0 : aProgressListener = do_QueryInterface(aSupports);
289 0 : if (aProgressListener)
290 0 : aProgressListener->OnStatusChange(aWebProgress, aRequest, aStatus, aMessage);
291 : }
292 : }
293 :
294 0 : return rv;
295 : }
296 :
297 : /* void onSecurityChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in unsigned long state); */
298 0 : NS_IMETHODIMP nsPrintProgress::OnSecurityChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, PRUint32 state)
299 : {
300 0 : return NS_OK;
301 : }
302 :
303 0 : nsresult nsPrintProgress::ReleaseListeners()
304 : {
305 0 : nsresult rv = NS_OK;
306 :
307 0 : if (m_listenerList)
308 : {
309 : PRUint32 count;
310 : PRInt32 i;
311 :
312 0 : rv = m_listenerList->Count(&count);
313 0 : NS_ASSERTION(NS_SUCCEEDED(rv), "m_listenerList->Count() failed");
314 0 : if (NS_SUCCEEDED(rv))
315 0 : for (i = count - 1; i >= 0; i --)
316 0 : m_listenerList->RemoveElementAt(i);
317 : }
318 :
319 0 : return rv;
320 : }
321 :
322 0 : NS_IMETHODIMP nsPrintProgress::ShowStatusString(const PRUnichar *status)
323 : {
324 0 : return OnStatusChange(nsnull, nsnull, NS_OK, status);
325 : }
326 :
327 : /* void startMeteors (); */
328 0 : NS_IMETHODIMP nsPrintProgress::StartMeteors()
329 : {
330 0 : return NS_ERROR_NOT_IMPLEMENTED;
331 : }
332 :
333 : /* void stopMeteors (); */
334 0 : NS_IMETHODIMP nsPrintProgress::StopMeteors()
335 : {
336 0 : return NS_ERROR_NOT_IMPLEMENTED;
337 : }
338 :
339 : /* void showProgress (in long percent); */
340 0 : NS_IMETHODIMP nsPrintProgress::ShowProgress(PRInt32 percent)
341 : {
342 0 : return NS_ERROR_NOT_IMPLEMENTED;
343 : }
344 :
345 : /* [noscript] void setDocShell (in nsIDocShell shell, in nsIDOMWindow window); */
346 0 : NS_IMETHODIMP nsPrintProgress::SetDocShell(nsIDocShell *shell, nsIDOMWindow *window)
347 : {
348 0 : return NS_ERROR_NOT_IMPLEMENTED;
349 : }
350 :
351 : /* void closeWindow (); */
352 0 : NS_IMETHODIMP nsPrintProgress::CloseWindow()
353 : {
354 0 : return NS_ERROR_NOT_IMPLEMENTED;
355 : }
356 :
|