nsCopyMessageStreamListener can be created from the factory, and deleting a message

doesn't deleteStorage.
This commit is contained in:
putterman%netscape.com 1999-06-14 22:22:19 +00:00
Родитель d42d4bf36f
Коммит 2538964415
7 изменённых файлов: 102 добавлений и 39 удалений

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

@ -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;