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

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

     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/. */
     6 #include "nsPrintProgress.h"
     8 #include "nsIBaseWindow.h"
     9 #include "nsISupportsArray.h"
    10 #include "nsXPCOM.h"
    11 #include "nsISupportsPrimitives.h"
    12 #include "nsIComponentManager.h"
    14 NS_IMPL_ADDREF(nsPrintProgress)
    15 NS_IMPL_RELEASE(nsPrintProgress)
    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
    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 }
    34 nsPrintProgress::~nsPrintProgress()
    35 {
    36   (void)ReleaseListeners();
    37 }
    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;
    50   if (m_dialog)
    51     return NS_ERROR_ALREADY_INITIALIZED;
    53   if (!dialogURL || !*dialogURL)
    54     return NS_ERROR_INVALID_ARG;
    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);
    63     nsCOMPtr<nsISupportsInterfacePointer> ifptr =
    64       do_CreateInstance(NS_SUPPORTS_INTERFACE_POINTER_CONTRACTID, &rv);
    65     NS_ENSURE_SUCCESS(rv, rv);
    67     ifptr->SetData(static_cast<nsIPrintProgress*>(this));
    68     ifptr->SetDataIID(&NS_GET_IID(nsIPrintProgress));
    70     array->AppendElement(ifptr);
    72     array->AppendElement(parameters);
    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   }
    82   return rv;
    83 }
    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 }
    94 /* nsIPrompt GetPrompter (); */
    95 NS_IMETHODIMP nsPrintProgress::GetPrompter(nsIPrompt **_retval)
    96 {
    97   NS_ENSURE_ARG_POINTER(_retval);
    98   *_retval = nullptr;
   100   if (! m_closeProgress && m_dialog)
   101     return m_dialog->GetPrompter(_retval);
   103   return NS_ERROR_FAILURE;
   104 }
   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 }
   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;
   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   }
   138   return NS_OK;
   139 }
   141 /* void UnregisterListener (in nsIWebProgressListener listener); */
   142 NS_IMETHODIMP nsPrintProgress::UnregisterListener(nsIWebProgressListener *listener)
   143 {
   144   if (listener)
   145     m_listenerList.RemoveObject(listener);
   147   return NS_OK;
   148 }
   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 }
   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;
   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   }
   173   return NS_OK;
   174 }
   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   }
   187   return NS_OK;
   188 }
   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 }
   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;
   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   }
   210   return NS_OK;
   211 }
   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 }
   219 nsresult nsPrintProgress::ReleaseListeners()
   220 {
   221   m_listenerList.Clear();
   223   return NS_OK;
   224 }
   226 NS_IMETHODIMP nsPrintProgress::ShowStatusString(const char16_t *status)
   227 {
   228   return OnStatusChange(nullptr, nullptr, NS_OK, status);
   229 }
   231 /* void startMeteors (); */
   232 NS_IMETHODIMP nsPrintProgress::StartMeteors()
   233 {
   234   return NS_ERROR_NOT_IMPLEMENTED;
   235 }
   237 /* void stopMeteors (); */
   238 NS_IMETHODIMP nsPrintProgress::StopMeteors()
   239 {
   240   return NS_ERROR_NOT_IMPLEMENTED;
   241 }
   243 /* void showProgress (in long percent); */
   244 NS_IMETHODIMP nsPrintProgress::ShowProgress(int32_t percent)
   245 {
   246   return NS_ERROR_NOT_IMPLEMENTED;
   247 }
   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 }
   255 /* void closeWindow (); */
   256 NS_IMETHODIMP nsPrintProgress::CloseWindow()
   257 {
   258   return NS_ERROR_NOT_IMPLEMENTED;
   259 }

mercurial