зеркало из https://github.com/mozilla/gecko-dev.git
fix crash in nsMsgGroupView::~nsMsgGroupView() by storing the group by date thread subjects per view, 301308 patch by b.jacques@planet.nl, sr=bienvenu, also add grouping by hasAttachment to fix crash when user accidentally gets into group by attachment mode
This commit is contained in:
Родитель
ed0267097b
Коммит
02c3dc5507
|
@ -48,38 +48,14 @@
|
||||||
#define MSGHDR_CACHE_MAX_SIZE 8192 // Max msghdr cache entries.
|
#define MSGHDR_CACHE_MAX_SIZE 8192 // Max msghdr cache entries.
|
||||||
#define MSGHDR_CACHE_DEFAULT_SIZE 100
|
#define MSGHDR_CACHE_DEFAULT_SIZE 100
|
||||||
|
|
||||||
PRUnichar * nsMsgGroupView::kTodayString = nsnull;
|
|
||||||
PRUnichar * nsMsgGroupView::kYesterdayString = nsnull;
|
|
||||||
PRUnichar * nsMsgGroupView::kLastWeekString = nsnull;
|
|
||||||
PRUnichar * nsMsgGroupView::kTwoWeeksAgoString = nsnull;
|
|
||||||
PRUnichar * nsMsgGroupView::kOldMailString = nsnull;
|
|
||||||
|
|
||||||
nsMsgGroupView::nsMsgGroupView()
|
nsMsgGroupView::nsMsgGroupView()
|
||||||
{
|
{
|
||||||
if (!kTodayString)
|
|
||||||
{
|
|
||||||
// priority strings
|
|
||||||
kTodayString = GetString(NS_LITERAL_STRING("today").get());
|
|
||||||
kYesterdayString = GetString(NS_LITERAL_STRING("yesterday").get());
|
|
||||||
kLastWeekString = GetString(NS_LITERAL_STRING("lastWeek").get());
|
|
||||||
kTwoWeeksAgoString = GetString(NS_LITERAL_STRING("twoWeeksAgo").get());
|
|
||||||
kOldMailString = GetString(NS_LITERAL_STRING("older").get());
|
|
||||||
}
|
|
||||||
m_dayChanged = PR_FALSE;
|
m_dayChanged = PR_FALSE;
|
||||||
m_lastCurExplodedTime.tm_mday = 0;
|
m_lastCurExplodedTime.tm_mday = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsMsgGroupView::~nsMsgGroupView()
|
nsMsgGroupView::~nsMsgGroupView()
|
||||||
{
|
{
|
||||||
// release our global strings
|
|
||||||
if (gInstanceCount <= 1)
|
|
||||||
{
|
|
||||||
nsCRT::free(kTodayString);
|
|
||||||
nsCRT::free(kYesterdayString);
|
|
||||||
nsCRT::free(kLastWeekString);
|
|
||||||
nsCRT::free(kTwoWeeksAgoString);
|
|
||||||
nsCRT::free(kOldMailString);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP nsMsgGroupView::Open(nsIMsgFolder *aFolder, nsMsgViewSortTypeValue aSortType, nsMsgViewSortOrderValue aSortOrder, nsMsgViewFlagsTypeValue aViewFlags, PRInt32 *aCount)
|
NS_IMETHODIMP nsMsgGroupView::Open(nsIMsgFolder *aFolder, nsMsgViewSortTypeValue aSortType, nsMsgViewSortOrderValue aSortOrder, nsMsgViewFlagsTypeValue aViewFlags, PRInt32 *aCount)
|
||||||
|
@ -177,6 +153,12 @@ nsHashKey *nsMsgGroupView::AllocHashKeyForHdr(nsIMsgDBHdr *msgHdr)
|
||||||
return new nsPRUint32Key(label);
|
return new nsPRUint32Key(label);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case nsMsgViewSortType::byAttachments:
|
||||||
|
{
|
||||||
|
PRUint32 flags;
|
||||||
|
msgHdr->GetFlags(&flags);
|
||||||
|
return new nsPRUint32Key(flags & MSG_FLAG_ATTACHMENT ? 1 : 0);
|
||||||
|
}
|
||||||
case nsMsgViewSortType::byPriority:
|
case nsMsgViewSortType::byPriority:
|
||||||
{
|
{
|
||||||
nsMsgPriorityValue priority;
|
nsMsgPriorityValue priority;
|
||||||
|
@ -348,7 +330,7 @@ NS_IMETHODIMP nsMsgGroupView::OpenWithHdrs(nsISimpleEnumerator *aHeaders, nsMsgV
|
||||||
nsresult rv = NS_OK;
|
nsresult rv = NS_OK;
|
||||||
|
|
||||||
if (aSortType == nsMsgViewSortType::byThread || aSortType == nsMsgViewSortType::byId
|
if (aSortType == nsMsgViewSortType::byThread || aSortType == nsMsgViewSortType::byId
|
||||||
|| aSortType == nsMsgViewSortType::byNone)
|
|| aSortType == nsMsgViewSortType::byNone || aSortType == nsMsgViewSortType::bySize)
|
||||||
return NS_ERROR_INVALID_ARG;
|
return NS_ERROR_INVALID_ARG;
|
||||||
|
|
||||||
m_sortType = aSortType;
|
m_sortType = aSortType;
|
||||||
|
@ -638,19 +620,29 @@ NS_IMETHODIMP nsMsgGroupView::GetCellText(PRInt32 aRow, nsITreeColumn* aCol, nsA
|
||||||
switch (((nsPRUint32Key *)hashKey)->GetValue())
|
switch (((nsPRUint32Key *)hashKey)->GetValue())
|
||||||
{
|
{
|
||||||
case 1:
|
case 1:
|
||||||
aValue.Assign(kTodayString);
|
if (!m_kTodayString.get())
|
||||||
|
m_kTodayString.Adopt(GetString(NS_LITERAL_STRING("today").get()));
|
||||||
|
aValue.Assign(m_kTodayString);
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
aValue.Assign(kYesterdayString);
|
if (!m_kYesterdayString.get())
|
||||||
|
m_kYesterdayString.Adopt(GetString(NS_LITERAL_STRING("yesterday").get()));
|
||||||
|
aValue.Assign(m_kYesterdayString);
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
aValue.Assign(kLastWeekString);
|
if (!m_kLastWeekString.get())
|
||||||
|
m_kLastWeekString.Adopt(GetString(NS_LITERAL_STRING("lastWeek").get()));
|
||||||
|
aValue.Assign(m_kLastWeekString);
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
aValue.Assign(kTwoWeeksAgoString);
|
if (!m_kTwoWeeksAgoString.get())
|
||||||
|
m_kTwoWeeksAgoString.Adopt(GetString(NS_LITERAL_STRING("twoWeeksAgo").get()));
|
||||||
|
aValue.Assign(m_kTwoWeeksAgoString);
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
aValue.Assign(kOldMailString);
|
if (!m_kOldMailString.get())
|
||||||
|
m_kOldMailString.Adopt(GetString(NS_LITERAL_STRING("older").get()));
|
||||||
|
aValue.Assign(m_kOldMailString);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
NS_ASSERTION(PR_FALSE, "bad age thread");
|
NS_ASSERTION(PR_FALSE, "bad age thread");
|
||||||
|
@ -688,6 +680,12 @@ NS_IMETHODIMP nsMsgGroupView::GetCellText(PRInt32 aRow, nsITreeColumn* aCol, nsA
|
||||||
FetchRecipients(msgHdr, getter_Copies(valueText));
|
FetchRecipients(msgHdr, getter_Copies(valueText));
|
||||||
aValue.Assign(valueText);
|
aValue.Assign(valueText);
|
||||||
break;
|
break;
|
||||||
|
case nsMsgViewSortType::byAttachments:
|
||||||
|
valueText.Adopt(GetString(((nsPRUint32Key *)hashKey)->GetValue()
|
||||||
|
? NS_LITERAL_STRING("attachments").get()
|
||||||
|
: NS_LITERAL_STRING("noAttachments").get()));
|
||||||
|
aValue.Assign(valueText);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
NS_ASSERTION(PR_FALSE, "we don't sort by group for this type");
|
NS_ASSERTION(PR_FALSE, "we don't sort by group for this type");
|
||||||
break;
|
break;
|
||||||
|
@ -762,7 +760,8 @@ nsresult nsMsgGroupView::GetThreadContainingMsgHdr(nsIMsgDBHdr *msgHdr, nsIMsgTh
|
||||||
return (*pThread) ? NS_OK : NS_ERROR_FAILURE;
|
return (*pThread) ? NS_OK : NS_ERROR_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
PRInt32 nsMsgGroupView::FindLevelInThread(nsIMsgDBHdr *msgHdr, nsMsgViewIndex startOfThread, nsMsgViewIndex viewIndex)
|
PRInt32 nsMsgGroupView::FindLevelInThread(nsIMsgDBHdr *msgHdr,
|
||||||
|
nsMsgViewIndex startOfThread, nsMsgViewIndex viewIndex)
|
||||||
{
|
{
|
||||||
return (startOfThread == viewIndex) ? 0 : 1;
|
return (startOfThread == viewIndex) ? 0 : 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -81,10 +81,11 @@ protected:
|
||||||
PRExplodedTime m_lastCurExplodedTime;
|
PRExplodedTime m_lastCurExplodedTime;
|
||||||
PRBool m_dayChanged;
|
PRBool m_dayChanged;
|
||||||
|
|
||||||
static PRUnichar* kTodayString;
|
private:
|
||||||
static PRUnichar* kYesterdayString;
|
nsXPIDLString m_kTodayString;
|
||||||
static PRUnichar* kLastWeekString;
|
nsXPIDLString m_kYesterdayString;
|
||||||
static PRUnichar* kTwoWeeksAgoString;
|
nsXPIDLString m_kLastWeekString;
|
||||||
static PRUnichar* kOldMailString;
|
nsXPIDLString m_kTwoWeeksAgoString;
|
||||||
|
nsXPIDLString m_kOldMailString;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче