Fix for bugs 14786 and 13727. Fix leaking nsIServiceManager and datasources. Approved by chofmann
and reviewed by alecf. git-svn-id: svn://10.0.0.236/trunk@49011 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
parent
5998553524
commit
3d7ff9d3d0
@ -99,7 +99,8 @@ protected:
|
||||
static nsIRDFResource* kNC_PageTitleCopies;
|
||||
static nsIRDFResource* kNC_PageTitleAdvanced;
|
||||
static nsIRDFResource* kNC_PageTitleSMTP;
|
||||
|
||||
|
||||
static nsrefcnt gAccountManagerResourceRefCnt;
|
||||
|
||||
private:
|
||||
// enumeration function to convert each server (element)
|
||||
@ -135,6 +136,8 @@ nsIRDFResource* nsMsgAccountManagerDataSource::kNC_PageTitleCopies=nsnull;
|
||||
nsIRDFResource* nsMsgAccountManagerDataSource::kNC_PageTitleAdvanced=nsnull;
|
||||
nsIRDFResource* nsMsgAccountManagerDataSource::kNC_PageTitleSMTP=nsnull;
|
||||
|
||||
nsrefcnt nsMsgAccountManagerDataSource::gAccountManagerResourceRefCnt = 0;
|
||||
|
||||
// RDF to match
|
||||
#define NC_RDF_ACCOUNT NC_NAMESPACE_URI "Account"
|
||||
#define NC_RDF_SERVER NC_NAMESPACE_URI "Server"
|
||||
@ -161,9 +164,27 @@ nsMsgAccountManagerDataSource::nsMsgAccountManagerDataSource():
|
||||
|
||||
nsMsgAccountManagerDataSource::~nsMsgAccountManagerDataSource()
|
||||
{
|
||||
if (getRDFService()) nsServiceManager::ReleaseService(kRDFServiceCID,
|
||||
getRDFService(),
|
||||
this);
|
||||
if (--gAccountManagerResourceRefCnt == 0)
|
||||
{
|
||||
NS_IF_RELEASE(kNC_Child);
|
||||
NS_IF_RELEASE(kNC_Name);
|
||||
NS_IF_RELEASE(kNC_NameSort);
|
||||
NS_IF_RELEASE(kNC_PageTag);
|
||||
NS_IF_RELEASE(kNC_Account);
|
||||
NS_IF_RELEASE(kNC_Server);
|
||||
NS_IF_RELEASE(kNC_Identity);
|
||||
NS_IF_RELEASE(kNC_PageTitleMain);
|
||||
NS_IF_RELEASE(kNC_PageTitleServer);
|
||||
NS_IF_RELEASE(kNC_PageTitleCopies);
|
||||
NS_IF_RELEASE(kNC_PageTitleAdvanced);
|
||||
NS_IF_RELEASE(kNC_PageTitleSMTP);
|
||||
|
||||
NS_IF_RELEASE(kNC_AccountRoot);
|
||||
|
||||
// eventually these need to exist in some kind of array
|
||||
// that's easily extensible
|
||||
NS_IF_RELEASE(kNC_Settings);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -182,7 +203,7 @@ nsMsgAccountManagerDataSource::Init()
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
}
|
||||
|
||||
if (! kNC_Child) {
|
||||
if (gAccountManagerResourceRefCnt++ == 0) {
|
||||
getRDFService()->GetResource(NC_RDF_CHILD, &kNC_Child);
|
||||
getRDFService()->GetResource(NC_RDF_NAME, &kNC_Name);
|
||||
getRDFService()->GetResource(NC_RDF_NAME_SORT, &kNC_NameSort);
|
||||
|
||||
@ -70,6 +70,7 @@ nsIRDFResource* nsMsgFolderDataSource::kNC_Compact= nsnull;
|
||||
nsIRDFResource* nsMsgFolderDataSource::kNC_Rename= nsnull;
|
||||
nsIRDFResource* nsMsgFolderDataSource::kNC_EmptyTrash= nsnull;
|
||||
|
||||
nsrefcnt nsMsgFolderDataSource::gFolderResourceRefCnt = 0;
|
||||
|
||||
nsMsgFolderDataSource::nsMsgFolderDataSource():
|
||||
mInitialized(PR_FALSE)
|
||||
@ -81,33 +82,35 @@ nsMsgFolderDataSource::~nsMsgFolderDataSource (void)
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
NS_WITH_SERVICE(nsIMsgMailSession, mailSession, kMsgMailSessionCID, &rv);
|
||||
NS_WITH_SERVICE(nsIMsgMailSession, mailSession, kMsgMailSessionCID, &rv);
|
||||
if(NS_SUCCEEDED(rv))
|
||||
mailSession->RemoveFolderListener(this);
|
||||
if (--gFolderResourceRefCnt == 0)
|
||||
{
|
||||
nsrefcnt refcnt;
|
||||
NS_RELEASE2(kNC_Child, refcnt);
|
||||
NS_RELEASE2(kNC_MessageChild, refcnt);
|
||||
NS_RELEASE2(kNC_Folder, refcnt);
|
||||
NS_RELEASE2(kNC_Name, refcnt);
|
||||
NS_RELEASE2(kNC_NameSort, refcnt);
|
||||
NS_RELEASE2(kNC_SpecialFolder, refcnt);
|
||||
NS_RELEASE2(kNC_ServerType, refcnt);
|
||||
NS_RELEASE2(kNC_IsServer, refcnt);
|
||||
NS_RELEASE2(kNC_TotalMessages, refcnt);
|
||||
NS_RELEASE2(kNC_TotalUnreadMessages, refcnt);
|
||||
NS_RELEASE2(kNC_Charset, refcnt);
|
||||
NS_RELEASE2(kNC_BiffState, refcnt);
|
||||
|
||||
nsrefcnt refcnt;
|
||||
NS_RELEASE2(kNC_Child, refcnt);
|
||||
NS_RELEASE2(kNC_MessageChild, refcnt);
|
||||
NS_RELEASE2(kNC_Folder, refcnt);
|
||||
NS_RELEASE2(kNC_Name, refcnt);
|
||||
NS_RELEASE2(kNC_NameSort, refcnt);
|
||||
NS_RELEASE2(kNC_SpecialFolder, refcnt);
|
||||
NS_RELEASE2(kNC_ServerType, refcnt);
|
||||
NS_RELEASE2(kNC_IsServer, refcnt);
|
||||
NS_RELEASE2(kNC_TotalMessages, refcnt);
|
||||
NS_RELEASE2(kNC_TotalUnreadMessages, refcnt);
|
||||
NS_RELEASE2(kNC_Charset, refcnt);
|
||||
NS_RELEASE2(kNC_BiffState, refcnt);
|
||||
|
||||
NS_RELEASE2(kNC_Delete, refcnt);
|
||||
NS_RELEASE2(kNC_NewFolder, refcnt);
|
||||
NS_RELEASE2(kNC_GetNewMessages, refcnt);
|
||||
NS_RELEASE2(kNC_Copy, refcnt);
|
||||
NS_RELEASE2(kNC_Move, refcnt);
|
||||
NS_RELEASE2(kNC_MarkAllMessagesRead, refcnt);
|
||||
NS_RELEASE2(kNC_Compact, refcnt);
|
||||
NS_RELEASE2(kNC_Rename, refcnt);
|
||||
NS_RELEASE2(kNC_EmptyTrash, refcnt);
|
||||
NS_RELEASE2(kNC_Delete, refcnt);
|
||||
NS_RELEASE2(kNC_NewFolder, refcnt);
|
||||
NS_RELEASE2(kNC_GetNewMessages, refcnt);
|
||||
NS_RELEASE2(kNC_Copy, refcnt);
|
||||
NS_RELEASE2(kNC_Move, refcnt);
|
||||
NS_RELEASE2(kNC_MarkAllMessagesRead, refcnt);
|
||||
NS_RELEASE2(kNC_Compact, refcnt);
|
||||
NS_RELEASE2(kNC_Rename, refcnt);
|
||||
NS_RELEASE2(kNC_EmptyTrash, refcnt);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -126,7 +129,7 @@ nsresult nsMsgFolderDataSource::Init()
|
||||
if(!rdf)
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
if (! kNC_Child) {
|
||||
if (gFolderResourceRefCnt++ == 0) {
|
||||
rdf->GetResource(NC_RDF_CHILD, &kNC_Child);
|
||||
rdf->GetResource(NC_RDF_MESSAGECHILD, &kNC_MessageChild);
|
||||
rdf->GetResource(NC_RDF_FOLDER, &kNC_Folder);
|
||||
|
||||
@ -176,6 +176,8 @@ protected:
|
||||
static nsIRDFResource* kNC_Rename;
|
||||
static nsIRDFResource* kNC_EmptyTrash;
|
||||
|
||||
static nsrefcnt gFolderResourceRefCnt;
|
||||
|
||||
nsCOMPtr<nsISupportsArray> kFolderArcsOutArray;
|
||||
|
||||
};
|
||||
|
||||
@ -66,6 +66,8 @@ nsIRDFResource* nsMsgMessageDataSource::kNC_ToggleRead= nsnull;
|
||||
nsIRDFResource* nsMsgMessageDataSource::kNC_MarkFlagged= nsnull;
|
||||
nsIRDFResource* nsMsgMessageDataSource::kNC_MarkUnflagged= nsnull;
|
||||
|
||||
nsrefcnt nsMsgMessageDataSource::gMessageResourceRefCnt = 0;
|
||||
|
||||
|
||||
nsMsgMessageDataSource::nsMsgMessageDataSource():
|
||||
mInitialized(PR_FALSE),
|
||||
@ -78,52 +80,34 @@ nsMsgMessageDataSource::nsMsgMessageDataSource():
|
||||
nsMsgMessageDataSource::~nsMsgMessageDataSource (void)
|
||||
{
|
||||
nsresult rv;
|
||||
nsIRDFService *rdf = getRDFService();
|
||||
if(rdf)
|
||||
rdf->UnregisterDataSource(this);
|
||||
|
||||
NS_WITH_SERVICE(nsIMsgMailSession, mailSession, kMsgMailSessionCID, &rv);
|
||||
|
||||
if(NS_SUCCEEDED(rv))
|
||||
mailSession->RemoveFolderListener(this);
|
||||
if (--gMessageResourceRefCnt == 0)
|
||||
{
|
||||
nsrefcnt refcnt;
|
||||
|
||||
nsrefcnt refcnt;
|
||||
|
||||
if (kNC_Subject)
|
||||
NS_RELEASE2(kNC_Subject, refcnt);
|
||||
if (kNC_SubjectCollation)
|
||||
NS_RELEASE2(kNC_SubjectCollation, refcnt);
|
||||
if (kNC_Sender)
|
||||
NS_RELEASE2(kNC_Sender, refcnt);
|
||||
if (kNC_SenderCollation)
|
||||
NS_RELEASE2(kNC_SenderCollation, refcnt);
|
||||
if (kNC_Date)
|
||||
NS_RELEASE2(kNC_Date, refcnt);
|
||||
if (kNC_Status)
|
||||
NS_RELEASE2(kNC_Status, refcnt);
|
||||
if (kNC_Flagged)
|
||||
NS_RELEASE2(kNC_Flagged, refcnt);
|
||||
if (kNC_Priority)
|
||||
NS_RELEASE2(kNC_Priority, refcnt);
|
||||
if (kNC_Size)
|
||||
NS_RELEASE2(kNC_Size, refcnt);
|
||||
if (kNC_Total)
|
||||
NS_RELEASE2(kNC_Total, refcnt);
|
||||
if (kNC_Unread)
|
||||
NS_RELEASE2(kNC_Unread, refcnt);
|
||||
if (kNC_MessageChild)
|
||||
NS_RELEASE2(kNC_MessageChild, refcnt);
|
||||
|
||||
if (kNC_MarkRead)
|
||||
NS_RELEASE2(kNC_MarkRead, refcnt);
|
||||
if (kNC_MarkUnread)
|
||||
NS_RELEASE2(kNC_MarkUnread, refcnt);
|
||||
if (kNC_ToggleRead)
|
||||
NS_RELEASE2(kNC_ToggleRead, refcnt);
|
||||
if (kNC_MarkRead)
|
||||
NS_RELEASE2(kNC_MarkFlagged, refcnt);
|
||||
if (kNC_MarkUnread)
|
||||
NS_RELEASE2(kNC_MarkUnflagged, refcnt);
|
||||
}
|
||||
|
||||
NS_IF_RELEASE(mHeaderParser);
|
||||
}
|
||||
@ -151,7 +135,7 @@ nsresult nsMsgMessageDataSource::Init()
|
||||
if(NS_SUCCEEDED(rv))
|
||||
mailSession->AddFolderListener(this);
|
||||
PR_ASSERT(NS_SUCCEEDED(rv));
|
||||
if (! kNC_Subject) {
|
||||
if (gMessageResourceRefCnt++ == 0) {
|
||||
|
||||
rdf->GetResource(NC_RDF_SUBJECT, &kNC_Subject);
|
||||
rdf->GetResource(NC_RDF_SUBJECT_COLLATION_SORT, &kNC_SubjectCollation);
|
||||
|
||||
@ -200,6 +200,8 @@ protected:
|
||||
nsCOMPtr<nsISupportsArray> kThreadsArcsOutArray;
|
||||
nsCOMPtr<nsISupportsArray> kNoThreadsArcsOutArray;
|
||||
|
||||
static nsrefcnt gMessageResourceRefCnt;
|
||||
|
||||
};
|
||||
|
||||
PR_EXTERN(nsresult)
|
||||
|
||||
@ -80,7 +80,6 @@ public:
|
||||
nsCID mClassID;
|
||||
char* mClassName;
|
||||
char* mProgID;
|
||||
nsIServiceManager* mServiceManager;
|
||||
};
|
||||
|
||||
nsMsgComposeFactory::nsMsgComposeFactory(const nsCID &aClass,
|
||||
@ -93,16 +92,12 @@ nsMsgComposeFactory::nsMsgComposeFactory(const nsCID &aClass,
|
||||
{
|
||||
NS_INIT_REFCNT();
|
||||
|
||||
// store a copy of the
|
||||
compMgrSupports->QueryInterface(nsCOMTypeInfo<nsIServiceManager>::GetIID(),
|
||||
(void **)&mServiceManager);
|
||||
}
|
||||
|
||||
nsMsgComposeFactory::~nsMsgComposeFactory()
|
||||
{
|
||||
NS_ASSERTION(mRefCnt == 0, "non-zero refcnt at destruction");
|
||||
|
||||
NS_IF_RELEASE(mServiceManager);
|
||||
PL_strfree(mClassName);
|
||||
PL_strfree(mProgID);
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user