Bug #44158 --> fix modal dialog problems by using correct nsIPrompt object obtained from the message window

associated with the current url.

r=alecf
This commit is contained in:
mscott%netscape.com 2000-07-08 01:10:30 +00:00
Родитель 0d7c4bc5c1
Коммит 4b70a12627
2 изменённых файлов: 42 добавлений и 18 удалений

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

@ -31,6 +31,7 @@
#include "nsFileStream.h"
#include "nsINetSupportDialogService.h"
#include "nsIDNSService.h"
#include "nsIMsgWindow.h"
#include "nsIMsgStatusFeedback.h"
static NS_DEFINE_CID(kNetSupportDialogCID, NS_NETSUPPORTDIALOG_CID);
@ -226,25 +227,26 @@ NS_IMETHODIMP nsMsgProtocol::OnStopRequest(nsIChannel * aChannel, nsISupports *c
if (m_channelListener)
rv = m_channelListener->OnStopRequest(this, m_channelContext, aStatus, aMsg);
nsCOMPtr <nsIMsgMailNewsUrl> aMsgUrl = do_QueryInterface(ctxt, &rv);
if (NS_SUCCEEDED(rv) && aMsgUrl)
nsCOMPtr <nsIMsgMailNewsUrl> msgUrl = do_QueryInterface(ctxt, &rv);
if (NS_SUCCEEDED(rv) && msgUrl)
{
rv = aMsgUrl->SetUrlState(PR_FALSE, aStatus);
rv = msgUrl->SetUrlState(PR_FALSE, aStatus);
if (m_loadGroup)
m_loadGroup->RemoveChannel(NS_STATIC_CAST(nsIChannel *, this), nsnull, aStatus, nsnull);
}
// !NS_BINDING_ABORTED because we don't want to see an alert if the user
// cancelled the operation. also, we'll get here because we call Cancel()
// to force removal of the nsSocketTransport. see CloseSocket()
// bugs #30775 and #30648 relate to this
if (NS_FAILED(aStatus) && (aStatus != NS_BINDING_ABORTED))
{
nsCOMPtr<nsIPrompt> msgPrompt;
GetPromptDialogFromUrl(msgUrl , getter_AddRefs(msgPrompt));
NS_ENSURE_TRUE(msgPrompt, NS_ERROR_FAILURE);
// !NS_BINDING_ABORTED because we don't want to see an alert if the user
// cancelled the operation. also, we'll get here because we call Cancel()
// to force removal of the nsSocketTransport. see CloseSocket()
// bugs #30775 and #30648 relate to this
if (NS_FAILED(aStatus) && (aStatus != NS_BINDING_ABORTED)) {
NS_WITH_SERVICE(nsIPrompt, dialog, kNetSupportDialogCID, &rv);
if (NS_SUCCEEDED(rv) && dialog) {
// todo, put this into a string bundle
nsAutoString alertMsg; alertMsg.AssignWithConversion("unknown error.");
switch (aStatus) {
nsAutoString alertMsg; alertMsg.AssignWithConversion("unknown error.");
switch (aStatus)
{
case NS_ERROR_UNKNOWN_HOST:
// todo, put this into a string bundle
alertMsg.AssignWithConversion("Failed to connect to the server.");
@ -260,13 +262,28 @@ NS_IMETHODIMP nsMsgProtocol::OnStopRequest(nsIChannel * aChannel, nsISupports *c
default:
break;
}
dialog->Alert(nsnull, alertMsg.GetUnicode());
}
}
rv = msgPrompt->Alert(nsnull, alertMsg.GetUnicode());
} // if we got an error code
} // if we have a mailnews url.
return rv;
}
nsresult nsMsgProtocol::GetPromptDialogFromUrl(nsIMsgMailNewsUrl * aMsgUrl, nsIPrompt ** aPromptDialog)
{
// get the nsIPrompt interface from the message window associated wit this url.
nsCOMPtr<nsIMsgWindow> msgWindow;
aMsgUrl->GetMsgWindow(getter_AddRefs(msgWindow));
NS_ENSURE_TRUE(msgWindow, NS_ERROR_FAILURE);
msgWindow->GetPromptDialog(aPromptDialog);
NS_ENSURE_TRUE(*aPromptDialog, NS_ERROR_FAILURE);
return NS_OK;
}
nsresult nsMsgProtocol::LoadUrl(nsIURI * aURL, nsISupports * aConsumer)
{
// okay now kick us off to the next state...

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

@ -34,6 +34,9 @@
#include "nsIInterfaceRequestor.h"
#include "nsIProgressEventSink.h"
class nsIPrompt;
class nsIMsgMailNewsUrl;
// This is a helper class used to encapsulate code shared between all of the
// mailnews protocol objects (imap, news, pop, smtp, etc.) In particular,
// it unifies the core networking code for the protocols. My hope is that
@ -119,6 +122,10 @@ protected:
nsCOMPtr<nsIInterfaceRequestor> mCallbacks;
nsCOMPtr<nsISupports> mOwner;
nsCString m_ContentType;
// private helper routine used by subclasses to quickly get a reference to the correct prompt dialog
// for a mailnews url.
nsresult GetPromptDialogFromUrl(nsIMsgMailNewsUrl * aMsgUrl, nsIPrompt ** aPromptDialog);
};
#endif /* nsMsgProtocol_h__ */