fix stop of msg move/copy r=mscott 28129

This commit is contained in:
bienvenu%netscape.com 2000-08-06 20:15:32 +00:00
parent 30d47ff881
commit 085017417c
10 changed files with 57 additions and 37 deletions

View File

@ -58,11 +58,11 @@ interface nsIMsgMessageService : nsISupports {
///////////////////////////////////////////////////////////////
void CopyMessage(in string aSrcURI, in nsIStreamListener aCopyListener, in boolean aMoveMessage,
in nsIUrlListener aUrlListener, out nsIURI aURL);
in nsIUrlListener aUrlListener, in nsIMsgWindow aMsgWindow, out nsIURI aURL);
/* copy multiple messages at a time */
[noscript] void CopyMessages(in nsMsgKeyArrayPtr keys, in nsIMsgFolder srcFolder, in nsIStreamListener aCopyListener, in boolean aMoveMessage,
in nsIUrlListener aUrlListener, out nsIURI aURL);
in nsIUrlListener aUrlListener, in nsIMsgWindow aMsgWindow, out nsIURI aURL);
/////////////////////////////////////////////////////////////////////
// DisplayMessage: When you want a message displayed....

View File

@ -318,6 +318,12 @@ NS_IMETHODIMP nsMsgWindow::SetDOMWindow(nsIDOMWindow *aWindow)
NS_IMETHODIMP nsMsgWindow::StopUrls()
{
nsCOMPtr<nsIDocShell> docShell;
GetRootDocShell(getter_AddRefs(docShell));
if (docShell)
{
return docShell->StopLoad();
}
nsCOMPtr <nsIWebShell> rootWebShell(do_QueryInterface(mRootDocShell));
if (rootWebShell)
{

View File

@ -64,6 +64,7 @@ interface nsIImapService : nsISupports
in nsImapState aImapAction,
in nsIMsgFolder aImapMailFolder,
in nsIImapMessageSink aImapMessageSink,
in nsIMsgWindow aMsgWindow,
out nsIURI aOutURL,
in nsISupports aConsumer,
in string aMessageIdnetifierList,

View File

@ -3773,7 +3773,7 @@ nsImapMailFolder::CopyNextStreamMessage(nsIImapProtocol* aProtocol,
if (NS_SUCCEEDED(rv))
{
rv = CopyStreamMessage(mailCopyState->m_message,
this, mailCopyState->m_isMove);
this, mailCopyState->m_msgWindow, mailCopyState->m_isMove);
}
}
else if (mailCopyState->m_isMove)
@ -3855,7 +3855,7 @@ nsImapMailFolder::CopyMessagesWithStream(nsIMsgFolder* srcFolder,
nsCOMPtr<nsISupports> aSupport(do_QueryInterface(srcFolder, &rv));
if (NS_FAILED(rv)) return rv;
rv = InitCopyState(aSupport, messages, isMove, PR_FALSE, listener);
rv = InitCopyState(aSupport, messages, isMove, PR_FALSE, listener, msgWindow);
if(NS_FAILED(rv)) return rv;
m_copyState->m_streamCopy = PR_TRUE;
@ -3897,7 +3897,7 @@ nsImapMailFolder::CopyMessagesWithStream(nsIMsgFolder* srcFolder,
nsCOMPtr<nsIMessage> aMessage;
aMessage = do_QueryInterface(msgSupport, &rv);
if (NS_SUCCEEDED(rv))
CopyStreamMessage(aMessage, this, isMove);
CopyStreamMessage(aMessage, this, msgWindow, isMove);
else
ClearCopyState(rv);
}
@ -3959,7 +3959,7 @@ nsImapMailFolder::CopyMessages(nsIMsgFolder* srcFolder,
srcSupport = do_QueryInterface(srcFolder);
rv = QueryInterface(NS_GET_IID(nsIUrlListener), getter_AddRefs(urlListener));
rv = InitCopyState(srcSupport, messages, isMove, PR_TRUE, listener);
rv = InitCopyState(srcSupport, messages, isMove, PR_TRUE, listener, msgWindow);
if (NS_FAILED(rv)) goto done;
m_copyState->m_curIndex = m_copyState->m_totalCount;
@ -4046,7 +4046,7 @@ nsImapMailFolder::CopyFileMessage(nsIFileSpec* fileSpec,
}
rv = InitCopyState(srcSupport, messages, PR_FALSE, isDraftOrTemplate,
listener);
listener, msgWindow);
if (NS_FAILED(rv)) return rv;
nsCOMPtr<nsISupports> copySupport;
@ -4064,6 +4064,7 @@ nsImapMailFolder::CopyFileMessage(nsIFileSpec* fileSpec,
nsresult
nsImapMailFolder::CopyStreamMessage(nsIMessage* message,
nsIMsgFolder* dstFolder, // should be this
nsIMsgWindow *aMsgWindow,
PRBool isMove)
{
nsresult rv = NS_ERROR_NULL_POINTER;
@ -4106,7 +4107,7 @@ nsImapMailFolder::CopyStreamMessage(nsIMessage* message,
return NS_ERROR_NO_INTERFACE;
rv = m_copyState->m_msgService->CopyMessage(uri, streamListener,
isMove && !m_copyState->m_isCrossServerOp, nsnull, &url);
isMove && !m_copyState->m_isCrossServerOp, nsnull, aMsgWindow, &url);
}
return rv;
}
@ -4152,7 +4153,8 @@ nsImapMailFolder::InitCopyState(nsISupports* srcSupport,
nsISupportsArray* messages,
PRBool isMove,
PRBool selectedState,
nsIMsgCopyServiceListener* listener)
nsIMsgCopyServiceListener* listener,
nsIMsgWindow *msgWindow)
{
nsresult rv = NS_OK;
@ -4176,7 +4178,7 @@ nsImapMailFolder::InitCopyState(nsISupports* srcSupport,
}
m_copyState->m_isMove = isMove;
m_copyState->m_selectedState = selectedState;
m_copyState->m_msgWindow = msgWindow;
if (listener)
m_copyState->m_listener = do_QueryInterface(listener, &rv);

View File

@ -77,6 +77,7 @@ public:
nsCOMPtr<nsIMsgCopyServiceListener> m_listener; // listener of this copy
// operation
nsCOMPtr<nsIFileSpec> m_tmpFileSpec; // temp file spec for copy operation
nsCOMPtr<nsIMsgWindow> m_msgWindow; // msg window for copy operation
nsIMsgMessageService* m_msgService; // source folder message service; can
// be Nntp, Mailbox, or Imap
@ -301,12 +302,13 @@ protected:
nsIMsgWindow *msgWindow,
nsIMsgCopyServiceListener* listener);
nsresult CopyStreamMessage(nsIMessage* message, nsIMsgFolder* dstFolder,
PRBool isMove);
nsIMsgWindow *msgWindow, PRBool isMove);
nsresult InitCopyState(nsISupports* srcSupport,
nsISupportsArray* messages,
PRBool isMove,
PRBool selectedState,
nsIMsgCopyServiceListener* listener);
nsIMsgCopyServiceListener* listener,
nsIMsgWindow *msgWindow);
void ClearCopyState(nsresult exitCode);
nsresult SetTransactionManager(nsITransactionManager* txnMgr);
nsresult BuildIdsAndKeyArray(nsISupportsArray* messages,

View File

@ -472,7 +472,7 @@ NS_IMETHODIMP nsImapService::DisplayMessage(const char* aMessageURI,
}
PRBool msgLoadingFromCache = PR_FALSE;
rv = FetchMessage(imapUrl, nsIImapUrl::nsImapMsgFetch, folder, imapMessageSink,
aURL, aDisplayConsumer, msgKey, PR_TRUE);
aMsgWindow, aURL, aDisplayConsumer, msgKey, PR_TRUE);
if (NS_SUCCEEDED(rv))
{
imapUrl->GetMsgLoadingFromCache(&msgLoadingFromCache);
@ -671,7 +671,7 @@ NS_IMETHODIMP nsImapService::DisplayMessageForPrinting(const char* aMessageURI,
NS_IMETHODIMP
nsImapService::CopyMessage(const char * aSrcMailboxURI, nsIStreamListener *
aMailboxCopy, PRBool moveMessage,
nsIUrlListener * aUrlListener, nsIURI **aURL)
nsIUrlListener * aUrlListener, nsIMsgWindow *aMsgWindow, nsIURI **aURL)
{
nsresult rv = NS_ERROR_NULL_POINTER;
nsCOMPtr<nsISupports> streamSupport;
@ -696,7 +696,7 @@ nsImapService::CopyMessage(const char * aSrcMailboxURI, nsIStreamListener *
nsImapAction imapAction = nsIImapUrl::nsImapOnlineToOfflineCopy;
if (moveMessage)
imapAction = nsIImapUrl::nsImapOnlineToOfflineMove;
rv = FetchMessage(imapUrl,imapAction, folder, imapMessageSink,aURL, streamSupport, msgKey, PR_TRUE);
rv = FetchMessage(imapUrl,imapAction, folder, imapMessageSink,aMsgWindow, aURL, streamSupport, msgKey, PR_TRUE);
} // if we got an imap message sink
} // if we decomposed the imap message
return rv;
@ -704,7 +704,7 @@ nsImapService::CopyMessage(const char * aSrcMailboxURI, nsIStreamListener *
NS_IMETHODIMP
nsImapService::CopyMessages(nsMsgKeyArray *keys, nsIMsgFolder *srcFolder, nsIStreamListener *aMailboxCopy, PRBool moveMessage,
nsIUrlListener * aUrlListener, nsIURI **aURL)
nsIUrlListener * aUrlListener, nsIMsgWindow *aMsgWindow, nsIURI **aURL)
{
nsresult rv = NS_OK;
nsCOMPtr<nsISupports> streamSupport;
@ -735,7 +735,7 @@ nsImapService::CopyMessages(nsMsgKeyArray *keys, nsIMsgFolder *srcFolder, nsIStr
imapUrl->SetCopyState(aMailboxCopy);
// now try to display the message
rv = FetchMessage(imapUrl, action, folder, imapMessageSink,
aURL, streamSupport, messageIds.GetBuffer(), PR_TRUE);
aMsgWindow, aURL, streamSupport, messageIds.GetBuffer(), PR_TRUE);
// ### end of copy operation should know how to do the delete.if this is a move
} // if we got an imap message sink
@ -848,7 +848,7 @@ NS_IMETHODIMP nsImapService::SaveMessageToDisk(const char *aMessageURI,
msgUrl->SetAddDummyEnvelope(aAddDummyEnvelope);
msgUrl->SetCanonicalLineEnding(canonicalLineEnding);
return FetchMessage(imapUrl, nsIImapUrl::nsImapSaveMessageToDisk, folder, imapMessageSink, aURL, imapMessageSink, msgKey, PR_TRUE);
return FetchMessage(imapUrl, nsIImapUrl::nsImapSaveMessageToDisk, folder, imapMessageSink, aMsgWindow, aURL, imapMessageSink, msgKey, PR_TRUE);
}
return rv;
@ -864,6 +864,7 @@ nsImapService::FetchMessage(nsIImapUrl * aImapUrl,
nsImapAction aImapAction,
nsIMsgFolder * aImapMailFolder,
nsIImapMessageSink * aImapMessage,
nsIMsgWindow *aMsgWindow,
nsIURI ** aURL,
nsISupports * aDisplayConsumer,
const char *messageIdentifierList,
@ -944,7 +945,11 @@ nsImapService::FetchMessage(nsIImapUrl * aImapUrl,
nsCOMPtr<nsILoadGroup> aLoadGroup;
nsCOMPtr<nsIMsgMailNewsUrl> mailnewsUrl = do_QueryInterface(aImapUrl, &rv);
if (NS_SUCCEEDED(rv) && mailnewsUrl)
mailnewsUrl->GetLoadGroup(getter_AddRefs(aLoadGroup));
{
if (aMsgWindow)
mailnewsUrl->SetMsgWindow(aMsgWindow);
mailnewsUrl->GetLoadGroup(getter_AddRefs(aLoadGroup));
}
rv = NewChannel(url, getter_AddRefs(aChannel));
if (NS_FAILED(rv)) return rv;

View File

@ -315,7 +315,7 @@ nsFolderCompactState::OnStopRequest(nsIChannel *channel, nsISupports *ctxt,
m_messageUri);
if (NS_FAILED(rv)) goto done;
rv = m_messageService->CopyMessage(m_messageUri, this, PR_FALSE, nsnull,
nsnull);
/* ### should get msg window! */ nsnull, nsnull);
}
@ -1107,7 +1107,7 @@ NS_IMETHODIMP nsMsgLocalMailFolder::Compact()
if (NS_SUCCEEDED(rv))
rv = compactState->m_messageService->CopyMessage(
compactState->m_messageUri, compactState, PR_FALSE, nsnull,
nsnull);
/* ### should get msg window! */ nsnull, nsnull);
}
else
{ // no messages to copy with
@ -1739,7 +1739,8 @@ nsresult
nsMsgLocalMailFolder::InitCopyState(nsISupports* aSupport,
nsISupportsArray* messages,
PRBool isMove,
nsIMsgCopyServiceListener* listener)
nsIMsgCopyServiceListener* listener,
nsIMsgWindow *msgWindow)
{
nsresult rv = NS_OK;
nsFileSpec path;
@ -1834,7 +1835,7 @@ nsMsgLocalMailFolder::CopyMessages(nsIMsgFolder* srcFolder, nsISupportsArray*
nsCOMPtr<nsISupports> aSupport(do_QueryInterface(srcFolder, &rv));
if (NS_FAILED(rv)) return rv;
rv = InitCopyState(aSupport, messages, isMove, listener);
rv = InitCopyState(aSupport, messages, isMove, listener, msgWindow);
if (NS_FAILED(rv)) return rv;
char *uri = nsnull;
rv = srcFolder->GetURI(&uri);
@ -1891,7 +1892,7 @@ nsMsgLocalMailFolder::CopyMessages(nsIMsgFolder* srcFolder, nsISupportsArray*
if (numMsgs > 1 && protocolType.EqualsIgnoreCase("imap"))
{
mCopyState->m_copyingMultipleMessages = PR_TRUE;
rv = CopyMessagesTo(messages, this, isMove);
rv = CopyMessagesTo(messages, msgWindow, this, isMove);
}
else
{
@ -1901,7 +1902,7 @@ nsMsgLocalMailFolder::CopyMessages(nsIMsgFolder* srcFolder, nsISupportsArray*
{
nsCOMPtr<nsIMessage> aMessage = do_QueryInterface(msgSupport, &rv);
if(NS_SUCCEEDED(rv))
rv = CopyMessageTo(aMessage, this, isMove);
rv = CopyMessageTo(aMessage, this, msgWindow, isMove);
else
ClearCopyState();
}
@ -1937,7 +1938,7 @@ nsMsgLocalMailFolder::CopyFileMessage(nsIFileSpec* fileSpec, nsIMessage*
}
rv = InitCopyState(fileSupport, messages, msgToReplace ? PR_TRUE:PR_FALSE,
listener);
listener, msgWindow);
if (NS_FAILED(rv)) goto done;
parseMsgState = new nsParseMailMessageState();
@ -2373,7 +2374,7 @@ NS_IMETHODIMP nsMsgLocalMailFolder::EndCopy(PRBool copySucceeded)
(mCopyState->m_curCopyIndex));
nsCOMPtr<nsIMessage>aMessage = do_QueryInterface(aSupport, &rv);
if (NS_SUCCEEDED(rv))
rv = CopyMessageTo(aMessage, this, mCopyState->m_isMove);
rv = CopyMessageTo(aMessage, this, msgWindow, mCopyState->m_isMove);
}
else
{ // both CopyMessages() & CopyFileMessage() go here if they have
@ -2507,7 +2508,7 @@ NS_IMETHODIMP nsMsgLocalMailFolder::EndMessage(nsMsgKey key)
nsresult nsMsgLocalMailFolder::CopyMessagesTo(nsISupportsArray *messages,
nsIMsgFolder *dstFolder,
nsIMsgWindow *aMsgWindow, nsIMsgFolder *dstFolder,
PRBool isMove)
{
if (!mCopyState) return NS_ERROR_OUT_OF_MEMORY;
@ -2564,7 +2565,7 @@ nsresult nsMsgLocalMailFolder::CopyMessagesTo(nsISupportsArray *messages,
return NS_ERROR_NO_INTERFACE;
mCopyState->m_curCopyIndex = 0;
mCopyState->m_messageService->CopyMessages(&keyArray, srcFolder, streamListener, isMove,
nsnull, &url);
nsnull, aMsgWindow, &url);
}
return rv;
@ -2572,6 +2573,7 @@ nsresult nsMsgLocalMailFolder::CopyMessagesTo(nsISupportsArray *messages,
nsresult nsMsgLocalMailFolder::CopyMessageTo(nsIMessage *message,
nsIMsgFolder *dstFolder,
nsIMsgWindow *aMsgWindow,
PRBool isMove)
{
if (!mCopyState) return NS_ERROR_OUT_OF_MEMORY;
@ -2619,7 +2621,7 @@ nsresult nsMsgLocalMailFolder::CopyMessageTo(nsIMessage *message,
if(!streamListener)
return NS_ERROR_NO_INTERFACE;
mCopyState->m_messageService->CopyMessage(uri, streamListener, isMove,
nsnull, &url);
nsnull, aMsgWindow, &url);
}
return rv;

View File

@ -162,17 +162,17 @@ protected:
PRBool deleteStorage);
// copy message helper
nsresult CopyMessageTo(nsIMessage *message, nsIMsgFolder *dstFolder,
PRBool isMove);
nsIMsgWindow *msgWindow, PRBool isMove);
// copy multiple messages at a time from this folder
nsresult CopyMessagesTo(nsISupportsArray *messages,
nsresult CopyMessagesTo(nsISupportsArray *messages, nsIMsgWindow *aMsgWindow,
nsIMsgFolder *dstFolder,
PRBool isMove);
virtual const char* GetIncomingServerType();
nsresult SetTransactionManager(nsITransactionManager* txnMgr);
nsresult InitCopyState(nsISupports* aSupport, nsISupportsArray* messages,
PRBool isMove, nsIMsgCopyServiceListener* listener);
PRBool isMove, nsIMsgCopyServiceListener* listener, nsIMsgWindow *msgWindow);
void ClearCopyState();
virtual nsresult CreateBaseMessageURI(const char *aURI);

View File

@ -100,12 +100,13 @@ nsresult nsMailboxService::CopyMessage(const char * aSrcMailboxURI,
nsIStreamListener * aMailboxCopyHandler,
PRBool moveMessage,
nsIUrlListener * aUrlListener,
nsIMsgWindow *aMsgWindow,
nsIURI **aURL)
{
nsMailboxAction mailboxAction = nsIMailboxUrl::ActionMoveMessage;
if (!moveMessage)
mailboxAction = nsIMailboxUrl::ActionCopyMessage;
return FetchMessage(aSrcMailboxURI, aMailboxCopyHandler, nsnull, aUrlListener, nsnull, mailboxAction, nsnull, aURL);
return FetchMessage(aSrcMailboxURI, aMailboxCopyHandler, aMsgWindow, aUrlListener, nsnull, mailboxAction, nsnull, aURL);
}
nsresult nsMailboxService::CopyMessages(nsMsgKeyArray *msgKeys,
@ -113,6 +114,7 @@ nsresult nsMailboxService::CopyMessages(nsMsgKeyArray *msgKeys,
nsIStreamListener * aMailboxCopyHandler,
PRBool moveMessage,
nsIUrlListener * aUrlListener,
nsIMsgWindow *aMsgWindow,
nsIURI **aURL)
{
NS_ASSERTION(PR_FALSE, "not implemented yet");

View File

@ -347,20 +347,20 @@ nsresult nsNntpService::ConvertNewsMessageURI2NewsURI(const char *messageURI, ns
NS_IMETHODIMP
nsNntpService::CopyMessage(const char * aSrcMailboxURI, nsIStreamListener * aMailboxCopyHandler, PRBool moveMessage,
nsIUrlListener * aUrlListener, nsIURI **aURL)
nsIUrlListener * aUrlListener, nsIMsgWindow *aMsgWindow, nsIURI **aURL)
{
nsresult rv = NS_ERROR_NULL_POINTER;
nsCOMPtr<nsISupports> streamSupport;
if (!aSrcMailboxURI || !aMailboxCopyHandler) return rv;
streamSupport = do_QueryInterface(aMailboxCopyHandler, &rv);
if (NS_SUCCEEDED(rv))
rv = DisplayMessage(aSrcMailboxURI, streamSupport, nsnull, aUrlListener, nsnull, aURL);
rv = DisplayMessage(aSrcMailboxURI, streamSupport, aMsgWindow, aUrlListener, nsnull, aURL);
return rv;
}
NS_IMETHODIMP
nsNntpService::CopyMessages(nsMsgKeyArray *keys, nsIMsgFolder *srcFolder, nsIStreamListener * aMailboxCopyHandler, PRBool moveMessage,
nsIUrlListener * aUrlListener, nsIURI **aURL)
nsIUrlListener * aUrlListener, nsIMsgWindow *aMsgWindow, nsIURI **aURL)
{
return NS_ERROR_NOT_IMPLEMENTED;
}