michael@0: /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #include "nsPrintProgress.h" michael@0: michael@0: #include "nsIBaseWindow.h" michael@0: #include "nsISupportsArray.h" michael@0: #include "nsXPCOM.h" michael@0: #include "nsISupportsPrimitives.h" michael@0: #include "nsIComponentManager.h" michael@0: michael@0: NS_IMPL_ADDREF(nsPrintProgress) michael@0: NS_IMPL_RELEASE(nsPrintProgress) michael@0: michael@0: NS_INTERFACE_MAP_BEGIN(nsPrintProgress) michael@0: NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIPrintStatusFeedback) michael@0: NS_INTERFACE_MAP_ENTRY(nsIPrintProgress) michael@0: NS_INTERFACE_MAP_ENTRY(nsIPrintStatusFeedback) michael@0: NS_INTERFACE_MAP_ENTRY(nsIWebProgressListener) michael@0: NS_INTERFACE_MAP_END_THREADSAFE michael@0: michael@0: michael@0: nsPrintProgress::nsPrintProgress() michael@0: { michael@0: m_closeProgress = false; michael@0: m_processCanceled = false; michael@0: m_pendingStateFlags = -1; michael@0: m_pendingStateValue = NS_OK; michael@0: } michael@0: michael@0: nsPrintProgress::~nsPrintProgress() michael@0: { michael@0: (void)ReleaseListeners(); michael@0: } michael@0: michael@0: /* void openProgressDialog (in nsIDOMWindow parent, in string dialogURL, in nsISupports parameters); */ michael@0: NS_IMETHODIMP nsPrintProgress::OpenProgressDialog(nsIDOMWindow *parent, michael@0: const char *dialogURL, michael@0: nsISupports *parameters, michael@0: nsIObserver *openDialogObserver, michael@0: bool *notifyOnOpen) michael@0: { michael@0: m_observer = openDialogObserver; michael@0: michael@0: nsresult rv = NS_ERROR_FAILURE; michael@0: michael@0: if (m_dialog) michael@0: return NS_ERROR_ALREADY_INITIALIZED; michael@0: michael@0: if (!dialogURL || !*dialogURL) michael@0: return NS_ERROR_INVALID_ARG; michael@0: michael@0: if (parent) michael@0: { michael@0: // Set up window.arguments[0]... michael@0: nsCOMPtr array; michael@0: rv = NS_NewISupportsArray(getter_AddRefs(array)); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: nsCOMPtr ifptr = michael@0: do_CreateInstance(NS_SUPPORTS_INTERFACE_POINTER_CONTRACTID, &rv); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: ifptr->SetData(static_cast(this)); michael@0: ifptr->SetDataIID(&NS_GET_IID(nsIPrintProgress)); michael@0: michael@0: array->AppendElement(ifptr); michael@0: michael@0: array->AppendElement(parameters); michael@0: michael@0: // Open the dialog. michael@0: nsCOMPtr newWindow; michael@0: rv = parent->OpenDialog(NS_ConvertASCIItoUTF16(dialogURL), michael@0: NS_LITERAL_STRING("_blank"), michael@0: NS_LITERAL_STRING("chrome,titlebar,dependent,centerscreen"), michael@0: array, getter_AddRefs(newWindow)); michael@0: if (NS_SUCCEEDED(rv)) { michael@0: *notifyOnOpen = true; michael@0: } michael@0: } michael@0: michael@0: return rv; michael@0: } michael@0: michael@0: /* void closeProgressDialog (in boolean forceClose); */ michael@0: NS_IMETHODIMP nsPrintProgress::CloseProgressDialog(bool forceClose) michael@0: { michael@0: m_closeProgress = true; michael@0: // XXX Casting bool to nsresult michael@0: return OnStateChange(nullptr, nullptr, nsIWebProgressListener::STATE_STOP, michael@0: static_cast(forceClose)); michael@0: } michael@0: michael@0: /* nsIPrompt GetPrompter (); */ michael@0: NS_IMETHODIMP nsPrintProgress::GetPrompter(nsIPrompt **_retval) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(_retval); michael@0: *_retval = nullptr; michael@0: michael@0: if (! m_closeProgress && m_dialog) michael@0: return m_dialog->GetPrompter(_retval); michael@0: michael@0: return NS_ERROR_FAILURE; michael@0: } michael@0: michael@0: /* attribute boolean processCanceledByUser; */ michael@0: NS_IMETHODIMP nsPrintProgress::GetProcessCanceledByUser(bool *aProcessCanceledByUser) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aProcessCanceledByUser); michael@0: *aProcessCanceledByUser = m_processCanceled; michael@0: return NS_OK; michael@0: } michael@0: NS_IMETHODIMP nsPrintProgress::SetProcessCanceledByUser(bool aProcessCanceledByUser) michael@0: { michael@0: m_processCanceled = aProcessCanceledByUser; michael@0: OnStateChange(nullptr, nullptr, nsIWebProgressListener::STATE_STOP, NS_OK); michael@0: return NS_OK; michael@0: } michael@0: michael@0: /* void RegisterListener (in nsIWebProgressListener listener); */ michael@0: NS_IMETHODIMP nsPrintProgress::RegisterListener(nsIWebProgressListener * listener) michael@0: { michael@0: if (!listener) //Nothing to do with a null listener! michael@0: return NS_OK; michael@0: michael@0: m_listenerList.AppendObject(listener); michael@0: if (m_closeProgress || m_processCanceled) michael@0: listener->OnStateChange(nullptr, nullptr, michael@0: nsIWebProgressListener::STATE_STOP, NS_OK); michael@0: else michael@0: { michael@0: listener->OnStatusChange(nullptr, nullptr, NS_OK, m_pendingStatus.get()); michael@0: if (m_pendingStateFlags != -1) michael@0: listener->OnStateChange(nullptr, nullptr, m_pendingStateFlags, m_pendingStateValue); michael@0: } michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: /* void UnregisterListener (in nsIWebProgressListener listener); */ michael@0: NS_IMETHODIMP nsPrintProgress::UnregisterListener(nsIWebProgressListener *listener) michael@0: { michael@0: if (listener) michael@0: m_listenerList.RemoveObject(listener); michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: /* void doneIniting (); */ michael@0: NS_IMETHODIMP nsPrintProgress::DoneIniting() michael@0: { michael@0: if (m_observer) { michael@0: m_observer->Observe(nullptr, nullptr, nullptr); michael@0: } michael@0: return NS_OK; michael@0: } michael@0: michael@0: /* void onStateChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in unsigned long aStateFlags, in nsresult aStatus); */ michael@0: NS_IMETHODIMP nsPrintProgress::OnStateChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, uint32_t aStateFlags, nsresult aStatus) michael@0: { michael@0: m_pendingStateFlags = aStateFlags; michael@0: m_pendingStateValue = aStatus; michael@0: michael@0: uint32_t count = m_listenerList.Count(); michael@0: for (uint32_t i = count - 1; i < count; i --) michael@0: { michael@0: nsCOMPtr progressListener = m_listenerList.SafeObjectAt(i); michael@0: if (progressListener) michael@0: progressListener->OnStateChange(aWebProgress, aRequest, aStateFlags, aStatus); michael@0: } michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: /* void onProgressChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in long aCurSelfProgress, in long aMaxSelfProgress, in long aCurTotalProgress, in long aMaxTotalProgress); */ michael@0: NS_IMETHODIMP nsPrintProgress::OnProgressChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, int32_t aCurSelfProgress, int32_t aMaxSelfProgress, int32_t aCurTotalProgress, int32_t aMaxTotalProgress) michael@0: { michael@0: uint32_t count = m_listenerList.Count(); michael@0: for (uint32_t i = count - 1; i < count; i --) michael@0: { michael@0: nsCOMPtr progressListener = m_listenerList.SafeObjectAt(i); michael@0: if (progressListener) michael@0: progressListener->OnProgressChange(aWebProgress, aRequest, aCurSelfProgress, aMaxSelfProgress, aCurTotalProgress, aMaxTotalProgress); michael@0: } michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: /* void onLocationChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in nsIURI location, in unsigned long aFlags); */ michael@0: NS_IMETHODIMP nsPrintProgress::OnLocationChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, nsIURI *location, uint32_t aFlags) michael@0: { michael@0: return NS_OK; michael@0: } michael@0: michael@0: /* void onStatusChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in nsresult aStatus, in wstring aMessage); */ michael@0: NS_IMETHODIMP nsPrintProgress::OnStatusChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, nsresult aStatus, const char16_t *aMessage) michael@0: { michael@0: if (aMessage && *aMessage) michael@0: m_pendingStatus = aMessage; michael@0: michael@0: uint32_t count = m_listenerList.Count(); michael@0: for (uint32_t i = count - 1; i < count; i --) michael@0: { michael@0: nsCOMPtr progressListener = m_listenerList.SafeObjectAt(i); michael@0: if (progressListener) michael@0: progressListener->OnStatusChange(aWebProgress, aRequest, aStatus, aMessage); michael@0: } michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: /* void onSecurityChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in unsigned long state); */ michael@0: NS_IMETHODIMP nsPrintProgress::OnSecurityChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, uint32_t state) michael@0: { michael@0: return NS_OK; michael@0: } michael@0: michael@0: nsresult nsPrintProgress::ReleaseListeners() michael@0: { michael@0: m_listenerList.Clear(); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsPrintProgress::ShowStatusString(const char16_t *status) michael@0: { michael@0: return OnStatusChange(nullptr, nullptr, NS_OK, status); michael@0: } michael@0: michael@0: /* void startMeteors (); */ michael@0: NS_IMETHODIMP nsPrintProgress::StartMeteors() michael@0: { michael@0: return NS_ERROR_NOT_IMPLEMENTED; michael@0: } michael@0: michael@0: /* void stopMeteors (); */ michael@0: NS_IMETHODIMP nsPrintProgress::StopMeteors() michael@0: { michael@0: return NS_ERROR_NOT_IMPLEMENTED; michael@0: } michael@0: michael@0: /* void showProgress (in long percent); */ michael@0: NS_IMETHODIMP nsPrintProgress::ShowProgress(int32_t percent) michael@0: { michael@0: return NS_ERROR_NOT_IMPLEMENTED; michael@0: } michael@0: michael@0: /* [noscript] void setDocShell (in nsIDocShell shell, in nsIDOMWindow window); */ michael@0: NS_IMETHODIMP nsPrintProgress::SetDocShell(nsIDocShell *shell, nsIDOMWindow *window) michael@0: { michael@0: return NS_ERROR_NOT_IMPLEMENTED; michael@0: } michael@0: michael@0: /* void closeWindow (); */ michael@0: NS_IMETHODIMP nsPrintProgress::CloseWindow() michael@0: { michael@0: return NS_ERROR_NOT_IMPLEMENTED; michael@0: } michael@0: