зеркало из https://github.com/mozilla/gecko-dev.git
nsCopyMessageStreamListener can be created from the factory, and deleting a message
doesn't deleteStorage.
This commit is contained in:
Родитель
d42d4bf36f
Коммит
2538964415
|
@ -29,5 +29,6 @@ nsMsgAccountManager.h
|
|||
nsMsgRDFDataSource.h
|
||||
nsMsgBiffManager.h
|
||||
nsMsgNotificationManager.h
|
||||
nsCopyMessageStreamListener.h
|
||||
|
||||
|
||||
|
|
|
@ -43,6 +43,7 @@ EXPORTS = \
|
|||
nsMsgRDFDataSource.h \
|
||||
nsMsgBiffManager.h \
|
||||
nsMsgNotificationManager.h \
|
||||
nsCopyMessageStreamListener.h \
|
||||
$(NULL)
|
||||
|
||||
CPPSRCS = \
|
||||
|
|
|
@ -42,6 +42,7 @@ EXPORTS= \
|
|||
nsMsgServerDataSource.h \
|
||||
nsMsgBiffManager.h \
|
||||
nsMsgNotificationManager.h \
|
||||
nsCopyMessageStreamListener.h \
|
||||
$(NULL)
|
||||
|
||||
|
||||
|
|
|
@ -25,10 +25,44 @@
|
|||
|
||||
static NS_DEFINE_CID(kRDFServiceCID, NS_RDFSERVICE_CID);
|
||||
|
||||
NS_BEGIN_EXTERN_C
|
||||
|
||||
nsresult
|
||||
NS_NewCopyMessageStreamListener(const nsIID& iid, void **result)
|
||||
{
|
||||
nsCopyMessageStreamListener *listener = new nsCopyMessageStreamListener();
|
||||
if(!listener)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
return listener->QueryInterface(iid, result);
|
||||
}
|
||||
|
||||
NS_END_EXTERN_C
|
||||
|
||||
/* the following macros actually implement addref, release and query interface for our component. */
|
||||
NS_IMPL_ADDREF(nsCopyMessageStreamListener)
|
||||
NS_IMPL_RELEASE(nsCopyMessageStreamListener)
|
||||
NS_IMPL_QUERY_INTERFACE(nsCopyMessageStreamListener, nsIStreamListener::GetIID()); /* we need to pass in the interface ID of this interface */
|
||||
|
||||
NS_IMETHODIMP nsCopyMessageStreamListener::QueryInterface(REFNSIID aIID, void** aInstancePtr)
|
||||
{
|
||||
if (!aInstancePtr) return NS_ERROR_NULL_POINTER;
|
||||
*aInstancePtr = nsnull;
|
||||
if (aIID.Equals(nsIStreamListener::GetIID()))
|
||||
{
|
||||
*aInstancePtr = NS_STATIC_CAST(nsIStreamListener*, this);
|
||||
}
|
||||
else if(aIID.Equals(nsICopyMessageStreamListener::GetIID()))
|
||||
{
|
||||
*aInstancePtr = NS_STATIC_CAST(nsICopyMessageStreamListener*, this);
|
||||
}
|
||||
|
||||
if(*aInstancePtr)
|
||||
{
|
||||
AddRef();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
return NS_ERROR_NO_INTERFACE;
|
||||
}
|
||||
|
||||
static nsresult GetMessage(nsIURL *aURL, nsIMessage **message)
|
||||
{
|
||||
|
@ -96,21 +130,15 @@ static nsresult DeleteMessage(nsIURL *aURL, nsIMsgFolder *srcFolder)
|
|||
nsCOMPtr<nsISupportsArray> messageArray;
|
||||
NS_NewISupportsArray(getter_AddRefs(messageArray));
|
||||
messageArray->AppendElement(message);
|
||||
rv = srcFolder->DeleteMessages(messageArray, nsnull);
|
||||
rv = srcFolder->DeleteMessages(messageArray, nsnull, PR_TRUE);
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
nsCopyMessageStreamListener::nsCopyMessageStreamListener(nsIMsgFolder *srcFolder,
|
||||
nsICopyMessageListener *destination,
|
||||
nsISupports *listenerData)
|
||||
nsCopyMessageStreamListener::nsCopyMessageStreamListener()
|
||||
{
|
||||
/* the following macro is used to initialize the ref counting data */
|
||||
NS_INIT_REFCNT();
|
||||
|
||||
mSrcFolder = dont_QueryInterface(srcFolder);
|
||||
mDestination = dont_QueryInterface(destination);
|
||||
mListenerData = dont_QueryInterface(listenerData);
|
||||
}
|
||||
|
||||
nsCopyMessageStreamListener::~nsCopyMessageStreamListener()
|
||||
|
@ -118,6 +146,14 @@ nsCopyMessageStreamListener::~nsCopyMessageStreamListener()
|
|||
//All member variables are nsCOMPtr's.
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsCopyMessageStreamListener::Init(nsIMsgFolder *srcFolder, nsICopyMessageListener *destination, nsISupports *listenerData)
|
||||
{
|
||||
mSrcFolder = dont_QueryInterface(srcFolder);
|
||||
mDestination = dont_QueryInterface(destination);
|
||||
mListenerData = dont_QueryInterface(listenerData);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsCopyMessageStreamListener::GetBindInfo(nsIURL* aURL, nsStreamBindingInfo* aInfo)
|
||||
{
|
||||
return NS_OK;
|
||||
|
|
|
@ -19,20 +19,23 @@
|
|||
#ifndef NSCOPYMESSAGESTREAMLISTENER_H
|
||||
#define NSCOPYMESSAGESTREAMLISTENER_H
|
||||
|
||||
#include "nsICopyMessageStreamListener.h"
|
||||
#include "nsIStreamListener.h"
|
||||
#include "nsIMsgFolder.h"
|
||||
#include "nsICopyMessageListener.h"
|
||||
#include "nsCOMPtr.h"
|
||||
|
||||
class nsCopyMessageStreamListener : public nsIStreamListener {
|
||||
class nsCopyMessageStreamListener : public nsIStreamListener, public nsICopyMessageStreamListener {
|
||||
|
||||
public:
|
||||
nsCopyMessageStreamListener(nsIMsgFolder *srcFolder, nsICopyMessageListener *destination,
|
||||
nsISupports *listenerData);
|
||||
nsCopyMessageStreamListener();
|
||||
virtual ~nsCopyMessageStreamListener();
|
||||
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
//nsICopyMessageStreamListener
|
||||
NS_IMETHOD Init(nsIMsgFolder *srcFolder, nsICopyMessageListener *destination, nsISupports *listenerData);
|
||||
|
||||
//nsIStreamListener implementation
|
||||
NS_IMETHOD GetBindInfo(nsIURL* aURL, nsStreamBindingInfo* aInfo);
|
||||
NS_IMETHOD OnDataAvailable(nsIURL* aURL, nsIInputStream *aIStream,
|
||||
|
@ -52,4 +55,11 @@ protected:
|
|||
|
||||
};
|
||||
|
||||
NS_BEGIN_EXTERN_C
|
||||
|
||||
nsresult
|
||||
NS_NewCopyMessageStreamListener(const nsIID& iid, void **result);
|
||||
|
||||
NS_END_EXTERN_C
|
||||
|
||||
#endif
|
||||
|
|
|
@ -56,7 +56,7 @@
|
|||
#include "nsMsgRDFUtils.h"
|
||||
|
||||
#include "nsINetService.h"
|
||||
#include "nsCopyMessageStreamListener.h"
|
||||
#include "nsICopyMessageStreamListener.h"
|
||||
#include "nsICopyMessageListener.h"
|
||||
|
||||
#include "nsIMessageView.h"
|
||||
|
@ -82,6 +82,7 @@ static NS_DEFINE_IID(kAppShellServiceCID, NS_APPSHELL_SERVICE_CID);
|
|||
static NS_DEFINE_CID(kTransactionManagerCID, NS_TRANSACTIONMANAGER_CID);
|
||||
static NS_DEFINE_CID(kComponentManagerCID, NS_COMPONENTMANAGER_CID);
|
||||
static NS_DEFINE_CID(kMsgSendLaterCID, NS_MSGSENDLATER_CID);
|
||||
static NS_DEFINE_CID(kCopyMessageStreamListenerCID, NS_COPYMESSAGESTREAMLISTENER_CID);
|
||||
|
||||
// we need this because of an egcs 1.0 (and possibly gcc) compiler bug
|
||||
// that doesn't allow you to call ::nsISupports::GetIID() inside of a class
|
||||
|
@ -555,24 +556,29 @@ nsMessenger::CopyMessages(nsIDOMXULElement *srcFolderElement, nsIDOMXULElement *
|
|||
if(!srcFolderElement || !dstFolderElement || !nodeList)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
|
||||
nsIRDFResource *srcResource, *dstResource;
|
||||
nsICopyMessageListener *dstFolder;
|
||||
nsIMsgFolder *srcFolder;
|
||||
nsISupportsArray *resourceArray;
|
||||
nsCOMPtr<nsIRDFResource> srcResource, dstResource;
|
||||
nsCOMPtr<nsICopyMessageListener> dstFolder;
|
||||
nsCOMPtr<nsIMsgFolder> srcFolder;
|
||||
nsCOMPtr<nsISupportsArray> resourceArray;
|
||||
|
||||
if(NS_FAILED(rv = dstFolderElement->GetResource(&dstResource)))
|
||||
rv = dstFolderElement->GetResource(getter_AddRefs(dstResource));
|
||||
if(NS_FAILED(rv))
|
||||
return rv;
|
||||
|
||||
if(NS_FAILED(rv = dstResource->QueryInterface(nsICopyMessageListener::GetIID(), (void**)&dstFolder)))
|
||||
dstFolder = do_QueryInterface(dstResource);
|
||||
if(!dstFolder)
|
||||
return NS_ERROR_NO_INTERFACE;
|
||||
|
||||
rv = srcFolderElement->GetResource(getter_AddRefs(srcResource));
|
||||
if(NS_FAILED(rv))
|
||||
return rv;
|
||||
|
||||
if(NS_FAILED(rv = srcFolderElement->GetResource(&srcResource)))
|
||||
return rv;
|
||||
srcFolder = do_QueryInterface(srcResource);
|
||||
if(!srcFolder)
|
||||
return NS_ERROR_NO_INTERFACE;
|
||||
|
||||
if(NS_FAILED(rv = srcResource->QueryInterface(nsIMsgFolder::GetIID(), (void**)&srcFolder)))
|
||||
return rv;
|
||||
|
||||
if(NS_FAILED(rv =ConvertDOMListToResourceArray(nodeList, &resourceArray)))
|
||||
rv =ConvertDOMListToResourceArray(nodeList, getter_AddRefs(resourceArray));
|
||||
if(NS_FAILED(rv))
|
||||
return rv;
|
||||
|
||||
//Call the mailbox service to copy first message. In the future we should call CopyMessages.
|
||||
|
@ -583,28 +589,35 @@ nsMessenger::CopyMessages(nsIDOMXULElement *srcFolderElement, nsIDOMXULElement *
|
|||
rv = resourceArray->Count(&cnt);
|
||||
if (NS_SUCCEEDED(rv) && cnt > 0)
|
||||
{
|
||||
nsIRDFResource * firstMessage = (nsIRDFResource*)resourceArray->ElementAt(0);
|
||||
nsCOMPtr<nsISupports> msgSupports = getter_AddRefs(resourceArray->ElementAt(0));
|
||||
nsCOMPtr<nsIRDFResource> firstMessage(do_QueryInterface(msgSupports));
|
||||
char *uri;
|
||||
firstMessage->GetValue(&uri);
|
||||
nsCopyMessageStreamListener* copyStreamListener = new nsCopyMessageStreamListener(srcFolder, dstFolder, nsnull);
|
||||
nsCOMPtr<nsICopyMessageStreamListener> copyStreamListener;
|
||||
rv = nsComponentManager::CreateInstance(kCopyMessageStreamListenerCID, NULL,
|
||||
nsICopyMessageStreamListener::GetIID(),
|
||||
getter_AddRefs(copyStreamListener));
|
||||
if(NS_FAILED(rv))
|
||||
return rv;
|
||||
|
||||
rv = copyStreamListener->Init(srcFolder, dstFolder, nsnull);
|
||||
if(NS_FAILED(rv))
|
||||
return rv;
|
||||
nsIMsgMessageService * messageService = nsnull;
|
||||
rv = GetMessageServiceFromURI(uri, &messageService);
|
||||
|
||||
if (NS_SUCCEEDED(rv) && messageService)
|
||||
{
|
||||
nsIURL * url = nsnull;
|
||||
messageService->CopyMessage(uri, copyStreamListener, isMove, nsnull, &url);
|
||||
nsCOMPtr<nsIStreamListener> streamListener(do_QueryInterface(copyStreamListener));
|
||||
if(!streamListener)
|
||||
return NS_ERROR_NO_INTERFACE;
|
||||
messageService->CopyMessage(uri, streamListener, isMove, nsnull, &url);
|
||||
ReleaseMessageServiceFromURI(uri, messageService);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
NS_RELEASE(srcResource);
|
||||
NS_RELEASE(srcFolder);
|
||||
NS_RELEASE(dstResource);
|
||||
NS_RELEASE(dstFolder);
|
||||
NS_RELEASE(resourceArray);
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
|
|
@ -802,7 +802,8 @@ nsMsgFolderDataSource::createFolderMessageNode(nsIMsgFolder *folder,
|
|||
nsCOMPtr<nsIEnumerator> messages;
|
||||
nsresult rv = folder->GetMessages(getter_AddRefs(messages));
|
||||
if (NS_SUCCEEDED(rv) && rv != NS_RDF_CURSOR_EMPTY) {
|
||||
if (NS_SUCCEEDED(messages->First())) {
|
||||
rv = messages->First();
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
nsCOMPtr<nsISupports> firstMessage;
|
||||
rv = messages->CurrentItem(getter_AddRefs(firstMessage));
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
|
@ -847,7 +848,7 @@ nsresult nsMsgFolderDataSource::DoDeleteFromFolder(
|
|||
rv = messageArray->Count(&cnt);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
if (cnt > 0)
|
||||
rv = folder->DeleteMessages(messageArray, txnMgr);
|
||||
rv = folder->DeleteMessages(messageArray, txnMgr, PR_FALSE);
|
||||
|
||||
rv = folderArray->Count(&cnt);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
|
Загрузка…
Ссылка в новой задаче