diff --git a/mozilla/mailnews/base/src/nsMsgCopyService.cpp b/mozilla/mailnews/base/src/nsMsgCopyService.cpp index 64b1c7cc345..b34d13da9a0 100644 --- a/mozilla/mailnews/base/src/nsMsgCopyService.cpp +++ b/mozilla/mailnews/base/src/nsMsgCopyService.cpp @@ -17,13 +17,32 @@ */ #include "nsMsgCopyService.h" -#include "nsMsgBaseCID.h" +#include "nsCOMPtr.h" +#include "nsVoidArray.h" +#include "nsMsgKeyArray.h" +#include "prmon.h" #ifdef XP_PC #include #endif -static NS_DEFINE_CID(kMsgCopyServiceCID, NS_MSGCOPYSERVICE_CID); +typedef struct _nsMsgStore +{ + nsCOMPtr msgFolder; + nsMsgKeyArray keyArray; +} nsMsgStore; + +typedef struct _nsCopyRequest +{ + nsCOMPtr srcSupport; // a nsIMsgFolder or nsFileSpec + nsCOMPtr dstFolder; + nsCOMPtr txnMgr; + nsCOMPtr listener; + nsCOMPtr listenerData; + PRBool isMove; + nsVoidArray msgStoreArray; // array of nsMsgStore +} nsCopyRequest; + class nsMsgCopyService : public nsIMsgCopyService { public: @@ -37,48 +56,121 @@ public: nsISupportsArray* messages, nsIMsgFolder* dstFolder, PRBool isMove, + nsIMsgCopyServiceListener* listener, + nsISupports* listenerData, nsITransactionManager* txnMgr); - NS_IMETHOD CopyMessage(nsIFileSpec* fileSpec, - nsIMsgFolder* dstFolder, - nsITransactionManager* txnMgr); + NS_IMETHOD CopyFileMessage(nsIFileSpec* fileSpec, + nsIMsgFolder* dstFolder, + nsIMessage* msgToReplace, + PRBool isDraft, + nsIMsgCopyServiceListener* listener, + nsISupports* listenerData, + nsITransactionManager* txnMgr); NS_IMETHOD NotifyCompletion(nsISupports* aSupport, /* store src folder */ nsIMsgFolder* dstFolder); - NS_IMETHOD RegisterListener(nsIMsgCopyServiceListener* aListener, - nsISupports* aSupport, /* src folder or file */ - /* spec */ - nsIMsgFolder* dstFolder, - nsISupports* listenerData); - NS_IMETHOD UnregisterListener(nsIMsgCopyServiceListener* theListener); + +private: + + nsresult ClearRequest(nsCopyRequest* aRequest, nsresult rv); + void RemoveAll(); + nsVoidArray m_copyRequests; }; nsMsgCopyService::nsMsgCopyService() { - NS_INIT_REFCNT(); + NS_INIT_REFCNT(); } nsMsgCopyService::~nsMsgCopyService() { + RemoveAll(); } -NS_IMPL_THREADSAFE_ISUPPORTS(nsMsgCopyService, nsIMsgCopyService::GetIID()); +nsresult +nsMsgCopyService::ClearRequest(nsCopyRequest* aRequest, nsresult rv) +{ + nsMsgStore* nms; + PRInt32 j; + + if (aRequest) + { + j = aRequest->msgStoreArray.Count(); + while(j-- > 0) + { + nms = (nsMsgStore*) aRequest->msgStoreArray.ElementAt(j); + aRequest->msgStoreArray.RemoveElementAt(j); + delete nms; + } + m_copyRequests.RemoveElement(aRequest); + if (aRequest->listener) + aRequest->listener->OnStopCopy(rv, aRequest->listenerData); + delete aRequest; + } + return rv; +} + +void +nsMsgCopyService::RemoveAll() +{ + PRInt32 i; + nsCopyRequest* ncr; + + i = m_copyRequests.Count(); + + while(i-- > 0) + { + ncr = (nsCopyRequest*) m_copyRequests.ElementAt(i); + ClearRequest(ncr, NS_ERROR_FAILURE); + } +} + +NS_IMPL_THREADSAFE_ISUPPORTS(nsMsgCopyService, nsIMsgCopyService::GetIID()) NS_IMETHODIMP nsMsgCopyService::CopyMessages(nsIMsgFolder* srcFolder, /* UI src foler */ nsISupportsArray* messages, nsIMsgFolder* dstFolder, PRBool isMove, + nsIMsgCopyServiceListener* listener, + nsISupports* listenerData, nsITransactionManager* txnMgr) { +#if 0 + nsCopyRequest* ncr; + nsMsgStore* nms; + nsresult rv = NS_ERROR_NULL_POINTER; + nsVoidArray msgArray; + PRUint32 i, cnt; + nsCOMPtr msg; + + if (!srcFolder || !messages || !dstFolder) return rv; + + ncr = new nsCopyRequest; + if (!ncr) return rv; + + nms = new nsMsgStore; + + cnt = messages->Count(); + + // duplicate the message array so we could sort the messages by it's + // folder easily + for (i=0; iElementAt(i)); +#endif return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP -nsMsgCopyService::CopyMessage(nsIFileSpec* fileSpec, - nsIMsgFolder* dstFolder, - nsITransactionManager* txnMgr) +nsMsgCopyService::CopyFileMessage(nsIFileSpec* fileSpec, + nsIMsgFolder* dstFolder, + nsIMessage* msgToReplace, + PRBool isDraft, + nsIMsgCopyServiceListener* listener, + nsISupports* listenerData, + nsITransactionManager* txnMgr) { return NS_ERROR_NOT_IMPLEMENTED; } @@ -90,21 +182,6 @@ nsMsgCopyService::NotifyCompletion(nsISupports* aSupport, return NS_ERROR_NOT_IMPLEMENTED; } -NS_IMETHODIMP -nsMsgCopyService::RegisterListener(nsIMsgCopyServiceListener* aListener, - nsISupports* aSupport, - nsIMsgFolder* dstFolder, - nsISupports* listenerData) -{ - return NS_ERROR_NOT_IMPLEMENTED; -} - -NS_IMETHODIMP -nsMsgCopyService::UnregisterListener(nsIMsgCopyServiceListener* theListener) -{ - return NS_ERROR_NOT_IMPLEMENTED; -} - nsresult NS_NewMsgCopyService(const nsIID& iid, void **result) { diff --git a/mozilla/mailnews/base/src/nsMsgFolderDataSource.cpp b/mozilla/mailnews/base/src/nsMsgFolderDataSource.cpp index b3eb5e5cabe..3c563abe51f 100644 --- a/mozilla/mailnews/base/src/nsMsgFolderDataSource.cpp +++ b/mozilla/mailnews/base/src/nsMsgFolderDataSource.cpp @@ -908,7 +908,8 @@ nsresult nsMsgFolderDataSource::DoCopyToFolder(nsIMsgFolder *dstFolder, nsISuppo NS_WITH_SERVICE(nsIMsgCopyService, copyService, kMsgCopyServiceCID, &rv); if(NS_SUCCEEDED(rv)) { - copyService->CopyMessages(srcFolder, messageArray, dstFolder, isMove, txnMgr); + copyService->CopyMessages(srcFolder, messageArray, dstFolder, isMove, + nsnull, nsnull, txnMgr); } return NS_OK;