This commit is contained in:
putterman%netscape.com 1999-05-10 21:47:59 +00:00
Родитель baf9ba08bc
Коммит a9e70b268a
6 изменённых файлов: 71 добавлений и 481 удалений

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

@ -67,7 +67,7 @@ static NS_DEFINE_CID(kMsgMailSessionCID, NS_MSGMAILSESSION_CID);
#endif
nsImapMailFolder::nsImapMailFolder() :
nsMsgFolder(), m_pathName(""),
m_pathName(""),
m_initialized(PR_FALSE), m_haveReadNameFromDB(PR_FALSE),
m_msgParser(nsnull), m_curMsgUid(0), m_nextMessageByteLength(0),
m_urlRunning(PR_FALSE), m_haveDiscoverAllFolders(PR_FALSE)
@ -102,12 +102,10 @@ nsImapMailFolder::nsImapMailFolder() :
nsImapMailFolder::~nsImapMailFolder()
{
if (m_mailDatabase)
m_mailDatabase->Close(PR_TRUE);
}
NS_IMPL_ADDREF_INHERITED(nsImapMailFolder, nsMsgFolder)
NS_IMPL_RELEASE_INHERITED(nsImapMailFolder, nsMsgFolder)
NS_IMPL_ADDREF_INHERITED(nsImapMailFolder, nsMsgDBFolder)
NS_IMPL_RELEASE_INHERITED(nsImapMailFolder, nsMsgDBFolder)
NS_IMETHODIMP nsImapMailFolder::QueryInterface(REFNSIID aIID, void** aInstancePtr)
{
@ -118,18 +116,10 @@ NS_IMETHODIMP nsImapMailFolder::QueryInterface(REFNSIID aIID, void** aInstancePt
{
*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(nsIFolder::GetIID()))
{
*aInstancePtr = NS_STATIC_CAST(nsIFolder*, this);
}
else if (aIID.Equals(nsIImapMailFolderSink::GetIID()))
{
*aInstancePtr = NS_STATIC_CAST(nsIImapMailFolderSink*, this);
@ -321,7 +311,7 @@ NS_IMETHODIMP nsImapMailFolder::GetSubFolders(nsIEnumerator* *result)
if (NS_SUCCEEDED(GetDatabase()))
{
nsCOMPtr <nsIDBFolderInfo> dbFolderInfo ;
m_mailDatabase->GetDBFolderInfo(getter_AddRefs(dbFolderInfo));
mDatabase->GetDBFolderInfo(getter_AddRefs(dbFolderInfo));
if (dbFolderInfo)
dbFolderInfo->SetMailboxName(name);
@ -377,7 +367,7 @@ NS_IMETHODIMP nsImapMailFolder::ReplaceElement(nsISupports* element,
nsresult nsImapMailFolder::GetDatabase()
{
nsresult folderOpen = NS_OK;
if (m_mailDatabase == nsnull)
if (!mDatabase)
{
nsNativeFileSpec path;
nsresult rv = GetPathName(path);
@ -388,14 +378,14 @@ nsresult nsImapMailFolder::GetDatabase()
rv = nsComponentManager::CreateInstance(kCImapDB, nsnull, nsIMsgDatabase::GetIID(), (void **) &mailDBFactory);
if (NS_SUCCEEDED(rv) && mailDBFactory)
{
folderOpen = mailDBFactory->Open(path, PR_TRUE, (nsIMsgDatabase **) &m_mailDatabase, PR_TRUE);
folderOpen = mailDBFactory->Open(path, PR_TRUE, getter_AddRefs(mDatabase), PR_TRUE);
NS_RELEASE(mailDBFactory);
}
if(m_mailDatabase)
if(mDatabase)
{
m_mailDatabase->AddListener(this);
mDatabase->AddListener(this);
// if we have to regenerate the folder, run the parser url.
if(folderOpen == NS_MSG_ERROR_FOLDER_SUMMARY_MISSING || folderOpen == NS_MSG_ERROR_FOLDER_SUMMARY_OUT_OF_DATE)
@ -504,7 +494,7 @@ NS_IMETHODIMP nsImapMailFolder::GetMessages(nsIEnumerator* *result)
{
nsIEnumerator *msgHdrEnumerator = nsnull;
nsMessageFromMsgHdrEnumerator *messageEnumerator = nsnull;
rv = m_mailDatabase->EnumerateMessages(&msgHdrEnumerator);
rv = mDatabase->EnumerateMessages(&msgHdrEnumerator);
if(NS_SUCCEEDED(rv))
rv = NS_NewMessageFromMsgHdrEnumerator(msgHdrEnumerator,
this,
@ -521,44 +511,6 @@ NS_IMETHODIMP nsImapMailFolder::GetMessages(nsIEnumerator* *result)
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;
}
//This needs to be moved up into common base class.
NS_IMETHODIMP
nsImapMailFolder::HasMessage(nsIMessage *message, PRBool *hasMessage)
{
if(!hasMessage)
return NS_ERROR_NULL_POINTER;
nsresult rv = GetDatabase();
if(NS_SUCCEEDED(rv))
{
nsCOMPtr<nsIMsgDBHdr> msgDBHdr, msgDBHdrForKey;
nsCOMPtr<nsIDBMessage> dbMessage(do_QueryInterface(message, &rv));
nsMsgKey key;
if(NS_SUCCEEDED(rv))
rv = dbMessage->GetMsgDBHdr(getter_AddRefs(msgDBHdr));
if(NS_SUCCEEDED(rv))
rv = msgDBHdr->GetMessageKey(&key);
if(NS_SUCCEEDED(rv))
rv = m_mailDatabase->ContainsKey(key, hasMessage);
}
return rv;
}
NS_IMETHODIMP nsImapMailFolder::CreateSubfolder(const char *folderName)
{
@ -675,12 +627,12 @@ NS_IMETHODIMP nsImapMailFolder::GetName(char ** name)
{
//Need to read the name from the database
result = GetDatabase();
if (NS_SUCCEEDED(result) && m_mailDatabase)
if (NS_SUCCEEDED(result) && mDatabase)
{
nsString folderName;
nsIDBFolderInfo *dbFolderInfo = nsnull;
m_mailDatabase->GetDBFolderInfo(&dbFolderInfo);
mDatabase->GetDBFolderInfo(&dbFolderInfo);
if (dbFolderInfo)
{
dbFolderInfo->GetMailboxName(folderName);
@ -1018,17 +970,17 @@ NS_IMETHODIMP nsImapMailFolder::UpdateImapMailboxInfo(
(void **) getter_AddRefs(mailDBFactory));
if (NS_FAILED(rv)) return rv;
if (!m_mailDatabase)
if (!mDatabase)
{
// if we pass in PR_TRUE for upgrading, the db code will ignore the
// summary out of date problem for now.
rv = mailDBFactory->Open(dbName, PR_TRUE, (nsIMsgDatabase **)
getter_AddRefs(m_mailDatabase), PR_TRUE);
getter_AddRefs(mDatabase), PR_TRUE);
if (NS_FAILED(rv))
return rv;
if (!m_mailDatabase)
if (!mDatabase)
return NS_ERROR_NULL_POINTER;
m_mailDatabase->AddListener(this);
mDatabase->AddListener(this);
}
if (aSpec->folderSelected)
{
@ -1038,12 +990,12 @@ NS_IMETHODIMP nsImapMailFolder::UpdateImapMailboxInfo(
nsCOMPtr<nsIDBFolderInfo> dbFolderInfo;
PRInt32 imapUIDValidity = 0;
rv = m_mailDatabase->GetDBFolderInfo(getter_AddRefs(dbFolderInfo));
rv = mDatabase->GetDBFolderInfo(getter_AddRefs(dbFolderInfo));
if (NS_SUCCEEDED(rv) && dbFolderInfo)
dbFolderInfo->GetImapUidValidity(&imapUIDValidity);
m_mailDatabase->ListAllKeys(existingKeys);
if (m_mailDatabase->ListAllOfflineDeletes(&existingKeys) > 0)
mDatabase->ListAllKeys(existingKeys);
if (mDatabase->ListAllOfflineDeletes(&existingKeys) > 0)
existingKeys.QuickSort();
if ((imapUIDValidity != aSpec->folder_UIDVALIDITY) /* && // if UIDVALIDITY Changed
!NET_IsOffline() */)
@ -1053,8 +1005,8 @@ NS_IMETHODIMP nsImapMailFolder::UpdateImapMailboxInfo(
TNeoFolderInfoTransfer *originalInfo = NULL;
originalInfo = new TNeoFolderInfoTransfer(dbFolderInfo);
#endif // 0
m_mailDatabase->ForceClosed();
m_mailDatabase = null_nsCOMPtr();
mDatabase->ForceClosed();
mDatabase = null_nsCOMPtr();
nsLocalFolderSummarySpec summarySpec(dbName);
// Remove summary file.
@ -1062,30 +1014,30 @@ NS_IMETHODIMP nsImapMailFolder::UpdateImapMailboxInfo(
// Create a new summary file, update the folder message counts, and
// Close the summary file db.
rv = mailDBFactory->Open(dbName, PR_TRUE, getter_AddRefs(m_mailDatabase), PR_FALSE);
rv = mailDBFactory->Open(dbName, PR_TRUE, getter_AddRefs(mDatabase), PR_FALSE);
// ********** Important *************
// David, help me here I don't know this is right or wrong
if (rv == NS_MSG_ERROR_FOLDER_SUMMARY_MISSING)
rv = NS_OK;
if (NS_FAILED(rv) && m_mailDatabase)
if (NS_FAILED(rv) && mDatabase)
{
m_mailDatabase->ForceClosed();
m_mailDatabase = null_nsCOMPtr();
mDatabase->ForceClosed();
mDatabase = null_nsCOMPtr();
}
else if (NS_SUCCEEDED(rv) && m_mailDatabase)
else if (NS_SUCCEEDED(rv) && mDatabase)
{
#if TRANSFER_INFO
if (originalInfo)
{
originalInfo->TransferFolderInfo(*m_mailDatabase->m_dbFolderInfo);
originalInfo->TransferFolderInfo(mDatabase->m_dbFolderInfo);
delete originalInfo;
}
SummaryChanged();
m_mailDatabase->AddListener(this);
mDatabase->AddListener(this);
#endif
rv = m_mailDatabase->GetDBFolderInfo(getter_AddRefs(dbFolderInfo));
rv = mDatabase->GetDBFolderInfo(getter_AddRefs(dbFolderInfo));
}
// store the new UIDVALIDITY value
@ -1121,7 +1073,7 @@ NS_IMETHODIMP nsImapMailFolder::UpdateImapMailboxInfo(
PRUint32 total;
// It would be nice to notify RDF or whoever of a mass delete here.
m_mailDatabase->DeleteMessages(&keysToDelete,NULL);
mDatabase->DeleteMessages(&keysToDelete,NULL);
total = keysToDelete.GetSize();
}
if (keysToFetch.GetSize())
@ -1213,14 +1165,14 @@ NS_IMETHODIMP nsImapMailFolder::SetupHeaderParseStream(
{
nsresult rv = NS_ERROR_FAILURE;
if (!m_mailDatabase)
if (!mDatabase)
GetDatabase();
m_nextMessageByteLength = aStreamInfo->size;
if (!m_msgParser)
{
m_msgParser = new nsParseMailMessageState;
m_msgParser->SetMailDB(m_mailDatabase);
m_msgParser->SetMailDB(mDatabase);
}
else
m_msgParser->Clear();
@ -1277,10 +1229,10 @@ NS_IMETHODIMP nsImapMailFolder::NormalEndHeaderParseStream(nsIImapProtocol*
m_msgParser->m_newMsgHdr->SetMessageKey(m_curMsgUid);
TweakHeaderFlags(aProtocol, m_msgParser->m_newMsgHdr);
// here we need to tweak flags from uid state..
m_mailDatabase->AddNewHdrToDB(m_msgParser->m_newMsgHdr, PR_TRUE);
mDatabase->AddNewHdrToDB(m_msgParser->m_newMsgHdr, PR_TRUE);
m_msgParser->FinishHeader();
if (m_mailDatabase)
m_mailDatabase->Commit(kLargeCommit); // don't really want to do this
if (mDatabase)
mDatabase->Commit(kLargeCommit); // don't really want to do this
// for every message...
// but I can't find the event that
// means we've finished getting
@ -1334,75 +1286,6 @@ NS_IMETHODIMP nsImapMailFolder::CreateMessageFromMsgDBHdr(nsIMsgDBHdr *msgDBHdr,
}
NS_IMETHODIMP nsImapMailFolder::OnKeyChange(nsMsgKey aKeyChanged,
PRInt32 aFlags,
nsIDBChangeListener * aInstigator)
{
nsresult rv = NS_ERROR_FAILURE;
return rv;
}
NS_IMETHODIMP nsImapMailFolder::OnKeyDeleted(nsMsgKey aKeyChanged,
PRInt32 aFlags,
nsIDBChangeListener * aInstigator)
{
nsCOMPtr<nsIMsgDBHdr> pMsgDBHdr;
nsresult rv = m_mailDatabase->GetMsgHdrForKey(aKeyChanged, getter_AddRefs(pMsgDBHdr));
if(NS_SUCCEEDED(rv))
{
nsCOMPtr<nsIMessage> message;
rv = CreateMessageFromMsgDBHdr(pMsgDBHdr, getter_AddRefs(message));
if(NS_SUCCEEDED(rv))
{
nsCOMPtr<nsISupports> msgSupports = do_QueryInterface(message);
if(msgSupports)
{
PRUint32 i;
for(i = 0; i < mListeners->Count(); i++)
{
nsIFolderListener *listener = (nsIFolderListener*)mListeners->ElementAt(i);
listener->OnItemRemoved(this, msgSupports);
}
}
UpdateSummaryTotals();
}
}
return NS_OK;
}
NS_IMETHODIMP nsImapMailFolder::OnKeyAdded(nsMsgKey aKeyChanged,
PRInt32 aFlags,
nsIDBChangeListener * aInstigator)
{
nsresult rv;
nsCOMPtr<nsIMsgDBHdr> pMsgDBHdr;
rv = m_mailDatabase->GetMsgHdrForKey(aKeyChanged, getter_AddRefs(pMsgDBHdr));
if(NS_SUCCEEDED(rv) && pMsgDBHdr)
{
nsCOMPtr<nsIMessage> message;
rv = CreateMessageFromMsgDBHdr(pMsgDBHdr, getter_AddRefs(message));
if(NS_SUCCEEDED(rv))
{
nsCOMPtr<nsISupports> msgSupports = do_QueryInterface(message);
if(msgSupports)
NotifyItemAdded(msgSupports);
UpdateSummaryTotals();
}
}
return NS_OK;}
NS_IMETHODIMP nsImapMailFolder::OnAnnouncerGoingAway(nsIDBChangeAnnouncer *
instigator)
{
if (m_mailDatabase)
{
m_mailDatabase->RemoveListener(this);
m_mailDatabase = null_nsCOMPtr();
}
return NS_OK;
}
NS_IMETHODIMP nsImapMailFolder::BeginCopy(nsIMessage *message)
{
nsresult rv = NS_ERROR_FAILURE;
@ -1551,7 +1434,7 @@ void nsImapMailFolder::PrepareToAddHeadersToMailDB(nsIImapProtocol* aProtocol, c
void nsImapMailFolder::TweakHeaderFlags(nsIImapProtocol* aProtocol, nsIMsgDBHdr *tweakMe)
{
if (m_mailDatabase && aProtocol && tweakMe)
if (mDatabase && aProtocol && tweakMe)
{
tweakMe->SetMessageKey(m_curMsgUid);
tweakMe->SetMessageSize(m_nextMessageByteLength);
@ -1700,11 +1583,11 @@ nsImapMailFolder::NotifyMessageFlags(nsIImapProtocol* aProtocol,
{
nsMsgKey msgKey = aKeyStruct->key;
imapMessageFlagsType flags = aKeyStruct->flags;
if (NS_SUCCEEDED(GetDatabase()) && m_mailDatabase)
if (NS_SUCCEEDED(GetDatabase()) && mDatabase)
{
m_mailDatabase->MarkRead(msgKey, (flags & kImapMsgSeenFlag) != 0, nsnull);
m_mailDatabase->MarkReplied(msgKey, (flags & kImapMsgAnsweredFlag) != 0, nsnull);
m_mailDatabase->MarkMarked(msgKey, (flags & kImapMsgFlaggedFlag) != 0, nsnull);
mDatabase->MarkRead(msgKey, (flags & kImapMsgSeenFlag) != 0, nsnull);
mDatabase->MarkReplied(msgKey, (flags & kImapMsgAnsweredFlag) != 0, nsnull);
mDatabase->MarkMarked(msgKey, (flags & kImapMsgFlaggedFlag) != 0, nsnull);
}
return NS_OK;
}
@ -1758,16 +1641,16 @@ nsImapMailFolder::NotifyMessageDeleted(nsIImapProtocol* aProtocol,
if (affectedMessages.GetSize() > 0) // perhaps Search deleted these messages
{
GetDatabase();
if (m_mailDatabase)
m_mailDatabase->DeleteMessages(&affectedMessages, nsnull);
if (mDatabase)
mDatabase->DeleteMessages(&affectedMessages, nsnull);
}
}
else if (doomedKeyString) // && !imapDeleteIsMoveToTrash
{
GetDatabase();
if (m_mailDatabase)
SetIMAPDeletedFlag(m_mailDatabase, affectedMessages, nsnull);
if (mDatabase)
SetIMAPDeletedFlag(mDatabase, affectedMessages, nsnull);
}
PR_FREEIF(keyTokenString);
return NS_OK;
@ -1827,13 +1710,13 @@ nsImapMailFolder::GetMessageSizeFromDB(nsIImapProtocol* aProtocol,
MessageSizeInfo* sizeInfo)
{
nsresult rv = NS_ERROR_FAILURE;
if (sizeInfo && sizeInfo->id && m_mailDatabase)
if (sizeInfo && sizeInfo->id && mDatabase)
{
PRUint32 key = atoi(sizeInfo->id);
nsCOMPtr<nsIMsgDBHdr> mailHdr;
NS_ASSERTION(sizeInfo->idIsUid, "ids must be uids to get message size");
if (sizeInfo->idIsUid)
rv = m_mailDatabase->GetMsgHdrForKey(key, getter_AddRefs(mailHdr));
rv = mDatabase->GetMsgHdrForKey(key, getter_AddRefs(mailHdr));
if (NS_SUCCEEDED(rv) && mailHdr)
rv = mailHdr->GetMessageSize(&sizeInfo->size);
}

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

@ -19,12 +19,11 @@
#define nsImapMailFolder_h__
#include "nsImapCore.h"
#include "nsMsgFolder.h"
#include "nsMsgDBFolder.h"
#include "nsIImapMailFolderSink.h"
#include "nsIImapMessageSink.h"
#include "nsIImapExtensionSink.h"
#include "nsIImapMiscellaneousSink.h"
#include "nsIDBChangeListener.h"
#include "nsICopyMessageListener.h"
#include "nsIImapService.h"
#include "nsIUrlListener.h"
@ -36,13 +35,12 @@
class nsParseMailMessageState;
class nsImapMailFolder : public nsMsgFolder,
class nsImapMailFolder : public nsMsgDBFolder,
public nsIMsgImapMailFolder,
public nsIImapMailFolderSink,
public nsIImapMessageSink,
public nsIImapExtensionSink,
public nsIImapMiscellaneousSink,
public nsIDBChangeListener,
public nsICopyMessageListener,
public nsIUrlListener
{
@ -64,10 +62,6 @@ public:
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 HasMessage(nsIMessage *message, PRBool *hasMessage);
NS_IMETHOD CreateSubfolder(const char *folderName);
@ -166,15 +160,6 @@ public:
NS_IMETHOD GetMessageSizeFromDB(nsIImapProtocol* aProtocol,
MessageSizeInfo* sizeInfo);
//nsIDBChangeListener
NS_IMETHOD OnKeyChange(nsMsgKey aKeyChanged, PRInt32 aFlags,
nsIDBChangeListener * aInstigator);
NS_IMETHOD OnKeyDeleted(nsMsgKey aKeyChanged, PRInt32 aFlags,
nsIDBChangeListener * aInstigator);
NS_IMETHOD OnKeyAdded(nsMsgKey aKeyChanged, PRInt32 aFlags,
nsIDBChangeListener * aInstigator);
NS_IMETHOD OnAnnouncerGoingAway(nsIDBChangeAnnouncer * instigator);
//nsICopyMessageListener
NS_IMETHOD BeginCopy(nsIMessage *message);
NS_IMETHOD CopyData(nsIInputStream *aIStream, PRInt32 aLength);
@ -269,7 +254,6 @@ protected:
nsresult GetDatabase();
nsNativeFileSpec m_pathName;
nsCOMPtr<nsIMsgDatabase> m_mailDatabase;
PRBool m_initialized;
PRBool m_haveDiscoverAllFolders;
PRBool m_haveReadNameFromDB;

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

@ -59,9 +59,9 @@ static NS_DEFINE_CID(kCPop3ServiceCID, NS_POP3SERVICE_CID);
////////////////////////////////////////////////////////////////////////////////
nsMsgLocalMailFolder::nsMsgLocalMailFolder(void)
: nsMsgFolder(), mExpungedBytes(0),
: mExpungedBytes(0),
mHaveReadNameFromDB(PR_FALSE), mGettingMail(PR_FALSE),
mInitialized(PR_FALSE), mMailDatabase(nsnull)
mInitialized(PR_FALSE)
{
mPath = nsnull;
// NS_INIT_REFCNT(); done by superclass
@ -69,9 +69,6 @@ nsMsgLocalMailFolder::nsMsgLocalMailFolder(void)
nsMsgLocalMailFolder::~nsMsgLocalMailFolder(void)
{
if(mMailDatabase)
//Close releases db;
mMailDatabase->Close(PR_TRUE);
if (mPath)
delete mPath;
}
@ -87,10 +84,6 @@ NS_IMETHODIMP nsMsgLocalMailFolder::QueryInterface(REFNSIID aIID, void** aInstan
{
*aInstancePtr = NS_STATIC_CAST(nsIMsgLocalMailFolder*, 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);
@ -341,7 +334,7 @@ nsMsgLocalMailFolder::ReplaceElement(nsISupports* element, nsISupports* newEleme
//returns NS_OK. Otherwise returns a failure error value.
nsresult nsMsgLocalMailFolder::GetDatabase()
{
if (mMailDatabase == nsnull)
if (!mDatabase)
{
nsNativeFileSpec path;
nsresult rv = GetPath(path);
@ -353,12 +346,12 @@ nsresult nsMsgLocalMailFolder::GetDatabase()
rv = nsComponentManager::CreateInstance(kCMailDB, nsnull, nsIMsgDatabase::GetIID(), getter_AddRefs(mailDBFactory));
if (NS_SUCCEEDED(rv) && mailDBFactory)
{
folderOpen = mailDBFactory->Open(path, PR_TRUE, (nsIMsgDatabase **) &mMailDatabase, PR_FALSE);
folderOpen = mailDBFactory->Open(path, PR_TRUE, getter_AddRefs(mDatabase), PR_FALSE);
if(!NS_SUCCEEDED(folderOpen) &&
folderOpen == NS_MSG_ERROR_FOLDER_SUMMARY_OUT_OF_DATE || folderOpen == NS_MSG_ERROR_FOLDER_SUMMARY_MISSING )
{
// if it's out of date then reopen with upgrade.
if(!NS_SUCCEEDED(rv = mailDBFactory->Open(path, PR_TRUE, &mMailDatabase, PR_TRUE)))
if(!NS_SUCCEEDED(rv = mailDBFactory->Open(path, PR_TRUE, getter_AddRefs(mDatabase), PR_TRUE)))
{
return rv;
}
@ -366,10 +359,10 @@ nsresult nsMsgLocalMailFolder::GetDatabase()
}
if(mMailDatabase)
if(mDatabase)
{
mMailDatabase->AddListener(this);
mDatabase->AddListener(this);
// if we have to regenerate the folder, run the parser url.
if(folderOpen == NS_MSG_ERROR_FOLDER_SUMMARY_MISSING || folderOpen == NS_MSG_ERROR_FOLDER_SUMMARY_OUT_OF_DATE)
@ -398,7 +391,7 @@ nsMsgLocalMailFolder::GetMessages(nsIEnumerator* *result)
{
nsCOMPtr<nsIEnumerator> msgHdrEnumerator;
nsMessageFromMsgHdrEnumerator *messageEnumerator = nsnull;
rv = mMailDatabase->EnumerateMessages(getter_AddRefs(msgHdrEnumerator));
rv = mDatabase->EnumerateMessages(getter_AddRefs(msgHdrEnumerator));
if(NS_SUCCEEDED(rv))
rv = NS_NewMessageFromMsgHdrEnumerator(msgHdrEnumerator,
this, &messageEnumerator);
@ -407,59 +400,7 @@ nsMsgLocalMailFolder::GetMessages(nsIEnumerator* *result)
return rv;
}
NS_IMETHODIMP nsMsgLocalMailFolder::GetThreads(nsIEnumerator** threadEnumerator)
{
nsresult rv = GetDatabase();
if(NS_SUCCEEDED(rv))
return mMailDatabase->EnumerateThreads(threadEnumerator);
else
return rv;
}
NS_IMETHODIMP
nsMsgLocalMailFolder::GetThreadForMessage(nsIMessage *message, nsIMsgThread **thread)
{
nsresult rv = GetDatabase();
if(NS_SUCCEEDED(rv))
{
nsCOMPtr<nsIMsgDBHdr> msgDBHdr;
nsCOMPtr<nsIDBMessage> dbMessage(do_QueryInterface(message, &rv));
if(NS_SUCCEEDED(rv))
rv = dbMessage->GetMsgDBHdr(getter_AddRefs(msgDBHdr));
if(NS_SUCCEEDED(rv))
{
rv = mMailDatabase->GetThreadContainingMsgHdr(msgDBHdr, thread);
}
}
return rv;
}
NS_IMETHODIMP
nsMsgLocalMailFolder::HasMessage(nsIMessage *message, PRBool *hasMessage)
{
if(!hasMessage)
return NS_ERROR_NULL_POINTER;
nsresult rv = GetDatabase();
if(NS_SUCCEEDED(rv))
{
nsCOMPtr<nsIMsgDBHdr> msgDBHdr, msgDBHdrForKey;
nsCOMPtr<nsIDBMessage> dbMessage(do_QueryInterface(message, &rv));
nsMsgKey key;
if(NS_SUCCEEDED(rv))
rv = dbMessage->GetMsgDBHdr(getter_AddRefs(msgDBHdr));
if(NS_SUCCEEDED(rv))
rv = msgDBHdr->GetMessageKey(&key);
if(NS_SUCCEEDED(rv))
rv = mMailDatabase->ContainsKey(key, hasMessage);
}
return rv;
}
NS_IMETHODIMP nsMsgLocalMailFolder::BuildFolderURL(char **url)
{
@ -1111,7 +1052,7 @@ NS_IMETHODIMP nsMsgLocalMailFolder::DeleteMessage(nsIMessage *message)
rv = dbMessage->GetMsgDBHdr(getter_AddRefs(msgDBHdr));
if(NS_SUCCEEDED(rv))
{
rv =mMailDatabase->DeleteHeader(msgDBHdr, nsnull, PR_TRUE, PR_TRUE);
rv =mDatabase->DeleteHeader(msgDBHdr, nsnull, PR_TRUE, PR_TRUE);
}
}
}
@ -1183,62 +1124,6 @@ NS_IMETHODIMP nsMsgLocalMailFolder::GetNewMessages()
return rv;
}
NS_IMETHODIMP nsMsgLocalMailFolder::OnKeyChange(nsMsgKey aKeyChanged, PRInt32 aFlags,
nsIDBChangeListener * aInstigator)
{
return NS_OK;
}
NS_IMETHODIMP nsMsgLocalMailFolder::OnKeyDeleted(nsMsgKey aKeyChanged, PRInt32 aFlags,
nsIDBChangeListener * aInstigator)
{
nsCOMPtr<nsIMsgDBHdr> pMsgDBHdr;
nsresult rv = mMailDatabase->GetMsgHdrForKey(aKeyChanged, getter_AddRefs(pMsgDBHdr));
if(NS_SUCCEEDED(rv))
{
nsCOMPtr<nsIMessage> message;
rv = CreateMessageFromMsgDBHdr(pMsgDBHdr, getter_AddRefs(message));
if(NS_SUCCEEDED(rv))
{
nsCOMPtr<nsISupports> msgSupports(do_QueryInterface(message, &rv));
if(NS_SUCCEEDED(rv))
{
NotifyItemDeleted(msgSupports);
}
UpdateSummaryTotals();
}
}
return NS_OK;
}
NS_IMETHODIMP nsMsgLocalMailFolder::OnKeyAdded(nsMsgKey aKeyChanged, PRInt32 aFlags,
nsIDBChangeListener * aInstigator)
{
nsresult rv;
nsCOMPtr<nsIMsgDBHdr> msgDBHdr;
rv = mMailDatabase->GetMsgHdrForKey(aKeyChanged, getter_AddRefs(msgDBHdr));
if(NS_SUCCEEDED(rv))
{
nsCOMPtr<nsIMessage> message;
rv = CreateMessageFromMsgDBHdr(msgDBHdr, getter_AddRefs(message));
if(NS_SUCCEEDED(rv))
{
nsCOMPtr<nsISupports> msgSupports;
if(message && NS_SUCCEEDED(message->QueryInterface(kISupportsIID, getter_AddRefs(msgSupports))))
{
NotifyItemAdded(msgSupports);
}
UpdateSummaryTotals();
}
}
return NS_OK;
}
NS_IMETHODIMP nsMsgLocalMailFolder::OnAnnouncerGoingAway(nsIDBChangeAnnouncer * instigator)
{
return NS_OK;
}
//nsICopyMessageListener
NS_IMETHODIMP nsMsgLocalMailFolder::BeginCopy(nsIMessage *message)
@ -1310,7 +1195,7 @@ NS_IMETHODIMP nsMsgLocalMailFolder::EndCopy(PRBool copySucceeded)
rv = dbMessage->GetMsgDBHdr(getter_AddRefs(msgDBHdr));
if(NS_SUCCEEDED(rv))
rv = mMailDatabase->CopyHdrFromExistingHdr(mCopyState->dstKey, msgDBHdr, getter_AddRefs(newHdr));
rv = mDatabase->CopyHdrFromExistingHdr(mCopyState->dstKey, msgDBHdr, getter_AddRefs(newHdr));
}
if(mCopyState->fileStream)

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

@ -25,9 +25,8 @@
#ifndef nsMsgLocalMailFolder_h__
#define nsMsgLocalMailFolder_h__
#include "nsMsgFolder.h" /* include the interface we are going to support */
#include "nsMsgDBFolder.h" /* include the interface we are going to support */
#include "nsFileSpec.h"
#include "nsIDBChangeListener.h"
#include "nsICopyMessageListener.h"
#include "nsFileStream.h"
@ -37,9 +36,8 @@ typedef struct {
nsMsgKey dstKey;
} nsLocalMailCopyState;
class nsMsgLocalMailFolder : public nsMsgFolder,
class nsMsgLocalMailFolder : public nsMsgDBFolder,
public nsIMsgLocalMailFolder,
public nsIDBChangeListener,
public nsICopyMessageListener
{
public:
@ -63,9 +61,6 @@ public:
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 HasMessage(nsIMessage *message, PRBool *hasMessage);
NS_IMETHOD CreateSubfolder(const char *folderName);
@ -108,15 +103,6 @@ public:
// nsIMsgMailFolder
NS_IMETHOD GetPath(nsNativeFileSpec& aPathName);
//nsIDBChangeListener
NS_IMETHOD OnKeyChange(nsMsgKey aKeyChanged, PRInt32 aFlags,
nsIDBChangeListener * aInstigator);
NS_IMETHOD OnKeyDeleted(nsMsgKey aKeyChanged, PRInt32 aFlags,
nsIDBChangeListener * aInstigator);
NS_IMETHOD OnKeyAdded(nsMsgKey aKeyChanged, PRInt32 aFlags,
nsIDBChangeListener * aInstigator);
NS_IMETHOD OnAnnouncerGoingAway(nsIDBChangeAnnouncer * instigator);
//nsICopyMessageListener
NS_IMETHOD BeginCopy(nsIMessage *message);
NS_IMETHOD CopyData(nsIInputStream *aIStream, PRInt32 aLength);
@ -146,7 +132,6 @@ protected:
PRBool mHaveReadNameFromDB;
PRBool mGettingMail;
PRBool mInitialized;
nsIMsgDatabase* mMailDatabase; //Not an nsCOMPtr because we want to close it not release it
nsLocalMailCopyState *mCopyState; //We will only allow one of these at a time
};

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

@ -67,9 +67,9 @@ static NS_DEFINE_CID(kMsgMailSessionCID, NS_MSGMAILSESSION_CID);
////////////////////////////////////////////////////////////////////////////////
nsMsgNewsFolder::nsMsgNewsFolder(void)
: nsMsgFolder(), mExpungedBytes(0),
: mExpungedBytes(0),
mHaveReadNameFromDB(PR_FALSE), mGettingNews(PR_FALSE),
mInitialized(PR_FALSE), mNewsDatabase(nsnull), m_optionLines(nsnull)
mInitialized(PR_FALSE), m_optionLines(nsnull)
{
mPath = nsnull;
// NS_INIT_REFCNT(); done by superclass
@ -77,18 +77,14 @@ nsMsgNewsFolder::nsMsgNewsFolder(void)
nsMsgNewsFolder::~nsMsgNewsFolder(void)
{
if(mNewsDatabase)
//Close releases db;
mNewsDatabase->Close(PR_TRUE);
if (mPath)
delete mPath;
PR_FREEIF(m_optionLines);
}
NS_IMPL_ADDREF_INHERITED(nsMsgNewsFolder, nsMsgFolder)
NS_IMPL_RELEASE_INHERITED(nsMsgNewsFolder, nsMsgFolder)
NS_IMPL_ADDREF_INHERITED(nsMsgNewsFolder, nsMsgDBFolder)
NS_IMPL_RELEASE_INHERITED(nsMsgNewsFolder, nsMsgDBFolder)
NS_IMETHODIMP nsMsgNewsFolder::QueryInterface(REFNSIID aIID, void** aInstancePtr)
{
@ -98,10 +94,6 @@ NS_IMETHODIMP nsMsgNewsFolder::QueryInterface(REFNSIID aIID, void** aInstancePtr
{
*aInstancePtr = NS_STATIC_CAST(nsIMsgNewsFolder*, this);
}
else if (aIID.Equals(nsIDBChangeListener::GetIID()))
{
*aInstancePtr = NS_STATIC_CAST(nsIDBChangeListener*, this);
}
if(*aInstancePtr)
{
@ -498,7 +490,7 @@ nsMsgNewsFolder::ReplaceElement(nsISupports* element, nsISupports* newElement)
//returns NS_OK. Otherwise returns a failure error value.
nsresult nsMsgNewsFolder::GetDatabase()
{
if (mNewsDatabase == nsnull)
if (mDatabase == nsnull)
{
nsNativeFileSpec path;
nsresult rv = GetPath(path);
@ -510,7 +502,7 @@ nsresult nsMsgNewsFolder::GetDatabase()
rv = nsComponentManager::CreateInstance(kCNewsDB, nsnull, nsIMsgDatabase::GetIID(), (void **) &newsDBFactory);
if (NS_SUCCEEDED(rv) && newsDBFactory)
{
folderOpen = newsDBFactory->Open(path, PR_TRUE, (nsIMsgDatabase **) &mNewsDatabase, PR_FALSE);
folderOpen = newsDBFactory->Open(path, PR_TRUE, getter_AddRefs(mDatabase), PR_FALSE);
#ifdef DEBUG_NOISY_NEWS
if (NS_SUCCEEDED(folderOpen)) {
printf ("newsDBFactory->Open() succeeded\n");
@ -523,10 +515,10 @@ nsresult nsMsgNewsFolder::GetDatabase()
NS_RELEASE(newsDBFactory);
}
if(mNewsDatabase)
if(mDatabase)
{
mNewsDatabase->AddListener(this);
mDatabase->AddListener(this);
UpdateSummaryTotals();
}
@ -543,7 +535,7 @@ nsMsgNewsFolder::GetMessages(nsIEnumerator* *result)
{
nsIEnumerator *msgHdrEnumerator = nsnull;
nsMessageFromMsgHdrEnumerator *messageEnumerator = nsnull;
rv = mNewsDatabase->EnumerateMessages(&msgHdrEnumerator);
rv = mDatabase->EnumerateMessages(&msgHdrEnumerator);
if(NS_SUCCEEDED(rv))
rv = NS_NewMessageFromMsgHdrEnumerator(msgHdrEnumerator,
this, &messageEnumerator);
@ -553,62 +545,6 @@ nsMsgNewsFolder::GetMessages(nsIEnumerator* *result)
return rv;
}
NS_IMETHODIMP nsMsgNewsFolder::GetThreads(nsIEnumerator** threadEnumerator)
{
nsresult rv = GetDatabase();
if(NS_SUCCEEDED(rv))
return mNewsDatabase->EnumerateThreads(threadEnumerator);
else
return rv;
}
NS_IMETHODIMP
nsMsgNewsFolder::GetThreadForMessage(nsIMessage *message, nsIMsgThread **thread)
{
nsresult rv = GetDatabase();
if(NS_SUCCEEDED(rv))
{
nsIMsgDBHdr *msgDBHdr = nsnull;
//We know from our factory that news message resources are going to be
//nsNewsMessages.
nsNewsMessage *newsMessage = NS_STATIC_CAST(nsNewsMessage*, message);
rv = newsMessage->GetMsgDBHdr(&msgDBHdr);
if(NS_SUCCEEDED(rv))
{
rv = mNewsDatabase->GetThreadContainingMsgHdr(msgDBHdr, thread);
NS_IF_RELEASE(msgDBHdr);
}
}
return rv;
}
//This needs to be moved up into common base class.
NS_IMETHODIMP
nsMsgNewsFolder::HasMessage(nsIMessage *message, PRBool *hasMessage)
{
if(!hasMessage)
return NS_ERROR_NULL_POINTER;
nsresult rv = GetDatabase();
if(NS_SUCCEEDED(rv))
{
nsCOMPtr<nsIMsgDBHdr> msgDBHdr, msgDBHdrForKey;
nsCOMPtr<nsIDBMessage> dbMessage(do_QueryInterface(message, &rv));
nsMsgKey key;
if(NS_SUCCEEDED(rv))
rv = dbMessage->GetMsgDBHdr(getter_AddRefs(msgDBHdr));
if(NS_SUCCEEDED(rv))
rv = msgDBHdr->GetMessageKey(&key);
if(NS_SUCCEEDED(rv))
rv = mNewsDatabase->ContainsKey(key, hasMessage);
}
return rv;
}
NS_IMETHODIMP nsMsgNewsFolder::BuildFolderURL(char **url)
{
@ -1056,7 +992,7 @@ NS_IMETHODIMP nsMsgNewsFolder::DeleteMessage(nsIMessage *message)
rv = newsMessage->GetMsgDBHdr(&msgDBHdr);
if(NS_SUCCEEDED(rv))
{
rv =mNewsDatabase->DeleteHeader(msgDBHdr, nsnull, PR_TRUE, PR_TRUE);
rv =mDatabase->DeleteHeader(msgDBHdr, nsnull, PR_TRUE, PR_TRUE);
NS_IF_RELEASE(msgDBHdr);
}
}
@ -1139,74 +1075,6 @@ NS_IMETHODIMP nsMsgNewsFolder::CreateMessageFromMsgDBHdr(nsIMsgDBHdr *msgDBHdr,
return rv;
}
NS_IMETHODIMP nsMsgNewsFolder::OnKeyChange(nsMsgKey aKeyChanged, PRInt32 aFlags,
nsIDBChangeListener * aInstigator)
{
return NS_OK;
}
NS_IMETHODIMP nsMsgNewsFolder::OnKeyDeleted(nsMsgKey aKeyChanged, PRInt32 aFlags,
nsIDBChangeListener * aInstigator)
{
nsIMsgDBHdr *pMsgDBHdr;
nsresult rv = mNewsDatabase->GetMsgHdrForKey(aKeyChanged, &pMsgDBHdr);
if(NS_SUCCEEDED(rv))
{
nsIMessage *message = nsnull;
rv = CreateMessageFromMsgDBHdr(pMsgDBHdr, &message);
if(NS_SUCCEEDED(rv))
{
nsISupports *msgSupports;
if(NS_SUCCEEDED(message->QueryInterface(kISupportsIID, (void**)&msgSupports)))
{
PRUint32 i;
for(i = 0; i < mListeners->Count(); i++)
{
nsIFolderListener *listener = (nsIFolderListener*)mListeners->ElementAt(i);
listener->OnItemRemoved(this, msgSupports);
}
NS_IF_RELEASE(msgSupports);
}
NS_IF_RELEASE(message);
UpdateSummaryTotals();
}
NS_IF_RELEASE(pMsgDBHdr);
}
return NS_OK;
}
NS_IMETHODIMP nsMsgNewsFolder::OnKeyAdded(nsMsgKey aKeyChanged, PRInt32 aFlags,
nsIDBChangeListener * aInstigator)
{
nsIMsgDBHdr *pMsgDBHdr;
nsresult rv = mNewsDatabase->GetMsgHdrForKey(aKeyChanged, &pMsgDBHdr);
if(NS_SUCCEEDED(rv))
{
nsIMessage *message;
rv = CreateMessageFromMsgDBHdr(pMsgDBHdr, &message);
if(NS_SUCCEEDED(rv))
{
nsISupports *msgSupports;
if(message && NS_SUCCEEDED(message->QueryInterface(kISupportsIID, (void**)&msgSupports)))
{
NotifyItemAdded(msgSupports);
NS_IF_RELEASE(msgSupports);
}
UpdateSummaryTotals();
NS_IF_RELEASE(message);
}
NS_IF_RELEASE(pMsgDBHdr);
}
return NS_OK;
return NS_OK;
}
NS_IMETHODIMP nsMsgNewsFolder::OnAnnouncerGoingAway(nsIDBChangeAnnouncer * instigator)
{
return NS_OK;
}
/* sspitzer: from mozilla/network/protocol/pop3/mkpop3.c */

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

@ -25,9 +25,8 @@
#ifndef nsMsgNewsFolder_h__
#define nsMsgNewsFolder_h__
#include "nsMsgFolder.h" /* include the interface we are going to support */
#include "nsMsgDBFolder.h"
#include "nsFileSpec.h"
#include "nsIDBChangeListener.h"
#include "nsFileStream.h"
/*
@ -52,7 +51,7 @@
#endif /* ! XP_UNIX */
class nsMsgNewsFolder : public nsMsgFolder, public nsIMsgNewsFolder, public nsIDBChangeListener
class nsMsgNewsFolder : public nsMsgDBFolder, public nsIMsgNewsFolder
{
public:
nsMsgNewsFolder(void);
@ -72,10 +71,6 @@ public:
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 HasMessage(nsIMessage *message, PRBool *hasMessage);
NS_IMETHOD CreateSubfolder(const char *folderName);
@ -117,15 +112,6 @@ public:
// nsIMsgNewsFolder
NS_IMETHOD GetPath(nsNativeFileSpec& aPathName);
//nsIDBChangeListener
NS_IMETHOD OnKeyChange(nsMsgKey aKeyChanged, PRInt32 aFlags,
nsIDBChangeListener * aInstigator);
NS_IMETHOD OnKeyDeleted(nsMsgKey aKeyChanged, PRInt32 aFlags,
nsIDBChangeListener * aInstigator);
NS_IMETHOD OnKeyAdded(nsMsgKey aKeyChanged, PRInt32 aFlags,
nsIDBChangeListener * aInstigator);
NS_IMETHOD OnAnnouncerGoingAway(nsIDBChangeAnnouncer * instigator);
protected:
nsresult ParseFolder(nsFileSpec& path);
nsresult CreateSubFolders(nsFileSpec &path);
@ -159,7 +145,6 @@ protected:
PRBool mGettingNews;
PRBool mInitialized;
nsISupportsArray *mMessages;
nsIMsgDatabase* mNewsDatabase;
char *m_optionLines;
};