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

http://github.com/zpao/v8monkey · C++ · 356 lines · 240 code · 59 blank · 57 comment · 35 complexity · b983469c7a4476dd76528127c6a7f1e3 MD5 · raw file

  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. #include "nsPrintProgress.h"
  40. #include "nsIBaseWindow.h"
  41. #include "nsISupportsArray.h"
  42. #include "nsXPCOM.h"
  43. #include "nsISupportsPrimitives.h"
  44. #include "nsIComponentManager.h"
  45. NS_IMPL_THREADSAFE_ADDREF(nsPrintProgress)
  46. NS_IMPL_THREADSAFE_RELEASE(nsPrintProgress)
  47. NS_INTERFACE_MAP_BEGIN(nsPrintProgress)
  48. NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIPrintStatusFeedback)
  49. NS_INTERFACE_MAP_ENTRY(nsIPrintProgress)
  50. NS_INTERFACE_MAP_ENTRY(nsIPrintStatusFeedback)
  51. NS_INTERFACE_MAP_ENTRY(nsIWebProgressListener)
  52. NS_INTERFACE_MAP_END_THREADSAFE
  53. nsPrintProgress::nsPrintProgress(nsIPrintSettings* aPrintSettings)
  54. {
  55. m_closeProgress = false;
  56. m_processCanceled = false;
  57. m_pendingStateFlags = -1;
  58. m_pendingStateValue = 0;
  59. m_PrintSetting = aPrintSettings;
  60. }
  61. nsPrintProgress::~nsPrintProgress()
  62. {
  63. (void)ReleaseListeners();
  64. }
  65. /* void openProgressDialog (in nsIDOMWindow parent, in string dialogURL, in nsISupports parameters); */
  66. NS_IMETHODIMP nsPrintProgress::OpenProgressDialog(nsIDOMWindow *parent,
  67. const char *dialogURL,
  68. nsISupports *parameters,
  69. nsIObserver *openDialogObserver,
  70. bool *notifyOnOpen)
  71. {
  72. *notifyOnOpen = true;
  73. m_observer = openDialogObserver;
  74. nsresult rv = NS_ERROR_FAILURE;
  75. if (m_dialog)
  76. return NS_ERROR_ALREADY_INITIALIZED;
  77. if (!dialogURL || !*dialogURL)
  78. return NS_ERROR_INVALID_ARG;
  79. if (parent)
  80. {
  81. // Set up window.arguments[0]...
  82. nsCOMPtr<nsISupportsArray> array;
  83. rv = NS_NewISupportsArray(getter_AddRefs(array));
  84. NS_ENSURE_SUCCESS(rv, rv);
  85. nsCOMPtr<nsISupportsInterfacePointer> ifptr =
  86. do_CreateInstance(NS_SUPPORTS_INTERFACE_POINTER_CONTRACTID, &rv);
  87. NS_ENSURE_SUCCESS(rv, rv);
  88. ifptr->SetData(static_cast<nsIPrintProgress*>(this));
  89. ifptr->SetDataIID(&NS_GET_IID(nsIPrintProgress));
  90. array->AppendElement(ifptr);
  91. array->AppendElement(parameters);
  92. // Open the dialog.
  93. nsCOMPtr<nsIDOMWindow> newWindow;
  94. rv = parent->OpenDialog(NS_ConvertASCIItoUTF16(dialogURL),
  95. NS_LITERAL_STRING("_blank"),
  96. NS_LITERAL_STRING("chrome,titlebar,dependent,centerscreen"),
  97. array, getter_AddRefs(newWindow));
  98. }
  99. return rv;
  100. }
  101. /* void closeProgressDialog (in boolean forceClose); */
  102. NS_IMETHODIMP nsPrintProgress::CloseProgressDialog(bool forceClose)
  103. {
  104. m_closeProgress = true;
  105. return OnStateChange(nsnull, nsnull, nsIWebProgressListener::STATE_STOP, forceClose);
  106. }
  107. /* nsIPrompt GetPrompter (); */
  108. NS_IMETHODIMP nsPrintProgress::GetPrompter(nsIPrompt **_retval)
  109. {
  110. NS_ENSURE_ARG_POINTER(_retval);
  111. *_retval = nsnull;
  112. if (! m_closeProgress && m_dialog)
  113. return m_dialog->GetPrompter(_retval);
  114. return NS_ERROR_FAILURE;
  115. }
  116. /* attribute boolean processCanceledByUser; */
  117. NS_IMETHODIMP nsPrintProgress::GetProcessCanceledByUser(bool *aProcessCanceledByUser)
  118. {
  119. NS_ENSURE_ARG_POINTER(aProcessCanceledByUser);
  120. *aProcessCanceledByUser = m_processCanceled;
  121. return NS_OK;
  122. }
  123. NS_IMETHODIMP nsPrintProgress::SetProcessCanceledByUser(bool aProcessCanceledByUser)
  124. {
  125. if(m_PrintSetting)
  126. m_PrintSetting->SetIsCancelled(true);
  127. m_processCanceled = aProcessCanceledByUser;
  128. OnStateChange(nsnull, nsnull, nsIWebProgressListener::STATE_STOP, false);
  129. return NS_OK;
  130. }
  131. /* void RegisterListener (in nsIWebProgressListener listener); */
  132. NS_IMETHODIMP nsPrintProgress::RegisterListener(nsIWebProgressListener * listener)
  133. {
  134. nsresult rv = NS_OK;
  135. if (!listener) //Nothing to do with a null listener!
  136. return NS_OK;
  137. if (!m_listenerList)
  138. rv = NS_NewISupportsArray(getter_AddRefs(m_listenerList));
  139. if (NS_SUCCEEDED(rv) && m_listenerList)
  140. {
  141. m_listenerList->AppendElement(listener);
  142. if (m_closeProgress || m_processCanceled)
  143. listener->OnStateChange(nsnull, nsnull, nsIWebProgressListener::STATE_STOP, 0);
  144. else
  145. {
  146. listener->OnStatusChange(nsnull, nsnull, 0, m_pendingStatus.get());
  147. if (m_pendingStateFlags != -1)
  148. listener->OnStateChange(nsnull, nsnull, m_pendingStateFlags, m_pendingStateValue);
  149. }
  150. }
  151. return NS_OK;
  152. }
  153. /* void UnregisterListener (in nsIWebProgressListener listener); */
  154. NS_IMETHODIMP nsPrintProgress::UnregisterListener(nsIWebProgressListener *listener)
  155. {
  156. if (m_listenerList && listener)
  157. m_listenerList->RemoveElement(listener);
  158. return NS_OK;
  159. }
  160. /* void doneIniting (); */
  161. NS_IMETHODIMP nsPrintProgress::DoneIniting()
  162. {
  163. if (m_observer) {
  164. m_observer->Observe(nsnull, nsnull, nsnull);
  165. }
  166. return NS_OK;
  167. }
  168. /* void onStateChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in unsigned long aStateFlags, in nsresult aStatus); */
  169. NS_IMETHODIMP nsPrintProgress::OnStateChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, PRUint32 aStateFlags, nsresult aStatus)
  170. {
  171. nsresult rv = NS_OK;
  172. m_pendingStateFlags = aStateFlags;
  173. m_pendingStateValue = aStatus;
  174. if (m_listenerList)
  175. {
  176. PRUint32 count;
  177. PRInt32 i;
  178. rv = m_listenerList->Count(&count);
  179. NS_ASSERTION(NS_SUCCEEDED(rv), "m_listenerList->Count() failed");
  180. if (NS_FAILED(rv))
  181. return rv;
  182. nsCOMPtr<nsISupports> aSupports;
  183. nsCOMPtr<nsIWebProgressListener> aProgressListener;
  184. for (i = count - 1; i >= 0; i --)
  185. {
  186. m_listenerList->GetElementAt(i, getter_AddRefs(aSupports));
  187. aProgressListener = do_QueryInterface(aSupports);
  188. if (aProgressListener)
  189. aProgressListener->OnStateChange(aWebProgress, aRequest, aStateFlags, aStatus);
  190. }
  191. }
  192. return rv;
  193. }
  194. /* void onProgressChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in long aCurSelfProgress, in long aMaxSelfProgress, in long aCurTotalProgress, in long aMaxTotalProgress); */
  195. NS_IMETHODIMP nsPrintProgress::OnProgressChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, PRInt32 aCurSelfProgress, PRInt32 aMaxSelfProgress, PRInt32 aCurTotalProgress, PRInt32 aMaxTotalProgress)
  196. {
  197. nsresult rv = NS_OK;
  198. if (m_listenerList)
  199. {
  200. PRUint32 count;
  201. PRInt32 i;
  202. rv = m_listenerList->Count(&count);
  203. NS_ASSERTION(NS_SUCCEEDED(rv), "m_listenerList->Count() failed");
  204. if (NS_FAILED(rv))
  205. return rv;
  206. nsCOMPtr<nsISupports> aSupports;
  207. nsCOMPtr<nsIWebProgressListener> aProgressListener;
  208. for (i = count - 1; i >= 0; i --)
  209. {
  210. m_listenerList->GetElementAt(i, getter_AddRefs(aSupports));
  211. aProgressListener = do_QueryInterface(aSupports);
  212. if (aProgressListener)
  213. aProgressListener->OnProgressChange(aWebProgress, aRequest, aCurSelfProgress, aMaxSelfProgress, aCurTotalProgress, aMaxTotalProgress);
  214. }
  215. }
  216. return rv;
  217. }
  218. /* void onLocationChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in nsIURI location, in unsigned long aFlags); */
  219. NS_IMETHODIMP nsPrintProgress::OnLocationChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, nsIURI *location, PRUint32 aFlags)
  220. {
  221. return NS_ERROR_NOT_IMPLEMENTED;
  222. }
  223. /* void onStatusChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in nsresult aStatus, in wstring aMessage); */
  224. NS_IMETHODIMP nsPrintProgress::OnStatusChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, nsresult aStatus, const PRUnichar *aMessage)
  225. {
  226. nsresult rv = NS_OK;
  227. if (aMessage && *aMessage)
  228. m_pendingStatus = aMessage;
  229. if (m_listenerList)
  230. {
  231. PRUint32 count;
  232. PRInt32 i;
  233. rv = m_listenerList->Count(&count);
  234. NS_ASSERTION(NS_SUCCEEDED(rv), "m_listenerList->Count() failed");
  235. if (NS_FAILED(rv))
  236. return rv;
  237. nsCOMPtr<nsISupports> aSupports;
  238. nsCOMPtr<nsIWebProgressListener> aProgressListener;
  239. for (i = count - 1; i >= 0; i --)
  240. {
  241. m_listenerList->GetElementAt(i, getter_AddRefs(aSupports));
  242. aProgressListener = do_QueryInterface(aSupports);
  243. if (aProgressListener)
  244. aProgressListener->OnStatusChange(aWebProgress, aRequest, aStatus, aMessage);
  245. }
  246. }
  247. return rv;
  248. }
  249. /* void onSecurityChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in unsigned long state); */
  250. NS_IMETHODIMP nsPrintProgress::OnSecurityChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, PRUint32 state)
  251. {
  252. return NS_OK;
  253. }
  254. nsresult nsPrintProgress::ReleaseListeners()
  255. {
  256. nsresult rv = NS_OK;
  257. if (m_listenerList)
  258. {
  259. PRUint32 count;
  260. PRInt32 i;
  261. rv = m_listenerList->Count(&count);
  262. NS_ASSERTION(NS_SUCCEEDED(rv), "m_listenerList->Count() failed");
  263. if (NS_SUCCEEDED(rv))
  264. for (i = count - 1; i >= 0; i --)
  265. m_listenerList->RemoveElementAt(i);
  266. }
  267. return rv;
  268. }
  269. NS_IMETHODIMP nsPrintProgress::ShowStatusString(const PRUnichar *status)
  270. {
  271. return OnStatusChange(nsnull, nsnull, NS_OK, status);
  272. }
  273. /* void startMeteors (); */
  274. NS_IMETHODIMP nsPrintProgress::StartMeteors()
  275. {
  276. return NS_ERROR_NOT_IMPLEMENTED;
  277. }
  278. /* void stopMeteors (); */
  279. NS_IMETHODIMP nsPrintProgress::StopMeteors()
  280. {
  281. return NS_ERROR_NOT_IMPLEMENTED;
  282. }
  283. /* void showProgress (in long percent); */
  284. NS_IMETHODIMP nsPrintProgress::ShowProgress(PRInt32 percent)
  285. {
  286. return NS_ERROR_NOT_IMPLEMENTED;
  287. }
  288. /* [noscript] void setDocShell (in nsIDocShell shell, in nsIDOMWindow window); */
  289. NS_IMETHODIMP nsPrintProgress::SetDocShell(nsIDocShell *shell, nsIDOMWindow *window)
  290. {
  291. return NS_ERROR_NOT_IMPLEMENTED;
  292. }
  293. /* void closeWindow (); */
  294. NS_IMETHODIMP nsPrintProgress::CloseWindow()
  295. {
  296. return NS_ERROR_NOT_IMPLEMENTED;
  297. }