diff --git a/mozilla/mailnews/imap/src/nsImapMailFolder.cpp b/mozilla/mailnews/imap/src/nsImapMailFolder.cpp new file mode 100644 index 00000000000..bd7dd556bab --- /dev/null +++ b/mozilla/mailnews/imap/src/nsImapMailFolder.cpp @@ -0,0 +1,661 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998, 1999 Netscape Communications Corporation. All Rights + * Reserved. + */ + +#include "msgCore.h" +#include "nsImapMailFolder.h" +#include "nsIEnumerator.h" +#include "nsIFolderListener.h" +#include "nsCOMPtr.h" +#include "nsIRDFService.h" +#include "nsIRDFDataSource.h" +#include "nsRDFCID.h" +#include "nsFileStream.h" +#include "nsMsgDBCID.h" +#include "nsMsgFolderFlags.h" + +// 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 +// that multiply inherits from nsISupports +static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); +static NS_DEFINE_CID(kRDFServiceCID, NS_RDFSERVICE_CID); +static NS_DEFINE_CID(kCMailDB, NS_MAILDB_CID); +//////////////////////////////////////////////////////////////////////////////// + +nsImapMailFolder::nsImapMailFolder() : + nsMsgFolder(), mPathName(""), mMailDatabase(nsnull), + mInitialized(PR_FALSE), mHaveReadNameFromDB(PR_FALSE) +{ + //XXXX This is a hack for the moment. I'm assuming the only listener is our rdf:mailnews datasource. + //In reality anyone should be able to listen to folder changes. + + nsIRDFService* rdfService = nsnull; + nsIRDFDataSource* datasource = nsnull; + + nsresult rv = nsServiceManager::GetService(kRDFServiceCID, + nsIRDFService::GetIID(), + (nsISupports**) &rdfService); + if(NS_SUCCEEDED(rv)) + { + if(NS_SUCCEEDED(rv = rdfService->GetDataSource("rdf:mailnewsfolders", &datasource))) + { + nsIFolderListener *folderListener; + if(NS_SUCCEEDED(datasource->QueryInterface(nsIFolderListener::GetIID(), (void**)&folderListener))) + { + AddFolderListener(folderListener); + NS_RELEASE(folderListener); + } + NS_RELEASE(datasource); + } + nsServiceManager::ReleaseService(kRDFServiceCID, rdfService); + } + +// NS_INIT_REFCNT(); done by superclass +} + +nsImapMailFolder::~nsImapMailFolder() +{ + if (mMailDatabase) + mMailDatabase->Close(PR_TRUE); +} + +NS_IMPL_ADDREF_INHERITED(nsImapMailFolder, nsMsgFolder) +NS_IMPL_RELEASE_INHERITED(nsImapMailFolder, nsMsgFolder) + +NS_IMETHODIMP nsImapMailFolder::QueryInterface(REFNSIID aIID, void** aInstancePtr) +{ + if (!aInstancePtr) return NS_ERROR_NULL_POINTER; + *aInstancePtr = nsnull; + if (aIID.Equals(nsIMsgImapMailFolder::GetIID())) + { + *aInstancePtr = NS_STATIC_CAST(nsIMsgImapMailFolder*, this); + } + else if (aIID.Equals(nsIDBChangeListener::GetIID())) + { + *aInstancePtr = NS_STATIC_CAST(nsIDBChangeListener*, this); + } + else if(aIID.Equals(nsICopyMessageListener::GetIID())) + { + *aInstancePtr = NS_STATIC_CAST(nsICopyMessageListener*, this); + } + else if (aIID.Equals(nsIImapMailFolderSink::GetIID())) + { + *aInstancePtr = NS_STATIC_CAST(nsIImapMailFolderSink*, this); + } + + if(*aInstancePtr) + { + AddRef(); + return NS_OK; + } + + return nsMsgFolder::QueryInterface(aIID, aInstancePtr); +} + +NS_IMETHODIMP nsImapMailFolder::GetPathName(nsNativeFileSpec& aPathName) +{ + nsFileSpec nopath(""); + if (mPathName == nopath) + { + nsresult rv = nsURI2Path(kMailboxRootURI, mURI, mPathName); + if (NS_FAILED(rv)) return rv; + } + aPathName = mPathName; + return NS_OK; +} + +NS_IMETHODIMP nsImapMailFolder::Enumerate(nsIEnumerator* *result) +{ + nsresult rv = NS_OK; + nsIEnumerator* folders; + nsIEnumerator* messages; + rv = GetSubFolders(&folders); + if (NS_FAILED(rv)) return rv; + rv = GetMessages(&messages); + if (NS_FAILED(rv)) return rv; + return NS_NewConjoiningEnumerator(folders, messages, + (nsIBidirectionalEnumerator**)result); +} + +nsresult nsImapMailFolder::AddDirectorySeparator(nsFileSpec &path) +{ + nsresult rv = NS_OK; + if (nsCRT::strcmp(mURI, kImapRootURI) == 0) { + // don't concat the full separator with .sbd + } + else { + nsAutoString sep; + rv = nsGetMailFolderSeparator(sep); + if (NS_FAILED(rv)) return rv; + + // see if there's a dir with the same name ending with .sbd + // unfortunately we can't just say: + // path += sep; + // here because of the way nsFileSpec concatenates + nsAutoString str((nsFilePath)path); + str += sep; + path = nsFilePath(str); + } + + return rv; +} + +static PRBool +nsShouldIgnoreFile(nsString& name) +{ + PRInt32 len = name.Length(); + if (len > 4 && name.RFind(".msf", PR_TRUE) == len -4) + { + name.SetLength(len-4); // truncate the string + return PR_FALSE; + } + return PR_TRUE; +} + +nsresult nsImapMailFolder::AddSubfolder(nsAutoString name, + nsIMsgFolder **child) +{ + if(!child) + return NS_ERROR_NULL_POINTER; + + nsresult rv = NS_OK; + nsIRDFService* rdf; + rv = nsServiceManager::GetService(kRDFServiceCID, + nsIRDFService::GetIID(), + (nsISupports**)&rdf); + + if(NS_FAILED(rv)) + return rv; + + nsAutoString uri; + uri.Append(mURI); + uri.Append('/'); + + uri.Append(name); + char* uriStr = uri.ToNewCString(); + if (uriStr == nsnull) + return NS_ERROR_OUT_OF_MEMORY; + + nsIRDFResource* res; + rv = rdf->GetResource(uriStr, &res); + if (NS_FAILED(rv)) + return rv; + nsCOMPtr folder(do_QueryInterface(res, &rv)); + if (NS_FAILED(rv)) + return rv; + delete[] uriStr; + folder->SetFlag(MSG_FOLDER_FLAG_MAIL); + + if(name == "Inbox") + folder->SetFlag(MSG_FOLDER_FLAG_INBOX); + else if(name == "Trash") + folder->SetFlag(MSG_FOLDER_FLAG_TRASH); + + mSubFolders->AppendElement(folder); + *child = folder; + NS_ADDREF(*child); + (void)nsServiceManager::ReleaseService(kRDFServiceCID, rdf); + + return rv; +} + +nsresult nsImapMailFolder::CreateSubFolders(nsFileSpec &path) +{ + nsresult rv = NS_OK; + nsAutoString currentFolderNameStr; + nsIMsgFolder *child; + char *folderName; + for (nsDirectoryIterator dir(path); dir.Exists(); dir++) { + nsFileSpec currentFolderPath = (nsFileSpec&)dir; + + folderName = currentFolderPath.GetLeafName(); + currentFolderNameStr = folderName; + if (nsShouldIgnoreFile(currentFolderNameStr)) + { + PL_strfree(folderName); + continue; + } + + AddSubfolder(currentFolderNameStr, &child); + NS_IF_RELEASE(child); + PL_strfree(folderName); + } + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::GetSubFolders(nsIEnumerator* *result) +{ + if (!mInitialized) + { + nsresult rv = NS_OK; + nsFileSpec path; + rv = GetPathName(path); + if (NS_FAILED(rv)) return rv; + + rv = AddDirectorySeparator(path); + if(NS_FAILED(rv)) return rv; + + // we have to treat the root folder specially, because it's name + // doesn't end with .sbd + + PRInt32 newFlags = MSG_FOLDER_FLAG_MAIL; + if (path.IsDirectory()) { + newFlags |= (MSG_FOLDER_FLAG_DIRECTORY | MSG_FOLDER_FLAG_ELIDED); + SetFlag(newFlags); + rv = CreateSubFolders(path); + if (mSubFolders->Count() == 0) + { + nsAutoString inboxString = "Inbox"; + nsIMsgFolder *child = nsnull; + AddSubfolder(inboxString, &child); + NS_IF_RELEASE (child); + } + } + else + { + UpdateSummaryTotals(); + // Look for a directory for this mail folder, and recurse into it. + // e.g. if the folder is "inbox", look for "inbox.sbd". +#if 0 + char *folderName = path->GetLeafName(); + char *newLeafName = (char*)malloc(PL_strlen(folderName) + + PL_strlen(kDirExt) + 2); + PL_strcpy(newLeafName, folderName); + PL_strcat(newLeafName, kDirExt); + path->SetLeafName(newLeafName); + if(folderName) + delete[] folderName; + if(newLeafName) + delete[] newLeafName; +#endif + } + + if (NS_FAILED(rv)) return rv; + mInitialized = PR_TRUE; // XXX do this on failure too? + } + return mSubFolders->Enumerate(result); +} + +NS_IMETHODIMP nsImapMailFolder::AddUnique(nsISupports* element) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::ReplaceElement(nsISupports* element, + nsISupports* newElement) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::GetMessages(nsIEnumerator* *result) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::GetThreads(nsIEnumerator** threadEnumerator) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::GetThreadForMessage(nsIMessage *message, + nsIMsgThread **thread) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::CreateSubfolder(const char *folderName) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::RemoveSubFolder (nsIMsgFolder *which) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::Delete () +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::Rename (const char *newName) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::GetChildNamed(nsString& name, nsISupports ** + aChild) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::GetName(char ** name) +{ + if(!name) + return NS_ERROR_NULL_POINTER; + + if (!mHaveReadNameFromDB) + { + if (mDepth == 1) + { + SetName("Imap Host Name"); + mHaveReadNameFromDB = TRUE; + *name = mName.ToNewCString(); + return NS_OK; + } + else + { + //Need to read the name from the database + } + } + nsAutoString folderName; + nsURI2Name(kMailboxRootURI, mURI, folderName); + *name = folderName.ToNewCString(); + + return NS_OK; +} + +NS_IMETHODIMP nsImapMailFolder::GetPrettyName(nsString& prettyName) +{ + if (mDepth == 1) { + // Depth == 1 means we are on the mail server level + // override the name here to say "Imap Host Name" + prettyName = PL_strdup("Imap Host Name"); + } + else { + nsresult rv = NS_ERROR_NULL_POINTER; + char *pName = prettyName.ToNewCString(); + if (pName) + rv = nsMsgFolder::GetPrettyName(&pName); + delete[] pName; + return rv; + } + + return NS_OK; +} + +NS_IMETHODIMP nsImapMailFolder::BuildFolderURL(char **url) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::UpdateSummaryTotals() +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::GetExpungedBytesCount(PRUint32 *count) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::GetDeletable (PRBool *deletable) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::GetCanCreateChildren (PRBool + *canCreateChildren) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::GetCanBeRenamed (PRBool *canBeRenamed) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::GetRequiresCleanup(PRBool *requiresCleanup) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + + +NS_IMETHODIMP nsImapMailFolder::GetSizeOnDisk(PRUint32 size) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::GetUsersName(char** userName) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::GetHostName(char** hostName) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::UserNeedsToAuthenticateForFolder(PRBool + displayOnly, + PRBool + *authenticate) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::RememberPassword(char *password) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::GetRememberedPassword(char ** password) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + + +NS_IMETHODIMP nsImapMailFolder::Adopt(nsIMsgFolder *srcFolder, + PRUint32 *outPos) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +nsresult nsImapMailFolder::GetDBFolderInfoAndDB( + nsIDBFolderInfo **folderInfo, nsIMsgDatabase **db) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::DeleteMessage(nsIMessage* message) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::PossibleImapMailbox( + nsIImapProtocol* aProtocol, mailbox_spec* aSpec) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::MailboxDiscoveryDone( + nsIImapProtocol* aProtocol) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::UpdateImapMailboxInfo( + nsIImapProtocol* aProtocol, mailbox_spec* aSpec) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::UpdateImapMailboxStatus( + nsIImapProtocol* aProtocol, mailbox_spec* aSpec) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::ChildDiscoverySucceeded( + nsIImapProtocol* aProtocol) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::OnlineFolderDelete( + nsIImapProtocol* aProtocol, const char* folderName) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::OnlineFolderCreateFailed( + nsIImapProtocol* aProtocol, const char* folderName) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::OnlineFolderRename( + nsIImapProtocol* aProtocol, folder_rename_struct* aStruct) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::SubscribeUpgradeFinished( + nsIImapProtocol* aProtocol, EIMAPSubscriptionUpgradeState* aState) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::PromptUserForSubscribeUpdatePath( + nsIImapProtocol* aProtocol, PRBool* aBool) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::FolderIsNoSelect(nsIImapProtocol* aProtocol, + FolderQueryInfo* aInfo) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::SetupHeaderParseStream( + nsIImapProtocol* aProtocol, StreamInfo* aStreamInfo) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::ParseAdoptedHeaderLine( + nsIImapProtocol* aProtocol, msg_line_info* aMsgLineInfo) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::NormalEndHeaderParseStream(nsIImapProtocol* + aProtocol) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::AbortHeaderParseStream(nsIImapProtocol* + aProtocol) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::OnKeyChange(nsMsgKey aKeyChanged, + int32 aFlags, + nsIDBChangeListener * aInstigator) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::OnKeyDeleted(nsMsgKey aKeyChanged, + int32 aFlags, + nsIDBChangeListener * aInstigator) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::OnKeyAdded(nsMsgKey aKeyChanged, + int32 aFlags, + nsIDBChangeListener * aInstigator) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::OnAnnouncerGoingAway(nsIDBChangeAnnouncer * + instigator) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::BeginCopy(nsIMessage *message) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::CopyData(nsIInputStream *aIStream, + PRInt32 aLength) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + +NS_IMETHODIMP nsImapMailFolder::EndCopy(PRBool copySucceeded) +{ + nsresult rv = NS_ERROR_FAILURE; + return rv; +} + + + diff --git a/mozilla/mailnews/imap/src/nsImapMailFolder.h b/mozilla/mailnews/imap/src/nsImapMailFolder.h new file mode 100644 index 00000000000..2edb94c5c7d --- /dev/null +++ b/mozilla/mailnews/imap/src/nsImapMailFolder.h @@ -0,0 +1,157 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998, 1999 Netscape Communications Corporation. All Rights + * Reserved. + */ +#ifndef nsImapMailFolder_h__ +#define nsImapMailFolder_h__ + +#include "nsImapCore.h" +#include "nsMsgFolder.h" +#include "nsIImapMailfolderSink.h" +#include "nsIDBChangeListener.h" +#include "nsICopyMessageListener.h" + +/* fa32d000-f6a0-11d2-af8d-001083002da8 */ +#define NS_IMAPRESOURCE_CID \ +{ 0xfa32d000, 0xf6a0, 0x11d2, \ + { 0xaf, 0x8d, 0x00, 0x10, 0x83, 0x00, 0x2d, 0xa8 } } + +class nsImapMailFolder : public nsMsgFolder, + public nsIMsgImapMailFolder, + public nsIImapMailFolderSink, + public nsIDBChangeListener, + public nsICopyMessageListener +{ +public: + nsImapMailFolder(); + virtual ~nsImapMailFolder(); + + NS_DECL_ISUPPORTS_INHERITED + // nsIMsgImapMailFolder methods + NS_IMETHOD GetPathName(nsNativeFileSpec& aPathName); + + // nsICollection methods: + NS_IMETHOD Enumerate(nsIEnumerator* *result); + + // nsIFolder methods: + NS_IMETHOD GetSubFolders(nsIEnumerator* *result); + + // nsIMsgFolder methods: + NS_IMETHOD AddUnique(nsISupports* element); + NS_IMETHOD ReplaceElement(nsISupports* element, nsISupports* newElement); + NS_IMETHOD GetMessages(nsIEnumerator* *result); + NS_IMETHOD GetThreads(nsIEnumerator** threadEnumerator); + NS_IMETHOD GetThreadForMessage(nsIMessage *message, nsIMsgThread **thread); + + + NS_IMETHOD CreateSubfolder(const char *folderName); + + NS_IMETHOD RemoveSubFolder (nsIMsgFolder *which); + NS_IMETHOD Delete (); + NS_IMETHOD Rename (const char *newName); + NS_IMETHOD Adopt(nsIMsgFolder *srcFolder, PRUint32 *outPos); + + NS_IMETHOD GetChildNamed(nsString& name, nsISupports ** aChild); + + // this override pulls the value from the db + NS_IMETHOD GetName(char ** name); // Name of this folder (as presented to user). + NS_IMETHOD GetPrettyName(nsString& prettyName); // Override of the base, for top-level mail folder + + NS_IMETHOD BuildFolderURL(char **url); + + NS_IMETHOD UpdateSummaryTotals() ; + + NS_IMETHOD GetExpungedBytesCount(PRUint32 *count); + NS_IMETHOD GetDeletable (PRBool *deletable); + NS_IMETHOD GetCanCreateChildren (PRBool *canCreateChildren) ; + NS_IMETHOD GetCanBeRenamed (PRBool *canBeRenamed); + NS_IMETHOD GetRequiresCleanup(PRBool *requiresCleanup); + + NS_IMETHOD GetSizeOnDisk(PRUint32 size); + + NS_IMETHOD GetUsersName(char** userName); + NS_IMETHOD GetHostName(char** hostName); + NS_IMETHOD UserNeedsToAuthenticateForFolder(PRBool displayOnly, PRBool *authenticate); + NS_IMETHOD RememberPassword(char *password); + NS_IMETHOD GetRememberedPassword(char ** password); + + virtual nsresult GetDBFolderInfoAndDB(nsIDBFolderInfo **folderInfo, + nsIMsgDatabase **db); + NS_IMETHOD DeleteMessage(nsIMessage *message); + + // nsIImapMailFolderSink methods + // Tell mail master about a discovered imap mailbox + NS_IMETHOD PossibleImapMailbox(nsIImapProtocol* aProtocol, + mailbox_spec* aSpec); + NS_IMETHOD MailboxDiscoveryDone(nsIImapProtocol* aProtocol); + // Tell mail master about the newly selected mailbox + NS_IMETHOD UpdateImapMailboxInfo(nsIImapProtocol* aProtocol, + mailbox_spec* aSpec); + NS_IMETHOD UpdateImapMailboxStatus(nsIImapProtocol* aProtocol, + mailbox_spec* aSpec); + NS_IMETHOD ChildDiscoverySucceeded(nsIImapProtocol* aProtocol); + NS_IMETHOD OnlineFolderDelete(nsIImapProtocol* aProtocol, + const char* folderName); + NS_IMETHOD OnlineFolderCreateFailed(nsIImapProtocol* aProtocol, + const char* folderName); + NS_IMETHOD OnlineFolderRename(nsIImapProtocol* aProtocol, + folder_rename_struct* aStruct); + NS_IMETHOD SubscribeUpgradeFinished(nsIImapProtocol* aProtocol, + EIMAPSubscriptionUpgradeState* aState); + NS_IMETHOD PromptUserForSubscribeUpdatePath(nsIImapProtocol* aProtocol, + PRBool* aBool); + NS_IMETHOD FolderIsNoSelect(nsIImapProtocol* aProtocol, + FolderQueryInfo* aInfo); + + NS_IMETHOD SetupHeaderParseStream(nsIImapProtocol* aProtocol, + StreamInfo* aStreamInfo); + + NS_IMETHOD ParseAdoptedHeaderLine(nsIImapProtocol* aProtocol, + msg_line_info* aMsgLineInfo); + + NS_IMETHOD NormalEndHeaderParseStream(nsIImapProtocol* aProtocol); + + NS_IMETHOD AbortHeaderParseStream(nsIImapProtocol* aProtocol); + + //nsIDBChangeListener + NS_IMETHOD OnKeyChange(nsMsgKey aKeyChanged, int32 aFlags, + nsIDBChangeListener * aInstigator); + NS_IMETHOD OnKeyDeleted(nsMsgKey aKeyChanged, int32 aFlags, + nsIDBChangeListener * aInstigator); + NS_IMETHOD OnKeyAdded(nsMsgKey aKeyChanged, int32 aFlags, + nsIDBChangeListener * aInstigator); + NS_IMETHOD OnAnnouncerGoingAway(nsIDBChangeAnnouncer * instigator); + + //nsICopyMessageListener + NS_IMETHOD BeginCopy(nsIMessage *message); + NS_IMETHOD CopyData(nsIInputStream *aIStream, PRInt32 aLength); + NS_IMETHOD EndCopy(PRBool copySucceeded); + +protected: + // Helper methods + nsresult AddDirectorySeparator(nsFileSpec &path); + nsresult CreateSubFolders(nsFileSpec &path); + //Creates a subfolder with the name 'name' and adds it to the list of + //children. Returns the child as well. + nsresult AddSubfolder(nsAutoString name, nsIMsgFolder **child); + + nsNativeFileSpec mPathName; + nsIMsgDatabase* mMailDatabase; + PRBool mInitialized; + PRBool mHaveReadNameFromDB; +}; + +#endif