New files for fix for bug 52329 and bug 28348. NOT PART OF THE BUILD YET. R=varada, SR=sspitzer

This commit is contained in:
ducarroz%netscape.com 2001-04-12 23:33:30 +00:00
Родитель d2c8917d51
Коммит fa81082d75
7 изменённых файлов: 834 добавлений и 0 удалений

Просмотреть файл

@ -0,0 +1,54 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
*/
#include "nsISupports.idl"
#include "domstubs.idl"
#include "nsIPrompt.idl"
#include "nsIWebProgressListener.idl"
interface nsIDOMWindowInternal;
[scriptable, uuid(2080d500-149e-11d5-9daa-e276a42bc27c)]
interface nsIMsgComposeProgress: nsIWebProgressListener {
/* Open the progress widget, usually it's a dialog
you can specify the subject of the message,
and specify if it a save or send operation
*/
void openProgress(in nsIDOMWindowInternal parent, in wstring subject, in boolean itsASaveOperation);
/* Close the progress widget, usually it's a dialog */
void closeProgress(in boolean forceClose);
/* Register a Web Progress Listener */
void registerListener(in nsIWebProgressListener listener);
/* Unregister a Web Progress Listener */
void unregisterListener(in nsIWebProgressListener listener);
/* Retrive the prompter, needed to display modal dialog on top of progress dialog */
nsIPrompt getPrompter();
/* Indicated if the user asked to cancel the current process */
attribute boolean processCanceledByUser;
};

Просмотреть файл

@ -0,0 +1,54 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Netscape Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
*/
#include "nsISupports.idl"
#include "nsIURI.idl"
%{ C++
#include "nsFileStream.h"
//
// Callback declarations for URL completion
//
// For completion of send/message creation operations...
typedef nsresult (*nsAttachSaveCompletionCallback) (nsresult aStatus,
const char *aContentType,
const char *aCharset,
PRInt32 totalSize, const PRUnichar* aMsg,
void *tagData);
%}
[ptr] native nsOutputFileStream(nsOutputFileStream);
native nsAttachSaveCompletionCallback(nsAttachSaveCompletionCallback);
[noscript, uuid(01B8A700-2F52-11D5-9DAA-F78DA781A1FC)]
interface nsIURLFetcher : nsISupports
{
boolean stillRunning();
void fireURLRequest(in nsIURI aURL, in nsOutputFileStream fOut, in nsAttachSaveCompletionCallback cb, in voidPtr tagData);
void initialize(in nsOutputFileStream fOut, in nsAttachSaveCompletionCallback cb, in voidPtr tagData);
};

Просмотреть файл

@ -0,0 +1,292 @@
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla Communicator client code,
* released March 31, 1998.
*
* The Initial Developer of the Original Code is Netscape Communications
* Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*
* Contributors:
* William A. ("PowerGUI") Law <law@netscape.com>
* Scott MacGregor <mscott@netscape.com>
* jean-Francois Ducarroz <ducarroz@netscape.com>
*/
var prefContractID = "@mozilla.org/preferences;1";
// dialog is just an array we'll use to store various properties from the dialog document...
var dialog;
// the msgComposeProgress is a nsIMsgComposeProgress object
var msgComposeProgress = null;
// random global variables...
var keepProgressWindowUpBox;
var targetFile;
var itsASaveOperation = false;
// all progress notifications are done through the nsIWebProgressListener implementation...
var progressListener = {
onStateChange: function(aWebProgress, aRequest, aStateFlags, aStatus)
{
if (aStateFlags & Components.interfaces.nsIWebProgressListener.STATE_START)
{
// Put progress meter in undetermined mode.
dialog.progress.setAttribute( "value", 0 );
dialog.progress.setAttribute( "mode", "undetermined" );
}
if (aStateFlags & Components.interfaces.nsIWebProgressListener.STATE_STOP)
{
// we are done sending/saving the message...
// Indicate completion in status area.
var msg;
if (itsASaveOperation)
msg = getString( "messageSaved" );
else
msg = getString( "messageSent" );
dialog.status.setAttribute("value", msg);
// Put progress meter at 100%.
dialog.progress.setAttribute( "value", 100 );
dialog.progress.setAttribute( "mode", "normal" );
var percentMsg = getString( "percentMsg" );
percentMsg = replaceInsert( percentMsg, 1, 100 );
dialog.progressText.setAttribute("value", percentMsg);
if (aStatus == 0)
processEndOfDownload(false);
else
processEndOfDownload(true);
}
},
onProgressChange: function(aWebProgress, aRequest, aCurSelfProgress, aMaxSelfProgress, aCurTotalProgress, aMaxTotalProgress)
{
var overallProgress = aCurTotalProgress;
// Calculate percentage.
var percent;
if ( aMaxTotalProgress != "-1" )
{
percent = parseInt( (overallProgress*100)/aMaxTotalProgress + .5 );
if ( percent > 100 )
percent = 100;
// Advance progress meter.
dialog.progress.setAttribute( "value", percent );
}
else
{
percent = "??";
// Progress meter should be barber-pole in this case.
dialog.progress.setAttribute( "mode", "undetermined" );
}
// Update status msg.
dialog.status.setAttribute("value", status);
// Update percentage label on progress meter.
var percentMsg = getString( "percentMsg" );
percentMsg = replaceInsert( percentMsg, 1, percent );
dialog.progressText.setAttribute("value", percentMsg);
},
onLocationChange: function(aWebProgress, aRequest, aLocation)
{
// we can ignore this notification
},
onStatusChange: function(aWebProgress, aRequest, aStatus, aMessage)
{
dialog.status.setAttribute("value", aMessage);
},
onSecurityChange: function(aWebProgress, aRequest, state)
{
// we can ignore this notification
},
QueryInterface : function(iid)
{
if (iid.equals(Components.interfaces.nsIWebProgressListener) || iid.equals(Components.interfaces.nsISupportsWeakReference))
return this;
throw Components.results.NS_NOINTERFACE;
}
};
function getString( stringId ) {
// Check if we've fetched this string already.
if ( !dialog.strings[ stringId ] ) {
// Try to get it.
var elem = document.getElementById( "dialog.strings."+stringId );
try {
if ( elem
&&
elem.childNodes
&&
elem.childNodes[0]
&&
elem.childNodes[0].nodeValue ) {
dialog.strings[ stringId ] = elem.childNodes[0].nodeValue;
} else {
// If unable to fetch string, use an empty string.
dialog.strings[ stringId ] = "";
}
} catch (e) { dialog.strings[ stringId ] = ""; }
}
return dialog.strings[ stringId ];
}
function loadDialog()
{
if (itsASaveOperation)
{
keepProgressWindowUpBox.checked = false;
keepProgressWindowUpBox.setAttribute("hidden", true);
}
else
{
var prefs = Components.classes[prefContractID].getService(Components.interfaces.nsIPref);
if (prefs)
keepProgressWindowUpBox.checked = prefs.GetBoolPref("mailnews.send.progressDnldDialog.keepAlive");
}
}
function replaceInsert( text, index, value ) {
var result = text;
var regExp = eval( "/#"+index+"/" );
result = result.replace( regExp, value );
return result;
}
function onLoad() {
// Set global variables.
var subject = window.arguments[0];
itsASaveOperation = window.arguments[1];
msgComposeProgress = window.arguments[2];
if ( !msgComposeProgress ) {
dump( "Invalid argument to downloadProgress.xul\n" );
window.close()
return;
}
dialog = new Object;
dialog.strings = new Array;
dialog.status = document.getElementById("dialog.status");
dialog.progress = document.getElementById("dialog.progress");
dialog.progressText = document.getElementById("dialog.progressText");
dialog.cancel = document.getElementById("cancel");
keepProgressWindowUpBox = document.getElementById('keepProgressDialogUp');
// Set up dialog button callbacks.
var object = this;
doSetOKCancel("", function () { return object.onCancel();});
// Fill dialog.
loadDialog();
// set our web progress listener on the helper app launcher
msgComposeProgress.registerListener(progressListener);
window.moveTo(opener.screenX + 16, opener.screenY + 32);
//We need to delay the set title else dom will overwrite it
return window.setTimeout( "SetTitle('" + subject + "');", 0 );
}
function onUnload()
{
if (!itsASaveOperation)
{
// remember the user's decision for the checkbox.
var prefs = Components.classes[prefContractID].getService(Components.interfaces.nsIPref);
if (prefs)
prefs.SetBoolPref("mailnews.send.progressDnldDialog.keepAlive", keepProgressWindowUpBox.checked);
}
if (msgComposeProgress)
{
try
{
msgComposeProgress.unregisterListener(progressListener);
msgComposeProgress = null;
}
catch( exception ) {}
}
}
function SetTitle(subject)
{
var prefix;
if (itsASaveOperation)
prefix = getString("titlePrefixSave");
else
prefix = getString("titlePrefixSend");
window.title = prefix + " " + subject;
}
// If the user presses cancel, tell the app launcher and close the dialog...
function onCancel ()
{
// Cancel app launcher.
try
{
msgComposeProgress.processCanceledByUser = true;
}
catch( exception ) {return true;}
// don't Close up dialog by returning false, the backend will close the dialog when everything will be aborted.
return false;
}
// closeWindow should only be called from processEndOfDownload
function closeWindow(forceClose)
{
// while the time out was fired the user may have checked the
// keep this dialog open box...so we should abort and not actually
// close the window.
if (forceClose || itsASaveOperation || !keepProgressWindowUpBox.checked)
window.close();
else
setupPostProgressUI();
}
function setupPostProgressUI()
{
//dialog.cancel.childNodes[0].nodeValue = "Close";
// turn the cancel button into a close button
var cancelButton = document.getElementById('cancel');
if (cancelButton)
{
cancelButton.setAttribute("label", getString("dialogCloseLabel"));
cancelButton.setAttribute("onclick", "window.close()");
}
}
// when we receive a stop notification we are done reporting progress on the send/save
// now we have to decide if the window is supposed to go away or if we are supposed to remain open
function processEndOfDownload(forceClose)
{
if (forceClose || itsASaveOperation || !keepProgressWindowUpBox.checked)
// return window.setTimeout( "closeWindow();", 2000 ); // shut down, we are all done.
return closeWindow(forceClose); // shut down, we are all done.
// o.t the user has asked the window to stay open so leave it open and enable the open and open new folder buttons
setupPostProgressUI();
}

Просмотреть файл

@ -0,0 +1,94 @@
<?xml version="1.0"?>
<!-- -*- Mode: HTML -*- -->
<!-- The contents of this file are subject to the Netscape Public
License Version 1.1 (the "License"); you may not use this file
except in compliance with the License. You may obtain a copy of
the License at http://www.mozilla.org/NPL/
Software distributed under the License is distributed on an "AS
IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
implied. See the License for the specific language governing
rights and limitations under the License.
The Original Code is Mozilla Communicator client code, released
March 31, 1998.
The Initial Developer of the Original Code is Netscape
Communications Corporation. Portions created by Netscape are
Copyright (C) 1998-2000 Netscape Communications Corporation. All
Rights Reserved.
Contributor(s):
Scott MacGregor <mscott@netscape.com>
Jean-Francois Ducarroz <ducarroz@netscape.com>
-->
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<?xul-overlay href="chrome://global/content/dialogOverlay.xul"?>
<!DOCTYPE window SYSTEM "chrome://messenger/locale/messengercompose/sendProgress.dtd">
<window xmlns:html="http://www.w3.org/1999/xhtml"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
class="dialog"
orient="vertical"
title="&sendWindow.title;"
style="width: 36em;"
onload="onLoad()"
onunload="onUnload()">
<script type="text/javascript" src="chrome://messenger/content/messengercompose/sendProgress.js"/>
<!-- This is non-visible content that simply adds translatable string
into the document so that it is accessible to JS code.
XXX-TODO:
convert to use string bundles.
-->
<data id="dialog.strings.dialogCloseLabel">&dialogClose.label;</data>
<data id="dialog.strings.titlePrefixSend">&titlePrefixSend;</data>
<data id="dialog.strings.titlePrefixSave">&titlePrefixSave;</data>
<data id="dialog.strings.messageSent">&messageSent;</data>
<data id="dialog.strings.messageSaved">&messageSaved;</data>
<grid flex="1">
<columns>
<column/>
<column flex="1"/>
</columns>
<rows>
<row>
<box autostretch="never" halign="right">
<text class="label" value="&status;"/>
</box>
<text class="label" id="dialog.status" value="&#160;"/>
</row>
<row class="thin-separator">
<box autostretch="never" halign="right">
<text class="label" value="&progress;"/>
</box>
<progressmeter id="dialog.progress" mode="normal" value="0"/>
<box autostretch="never" halign="right">
<text class="label" id="dialog.progressText" value="&#160;"/>
</box>
</row>
</rows>
</grid>
<separator/>
<checkbox id="keepProgressDialogUp" label="&keepProgressDialogUpMsg.label;"/>
<separator/>
<box id="CancelButton">
<spring flex="1"/>
<button class="dialog" id="cancel" label="&dialogCancel.label;" oncommand="doCancelButton()"/>
<spring flex="1"/>
</box>
</window>

Просмотреть файл

@ -0,0 +1,15 @@
<!--LOCALIZATION NOTE sendprogress.dtd Main UI for Send Message Progress Dialog -->
<!ENTITY sendWindow.title "Sending Messages">
<!ENTITY titlePrefixSave "Saving Messages -">
<!ENTITY titlePrefixSend "Sending Messages -">
<!ENTITY status "Status:">
<!ENTITY progress "Progress:">
<!ENTITY keepProgressDialogUpMsg.label "Keep this window open after the message is successfully sent.">
<!ENTITY dialogCancel.label "Cancel">
<!ENTITY dialogClose.label "Close">
<!ENTITY messageSent "Your message has been sent">
<!ENTITY messageSaved "Your message has been saved">

Просмотреть файл

@ -0,0 +1,278 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
* Jean-Francois Ducarroz <ducarroz@netscape.com>
*/
#include "nsMsgComposeProgress.h"
#include "nsIScriptGlobalObject.h"
#include "nsIBaseWindow.h"
#include "nsIDocShell.h"
#include "nsIDocShellTreeItem.h"
#include "nsIDocShellTreeOwner.h"
NS_IMPL_ISUPPORTS1(nsMsgComposeProgress, nsIMsgComposeProgress)
nsMsgComposeProgress::nsMsgComposeProgress()
{
NS_INIT_ISUPPORTS();
m_closeProgress = PR_FALSE;
m_processCanceled = PR_FALSE;
}
nsMsgComposeProgress::~nsMsgComposeProgress()
{
(void)ReleaseListeners();
}
/* void OpenProgress (in nsIDOMWindowInternal parent, in wstring subject, in boolean itsASaveOperation); */
NS_IMETHODIMP nsMsgComposeProgress::OpenProgress(nsIDOMWindowInternal *parent, const PRUnichar *subject, PRBool itsASaveOperation)
{
nsresult rv = NS_ERROR_FAILURE;
if (m_dialog)
return NS_ERROR_ALREADY_INITIALIZED;
if (parent)
{
// Get JS context from parent window.
nsCOMPtr<nsIScriptGlobalObject> sgo = do_QueryInterface(parent, &rv);
if (NS_SUCCEEDED(rv) && sgo)
{
nsCOMPtr<nsIScriptContext> context;
sgo->GetContext(getter_AddRefs(context));
if (context)
{
// Get native context.
JSContext *jsContext = (JSContext*)context->GetNativeContext();
if (jsContext)
{
// Set up window.arguments[0]...
void *stackPtr;
jsval *argv = JS_PushArguments( jsContext,
&stackPtr,
"sssWb%ip",
"chrome://messenger/content/messengercompose/sendProgress.xul",
"_blank",
"chrome,titlebar,dependent",
subject,
itsASaveOperation,
(const nsIID*)(&NS_GET_IID(nsIMsgComposeProgress)),
(nsISupports*)this
);
if (argv)
{
// Open the dialog.
rv = parent->OpenDialog(jsContext, argv, 6, getter_AddRefs(m_dialog));
// Pop arguments.
JS_PopArguments(jsContext, stackPtr);
}
}
}
}
}
return rv;
}
/* void CloseProgress (); */
NS_IMETHODIMP nsMsgComposeProgress::CloseProgress(PRBool forceClose)
{
m_closeProgress = PR_TRUE;
return OnStateChange(nsnull, nsnull, nsIWebProgressListener::STATE_STOP, forceClose);
}
/* nsIPrompt GetPrompter (); */
NS_IMETHODIMP nsMsgComposeProgress::GetPrompter(nsIPrompt **_retval)
{
NS_ENSURE_ARG_POINTER(_retval);
*_retval = nsnull;
if (! m_closeProgress && m_dialog)
return m_dialog->GetPrompter(_retval);
return NS_ERROR_FAILURE;
}
/* attribute boolean processCanceledByUser; */
NS_IMETHODIMP nsMsgComposeProgress::GetProcessCanceledByUser(PRBool *aProcessCanceledByUser)
{
NS_ENSURE_ARG_POINTER(aProcessCanceledByUser);
*aProcessCanceledByUser = m_processCanceled;
return NS_OK;
}
NS_IMETHODIMP nsMsgComposeProgress::SetProcessCanceledByUser(PRBool aProcessCanceledByUser)
{
m_processCanceled = aProcessCanceledByUser;
OnStateChange(nsnull, nsnull, nsIWebProgressListener::STATE_STOP, PR_FALSE);
return NS_OK;
}
/* void RegisterListener (in nsIWebProgressListener listener); */
NS_IMETHODIMP nsMsgComposeProgress::RegisterListener(nsIWebProgressListener * listener)
{
nsresult rv = NS_OK;
if (!listener) //Nothing to do with a null listener!
return NS_OK;
if (!m_listenerList)
rv = NS_NewISupportsArray(getter_AddRefs(m_listenerList));
if (NS_SUCCEEDED(rv) && m_listenerList)
{
m_listenerList->AppendElement(listener);
if (m_closeProgress || m_processCanceled)
listener->OnStateChange(nsnull, nsnull, nsIWebProgressListener::STATE_STOP, 0);
else
listener->OnStatusChange(nsnull, nsnull, 0, m_pendingStatus.GetUnicode());
}
return NS_OK;
}
/* void UnregisterListener (in nsIWebProgressListener listener); */
NS_IMETHODIMP nsMsgComposeProgress::UnregisterListener(nsIWebProgressListener *listener)
{
if (m_listenerList && listener)
m_listenerList->RemoveElement(listener);
return NS_OK;
}
/* void onStateChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in long aStateFlags, in unsigned long aStatus); */
NS_IMETHODIMP nsMsgComposeProgress::OnStateChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, PRInt32 aStateFlags, PRUint32 aStatus)
{
nsresult rv = NS_OK;
if (m_listenerList)
{
PRUint32 count;
PRInt32 i;
rv = m_listenerList->Count(&count);
NS_ASSERTION(NS_SUCCEEDED(rv), "m_listenerList->Count() failed");
if (NS_FAILED(rv))
return rv;
nsCOMPtr<nsISupports> aSupports;
nsCOMPtr<nsIWebProgressListener> aProgressListener;
for (i = count - 1; i >= 0; i --)
{
m_listenerList->GetElementAt(i, getter_AddRefs(aSupports));
aProgressListener = do_QueryInterface(aSupports);
if (aProgressListener)
aProgressListener->OnStateChange(aWebProgress, aRequest, aStateFlags, aStatus);
}
}
return rv;
}
/* void onProgressChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in long aCurSelfProgress, in long aMaxSelfProgress, in long aCurTotalProgress, in long aMaxTotalProgress); */
NS_IMETHODIMP nsMsgComposeProgress::OnProgressChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, PRInt32 aCurSelfProgress, PRInt32 aMaxSelfProgress, PRInt32 aCurTotalProgress, PRInt32 aMaxTotalProgress)
{
nsresult rv = NS_OK;
if (m_listenerList)
{
PRUint32 count;
PRInt32 i;
rv = m_listenerList->Count(&count);
NS_ASSERTION(NS_SUCCEEDED(rv), "m_listenerList->Count() failed");
if (NS_FAILED(rv))
return rv;
nsCOMPtr<nsISupports> aSupports;
nsCOMPtr<nsIWebProgressListener> aProgressListener;
for (i = count - 1; i >= 0; i --)
{
m_listenerList->GetElementAt(i, getter_AddRefs(aSupports));
aProgressListener = do_QueryInterface(aSupports);
if (aProgressListener)
aProgressListener->OnProgressChange(aWebProgress, aRequest, aCurSelfProgress, aMaxSelfProgress, aCurTotalProgress, aMaxTotalProgress);
}
}
return rv;
}
/* void onLocationChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in nsIURI location); */
NS_IMETHODIMP nsMsgComposeProgress::OnLocationChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, nsIURI *location)
{
return NS_ERROR_NOT_IMPLEMENTED;
}
/* void onStatusChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in nsresult aStatus, in wstring aMessage); */
NS_IMETHODIMP nsMsgComposeProgress::OnStatusChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, nsresult aStatus, const PRUnichar *aMessage)
{
nsresult rv = NS_OK;
m_pendingStatus = aMessage;
if (m_listenerList)
{
PRUint32 count;
PRInt32 i;
rv = m_listenerList->Count(&count);
NS_ASSERTION(NS_SUCCEEDED(rv), "m_listenerList->Count() failed");
if (NS_FAILED(rv))
return rv;
nsCOMPtr<nsISupports> aSupports;
nsCOMPtr<nsIWebProgressListener> aProgressListener;
for (i = count - 1; i >= 0; i --)
{
m_listenerList->GetElementAt(i, getter_AddRefs(aSupports));
aProgressListener = do_QueryInterface(aSupports);
if (aProgressListener)
aProgressListener->OnStatusChange(aWebProgress, aRequest, aStatus, aMessage);
}
}
return rv;
}
/* void onSecurityChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in long state); */
NS_IMETHODIMP nsMsgComposeProgress::OnSecurityChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, PRInt32 state)
{
return NS_ERROR_NOT_IMPLEMENTED;
}
nsresult nsMsgComposeProgress::ReleaseListeners()
{
nsresult rv = NS_OK;
if (m_listenerList)
{
PRUint32 count;
PRInt32 i;
rv = m_listenerList->Count(&count);
NS_ASSERTION(NS_SUCCEEDED(rv), "m_listenerList->Count() failed");
if (NS_SUCCEEDED(rv))
for (i = count - 1; i >= 0; i --)
m_listenerList->RemoveElementAt(i);
}
return rv;
}

Просмотреть файл

@ -0,0 +1,47 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
* Jean-Francois Ducarroz <ducarroz@netscape.com>
*/
#include "nsIMsgComposeProgress.h"
#include "nsCOMPtr.h"
#include "nsISupportsArray.h"
#include "nsIDOMWindowInternal.h"
class nsMsgComposeProgress : public nsIMsgComposeProgress
{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIMSGCOMPOSEPROGRESS
NS_DECL_NSIWEBPROGRESSLISTENER
nsMsgComposeProgress();
virtual ~nsMsgComposeProgress();
private:
nsresult ReleaseListeners(void);
PRBool m_closeProgress;
PRBool m_processCanceled;
nsString m_pendingStatus;
nsCOMPtr<nsIDOMWindowInternal> m_dialog;
nsCOMPtr<nsISupportsArray> m_listenerList;
};