From 1a2a4e1779a3844fd7b8059de7c66e7afcdc4e80 Mon Sep 17 00:00:00 2001 From: "putterman%netscape.com" Date: Mon, 10 May 1999 21:47:07 +0000 Subject: [PATCH] Separate db related folder code into separate class. git-svn-id: svn://10.0.0.236/trunk@30980 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/mailnews/base/util/MANIFEST | 1 + mozilla/mailnews/base/util/Makefile.in | 2 + mozilla/mailnews/base/util/makefile.win | 3 + mozilla/mailnews/base/util/nsMsgDBFolder.cpp | 213 +++++++++++++++++++ mozilla/mailnews/base/util/nsMsgDBFolder.h | 66 ++++++ mozilla/mailnews/base/util/nsMsgFolder.cpp | 43 ---- mozilla/mailnews/base/util/nsMsgFolder.h | 3 - 7 files changed, 285 insertions(+), 46 deletions(-) create mode 100644 mozilla/mailnews/base/util/nsMsgDBFolder.cpp create mode 100644 mozilla/mailnews/base/util/nsMsgDBFolder.h diff --git a/mozilla/mailnews/base/util/MANIFEST b/mozilla/mailnews/base/util/MANIFEST index eb5eb89512d..6552d7fe740 100644 --- a/mozilla/mailnews/base/util/MANIFEST +++ b/mozilla/mailnews/base/util/MANIFEST @@ -21,6 +21,7 @@ nsMsgGroupRecord.h nsUInt32Array.h nsNewsSet.h nsMsgFolder.h +nsMsgDBFolder.h nsLocalFolderSummarySpec.h nsMsgIdentity.h nsMsgIncomingServer.h diff --git a/mozilla/mailnews/base/util/Makefile.in b/mozilla/mailnews/base/util/Makefile.in index 48778ce2acc..a199f5d2257 100644 --- a/mozilla/mailnews/base/util/Makefile.in +++ b/mozilla/mailnews/base/util/Makefile.in @@ -31,6 +31,7 @@ EXPORTS = \ nsUInt32Array.h \ nsNewsSet.h \ nsMsgFolder.h \ + nsMsgDBFolder.h \ nsLocalFolderSummarySpec.h \ nsNewsSummarySpec.h \ nsMsgIdentity.h \ @@ -43,6 +44,7 @@ CPPSRCS = \ nsMsgGroupRecord.cpp \ nsMsgLineBuffer.cpp \ nsMsgFolder.cpp \ + nsMsgDBFolder.cpp \ nsUInt32Array.cpp \ nsNewsSet.cpp \ nsLocalFolderSummarySpec.cpp \ diff --git a/mozilla/mailnews/base/util/makefile.win b/mozilla/mailnews/base/util/makefile.win index f7aa6935f13..40985b5faa0 100644 --- a/mozilla/mailnews/base/util/makefile.win +++ b/mozilla/mailnews/base/util/makefile.win @@ -32,6 +32,7 @@ CPPSRCS= \ nsUInt32Array.cpp \ nsNewsSet.cpp \ nsMsgFolder.cpp \ + nsMsgDBFolder.cpp \ nsLocalFolderSummarySpec.cpp \ nsMsgIdentity.cpp \ nsMsgIncomingServer.cpp \ @@ -48,6 +49,7 @@ CPP_OBJS= \ .\$(OBJDIR)\nsUInt32Array.obj \ .\$(OBJDIR)\nsNewsSet.obj \ .\$(OBJDIR)\nsMsgFolder.obj \ + .\$(OBJDIR)\nsMsgDBFolder.obj \ .\$(OBJDIR)\nsLocalFolderSummarySpec.obj \ .\$(OBJDIR)\nsMsgIdentity.obj \ .\$(OBJDIR)\nsMsgIncomingServer.obj \ @@ -63,6 +65,7 @@ EXPORTS= \ nsUInt32Array.h \ nsNewsSet.h \ nsMsgFolder.h \ + nsMsgDBFolder.h \ nsLocalFolderSummarySpec.h \ nsMsgIdentity.h \ nsMsgIncomingServer.h \ diff --git a/mozilla/mailnews/base/util/nsMsgDBFolder.cpp b/mozilla/mailnews/base/util/nsMsgDBFolder.cpp new file mode 100644 index 00000000000..39330a6b237 --- /dev/null +++ b/mozilla/mailnews/base/util/nsMsgDBFolder.cpp @@ -0,0 +1,213 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * 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) 1999 Netscape Communications Corporation. All Rights + * Reserved. + */ + +#include "nsMsgDBFolder.h" +#include "nsMsgFolderFlags.h" + + +NS_IMPL_ADDREF_INHERITED(nsMsgDBFolder, nsMsgFolder) +NS_IMPL_RELEASE_INHERITED(nsMsgDBFolder, nsMsgFolder) + +NS_IMETHODIMP nsMsgDBFolder::QueryInterface(REFNSIID aIID, void** aInstancePtr) +{ + if (!aInstancePtr) return NS_ERROR_NULL_POINTER; + *aInstancePtr = nsnull; + if (aIID.Equals(nsIDBChangeListener::GetIID())) + { + *aInstancePtr = NS_STATIC_CAST(nsIDBChangeListener*, this); + } + + if(*aInstancePtr) + { + AddRef(); + return NS_OK; + } + + return nsRDFResource::QueryInterface(aIID, aInstancePtr); +} + +nsMsgDBFolder::nsMsgDBFolder(void) +{ + +} + +nsMsgDBFolder::~nsMsgDBFolder(void) +{ + if(mDatabase) + mDatabase->Close(PR_TRUE); +} + +NS_IMETHODIMP nsMsgDBFolder::GetThreads(nsIEnumerator** threadEnumerator) +{ + nsresult rv = GetDatabase(); + + if(NS_SUCCEEDED(rv)) + return mDatabase->EnumerateThreads(threadEnumerator); + else + return rv; +} + +NS_IMETHODIMP +nsMsgDBFolder::GetThreadForMessage(nsIMessage *message, nsIMsgThread **thread) +{ + nsresult rv = GetDatabase(); + if(NS_SUCCEEDED(rv)) + { + nsCOMPtr msgDBHdr; + nsCOMPtr dbMessage(do_QueryInterface(message, &rv)); + if(NS_SUCCEEDED(rv)) + rv = dbMessage->GetMsgDBHdr(getter_AddRefs(msgDBHdr)); + if(NS_SUCCEEDED(rv)) + { + rv = mDatabase->GetThreadContainingMsgHdr(msgDBHdr, thread); + } + } + return rv; + +} + +NS_IMETHODIMP +nsMsgDBFolder::HasMessage(nsIMessage *message, PRBool *hasMessage) +{ + if(!hasMessage) + return NS_ERROR_NULL_POINTER; + + nsresult rv = GetDatabase(); + + if(NS_SUCCEEDED(rv)) + { + nsCOMPtr msgDBHdr, msgDBHdrForKey; + nsCOMPtr 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 = mDatabase->ContainsKey(key, hasMessage); + + } + return rv; + +} +nsresult nsMsgDBFolder::ReadDBFolderInfo(PRBool force) +{ + // Since it turns out to be pretty expensive to open and close + // the DBs all the time, if we have to open it once, get everything + // we might need while we're here + + nsresult result= NS_OK; + if (force || !(mPrefFlags & MSG_FOLDER_PREF_CACHED)) + { + nsCOMPtr folderInfo; + nsCOMPtr db; + result = NS_SUCCEEDED(GetDBFolderInfoAndDB(getter_AddRefs(folderInfo), getter_AddRefs(db))); + if(result) + { + mIsCachable = TRUE; + if (folderInfo) + { + + folderInfo->GetFlags(&mPrefFlags); + mPrefFlags |= MSG_FOLDER_PREF_CACHED; + folderInfo->SetFlags(mPrefFlags); + + folderInfo->GetNumMessages(&mNumTotalMessages); + folderInfo->GetNumNewMessages(&mNumUnreadMessages); + + //These should be put in IMAP folder only. + //folderInfo->GetImapTotalPendingMessages(&mNumPendingTotalMessages); + //folderInfo->GetImapUnreadPendingMessages(&mNumPendingUnreadMessages); + + // folderInfo->GetCSID(&mCsid); + + if (db && !db->HasNew() && mNumPendingUnreadMessages <= 0) + ClearFlag(MSG_FOLDER_FLAG_GOT_NEW); + } + + } + if (db) + db->Close(PR_FALSE); + } + + return result; + +} + +NS_IMETHODIMP nsMsgDBFolder::OnKeyChange(nsMsgKey aKeyChanged, PRInt32 aFlags, + nsIDBChangeListener * aInstigator) +{ + return NS_OK; +} + +NS_IMETHODIMP nsMsgDBFolder::OnKeyDeleted(nsMsgKey aKeyChanged, PRInt32 aFlags, + nsIDBChangeListener * aInstigator) +{ + nsCOMPtr pMsgDBHdr; + nsresult rv = mDatabase->GetMsgHdrForKey(aKeyChanged, getter_AddRefs(pMsgDBHdr)); + if(NS_SUCCEEDED(rv)) + { + nsCOMPtr message; + rv = CreateMessageFromMsgDBHdr(pMsgDBHdr, getter_AddRefs(message)); + if(NS_SUCCEEDED(rv)) + { + nsCOMPtr msgSupports(do_QueryInterface(message, &rv)); + if(NS_SUCCEEDED(rv)) + { + NotifyItemDeleted(msgSupports); + } + UpdateSummaryTotals(); + } + } + + return NS_OK; +} + +NS_IMETHODIMP nsMsgDBFolder::OnKeyAdded(nsMsgKey aKeyChanged, PRInt32 aFlags, + nsIDBChangeListener * aInstigator) +{ + nsresult rv; + nsCOMPtr msgDBHdr; + rv = mDatabase->GetMsgHdrForKey(aKeyChanged, getter_AddRefs(msgDBHdr)); + if(NS_SUCCEEDED(rv)) + { + nsCOMPtr message; + rv = CreateMessageFromMsgDBHdr(msgDBHdr, getter_AddRefs(message)); + if(NS_SUCCEEDED(rv)) + { + nsCOMPtr msgSupports(do_QueryInterface(message)); + if(msgSupports) + { + NotifyItemAdded(msgSupports); + } + UpdateSummaryTotals(); + } + } + return NS_OK; +} + +NS_IMETHODIMP nsMsgDBFolder::OnAnnouncerGoingAway(nsIDBChangeAnnouncer * + instigator) +{ + if (mDatabase) + { + mDatabase->RemoveListener(this); + mDatabase = null_nsCOMPtr(); + } + return NS_OK; +} diff --git a/mozilla/mailnews/base/util/nsMsgDBFolder.h b/mozilla/mailnews/base/util/nsMsgDBFolder.h new file mode 100644 index 00000000000..a1656805697 --- /dev/null +++ b/mozilla/mailnews/base/util/nsMsgDBFolder.h @@ -0,0 +1,66 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * 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) 1999 Netscape Communications Corporation. All Rights + * Reserved. + */ + +#ifndef nsMsgDBFolder_h__ +#define nsMsgDBFolder_h__ + +#include "msgCore.h" +#include "nsMsgFolder.h" +#include "nsIDBFolderInfo.h" +#include "nsIMsgDatabase.h" +#include "nsCOMPtr.h" +#include "nsIDBChangeListener.h" + + + /* + * nsMsgDBFolder + * class derived from nsMsgFolder for those folders that use an nsIMsgDatabase + */ + +class nsMsgDBFolder: public nsMsgFolder, public nsIDBChangeListener +{ +public: + nsMsgDBFolder(void); + virtual ~nsMsgDBFolder(void); + + NS_IMETHOD GetThreads(nsIEnumerator** threadEnumerator); + NS_IMETHOD GetThreadForMessage(nsIMessage *message, nsIMsgThread **thread); + NS_IMETHOD HasMessage(nsIMessage *message, PRBool *hasMessage); + + //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); + + NS_DECL_ISUPPORTS_INHERITED + +protected: + virtual nsresult ReadDBFolderInfo(PRBool force); + virtual nsresult GetDatabase() = 0; + +protected: + nsCOMPtr mDatabase; + + +}; + +#endif diff --git a/mozilla/mailnews/base/util/nsMsgFolder.cpp b/mozilla/mailnews/base/util/nsMsgFolder.cpp index deac7b817a5..5e9467da1eb 100644 --- a/mozilla/mailnews/base/util/nsMsgFolder.cpp +++ b/mozilla/mailnews/base/util/nsMsgFolder.cpp @@ -1016,49 +1016,6 @@ NS_IMETHODIMP nsMsgFolder::DisplayRecipients(PRBool *displayRecipients) return NS_OK; } -NS_IMETHODIMP nsMsgFolder::ReadDBFolderInfo(PRBool force) -{ - // Since it turns out to be pretty expensive to open and close - // the DBs all the time, if we have to open it once, get everything - // we might need while we're here - - nsresult result= NS_OK; - if (force || !(mPrefFlags & MSG_FOLDER_PREF_CACHED)) - { - nsCOMPtr folderInfo; - nsIMsgDatabase *db = nsnull; //Not making an nsCOMPtr because we want to call close, not release - result = NS_SUCCEEDED(GetDBFolderInfoAndDB(getter_AddRefs(folderInfo), &db)); - if(result) - { - mIsCachable = TRUE; - if (folderInfo) - { - - folderInfo->GetFlags(&mPrefFlags); - mPrefFlags |= MSG_FOLDER_PREF_CACHED; - folderInfo->SetFlags(mPrefFlags); - - folderInfo->GetNumMessages(&mNumTotalMessages); - folderInfo->GetNumNewMessages(&mNumUnreadMessages); - - //These should be put in IMAP folder only. - //folderInfo->GetImapTotalPendingMessages(&mNumPendingTotalMessages); - //folderInfo->GetImapUnreadPendingMessages(&mNumPendingUnreadMessages); - - // folderInfo->GetCSID(&mCsid); - - if (db && !db->HasNew() && mNumPendingUnreadMessages <= 0) - ClearFlag(MSG_FOLDER_FLAG_GOT_NEW); - } - - } - if (db) - db->Close(PR_FALSE); - } - - return result; - -} NS_IMETHODIMP nsMsgFolder::AcquireSemaphore(nsISupports *semHolder) { diff --git a/mozilla/mailnews/base/util/nsMsgFolder.h b/mozilla/mailnews/base/util/nsMsgFolder.h index 7ea74c77cca..d810e7e0041 100644 --- a/mozilla/mailnews/base/util/nsMsgFolder.h +++ b/mozilla/mailnews/base/util/nsMsgFolder.h @@ -200,9 +200,6 @@ public: NS_IMETHOD DisplayRecipients(PRBool *displayRecipients); - NS_IMETHOD ReadDBFolderInfo(PRBool force); - - //For file contention NS_IMETHOD AcquireSemaphore (nsISupports *semHolder); NS_IMETHOD ReleaseSemaphore (nsISupports *semHolder);