fix 256332 compact breaks rss folders, also fix runtime warnings in account manager sr=mscott

git-svn-id: svn://10.0.0.236/trunk@161135 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
bienvenu%nventure.com 2004-08-23 17:55:27 +00:00
parent 3f97b40857
commit 06de48dcbb
5 changed files with 57 additions and 102 deletions

View File

@ -2915,7 +2915,9 @@ NS_IMETHODIMP nsMsgAccountManager::SaveVirtualFolders()
NS_IMETHODIMP nsMsgAccountManager::OnItemAdded(nsIRDFResource *parentItem, nsISupports *item)
{
nsCOMPtr<nsIMsgFolder> folder = do_QueryInterface(item);
NS_ENSURE_TRUE(folder, NS_OK); // just kick out with a success code if the item in question is not a folder
// just kick out with a success code if the item in question is not a folder
if (!folder)
return NS_OK;
PRUint32 folderFlags;
folder->GetFlags(&folderFlags);
nsresult rv = NS_OK;
@ -2950,7 +2952,9 @@ NS_IMETHODIMP nsMsgAccountManager::OnItemAdded(nsIRDFResource *parentItem, nsISu
NS_IMETHODIMP nsMsgAccountManager::OnItemRemoved(nsIRDFResource *parentItem, nsISupports *item)
{
nsCOMPtr<nsIMsgFolder> folder = do_QueryInterface(item);
NS_ENSURE_TRUE(folder, NS_OK); // just kick out with a success code if the item in question is not a folder
// just kick out with a success code if the item in question is not a folder
if (!folder)
return NS_OK;
nsresult rv = NS_OK;
PRUint32 folderFlags;
folder->GetFlags(&folderFlags);

View File

@ -396,7 +396,8 @@ nsFolderCompactState::FinishCompact()
delete m_fileStream;
m_fileStream = nsnull;
// make sure the new database is valid
// make sure the new database is valid.
// Close it so we can rename the .msf file.
m_db->SetSummaryValid(PR_TRUE);
m_db->Commit(nsMsgDBCommitType::kLargeCommit);
m_db->ForceClosed();
@ -422,6 +423,17 @@ nsFolderCompactState::FinishCompact()
NS_ASSERTION(NS_SUCCEEDED(rv),"folder lock not released successfully");
m_folder->SetDBTransferInfo(transferInfo);
nsCOMPtr <nsIDBFolderInfo> dbFolderInfo;
m_folder->GetDBFolderInfoAndDB(getter_AddRefs(dbFolderInfo), getter_AddRefs(m_db));
// since we're transferring info from the old db, we need to reset the expunged bytes,
// and set the summary valid again.
if(dbFolderInfo)
dbFolderInfo->SetExpungedBytes(0);
m_db->Close(PR_TRUE);
m_db = nsnull;
m_folder->NotifyCompactCompleted();
if (m_compactAll)

View File

@ -937,25 +937,9 @@ class nsTransferDBFolderInfo : public nsDBFolderInfo
public:
nsTransferDBFolderInfo();
virtual ~nsTransferDBFolderInfo();
NS_IMETHOD GetMailboxName(nsAString &boxName);
NS_IMETHOD SetMailboxName(const nsAString &boxName);
NS_IMETHOD GetViewType(nsMsgViewTypeValue *aViewType);
NS_IMETHOD SetViewType(nsMsgViewTypeValue aViewType);
NS_IMETHOD GetViewFlags(nsMsgViewFlagsTypeValue *aViewFlags);
NS_IMETHOD SetViewFlags(nsMsgViewFlagsTypeValue aViewFlags);
NS_IMETHOD GetSortType(nsMsgViewSortTypeValue *aSortType);
NS_IMETHOD SetSortType(nsMsgViewSortTypeValue aSortType);
NS_IMETHOD GetSortOrder(nsMsgViewSortOrderValue *aSortOrder);
NS_IMETHOD SetSortOrder(nsMsgViewSortOrderValue aSortOrder);
NS_IMETHOD GetFolderName(char **folderName);
NS_IMETHOD SetFolderName(const char *folderName);
nsString m_boxName;
nsCString m_folderName;
nsMsgViewTypeValue m_viewType;
nsMsgViewFlagsTypeValue m_viewFlags;
nsMsgViewSortTypeValue m_sortType;
nsMsgViewSortOrderValue m_sortOrder;
// parallel arrays of properties and values
nsCStringArray m_properties;
nsCStringArray m_values;
};
nsTransferDBFolderInfo::nsTransferDBFolderInfo() : nsDBFolderInfo(nsnull)
@ -974,95 +958,48 @@ NS_IMETHODIMP nsDBFolderInfo::GetTransferInfo(nsIDBFolderInfo **transferInfo)
nsTransferDBFolderInfo *newInfo = new nsTransferDBFolderInfo;
*transferInfo = newInfo;
NS_ADDREF(newInfo);
newInfo->m_flags = m_flags;
nsAutoString folderNameStr;
GetMailboxName(folderNameStr);
newInfo->SetMailboxName(folderNameStr);
// ### add whatever other fields we want to copy here.
nsMsgViewTypeValue viewType;
nsMsgViewFlagsTypeValue viewFlags;
nsMsgViewSortTypeValue sortType;
nsMsgViewSortOrderValue sortOrder;
GetViewType(&viewType);
GetViewFlags(&viewFlags);
GetSortType(&sortType);
GetSortOrder(&sortOrder);
newInfo->SetViewType(viewType);
newInfo->SetViewFlags(viewFlags);
newInfo->SetSortType(sortType);
newInfo->SetSortOrder(sortOrder);
nsXPIDLCString utf8Name;
GetFolderName(getter_Copies(utf8Name));
newInfo->SetFolderName(utf8Name.get());
mdb_count numCells;
mdbYarn cellYarn;
mdb_column cellColumn;
char columnName[100];
mdbYarn cellName = { columnName, 0, sizeof(columnName), 0, 0, nsnull };
m_mdbRow->GetCount(m_mdb->GetEnv(), &numCells);
// iterate over the cells in the dbfolderinfo remembering attribute names and values.
for (mdb_count cellIndex = 0; cellIndex < numCells; cellIndex++)
{
mdb_err err = m_mdbRow->SeekCellYarn(m_mdb->GetEnv(), cellIndex, &cellColumn, nsnull);
if (!err)
{
err = m_mdbRow->AliasCellYarn(m_mdb->GetEnv(), cellColumn, &cellYarn);
if (!err)
{
m_mdb->GetStore()->TokenToString(m_mdb->GetEnv(), cellColumn, &cellName);
newInfo->m_values.AppendCString(Substring((const char *)cellYarn.mYarn_Buf,
(const char *) cellYarn.mYarn_Buf + cellYarn.mYarn_Fill));
newInfo->m_properties.AppendCString(Substring((const char *) cellName.mYarn_Buf,
(const char *) cellName.mYarn_Buf + cellName.mYarn_Fill));
}
}
}
return NS_OK;
}
NS_IMETHODIMP nsTransferDBFolderInfo::SetFolderName(const char *folderName)
{
NS_ENSURE_ARG_POINTER(folderName);
m_folderName = folderName;
return NS_OK;
}
NS_IMETHODIMP nsTransferDBFolderInfo::GetFolderName(char **folderName)
{
NS_ENSURE_ARG_POINTER(folderName);
*folderName = ToNewCString(m_folderName);
return NS_OK;
}
NS_IMETHODIMP nsTransferDBFolderInfo::GetMailboxName(nsAString &boxName)
{
boxName = m_boxName;
return NS_OK;
}
NS_IMETHODIMP nsTransferDBFolderInfo::SetMailboxName(const nsAString &boxName)
{
m_boxName = boxName;
return NS_OK;
}
NS_IMPL_GETSET(nsTransferDBFolderInfo, ViewType, nsMsgViewTypeValue, m_viewType)
NS_IMPL_GETSET(nsTransferDBFolderInfo, ViewFlags, nsMsgViewFlagsTypeValue, m_viewFlags)
NS_IMPL_GETSET(nsTransferDBFolderInfo, SortType, nsMsgViewSortTypeValue, m_sortType)
NS_IMPL_GETSET(nsTransferDBFolderInfo, SortOrder, nsMsgViewSortOrderValue, m_sortOrder)
/* void InitFromTransferInfo (in nsIDBFolderInfo transferInfo); */
NS_IMETHODIMP nsDBFolderInfo::InitFromTransferInfo(nsIDBFolderInfo *transferInfo)
NS_IMETHODIMP nsDBFolderInfo::InitFromTransferInfo(nsIDBFolderInfo *aTransferInfo)
{
NS_ENSURE_ARG(transferInfo);
PRInt32 flags;
nsAutoString folderNameStr;
NS_ENSURE_ARG(aTransferInfo);
transferInfo->GetFlags(&flags);
SetFlags(flags);
transferInfo->GetMailboxName(folderNameStr);
SetMailboxName(folderNameStr);
nsTransferDBFolderInfo *transferInfo = NS_STATIC_CAST(nsTransferDBFolderInfo *, aTransferInfo);
nsXPIDLCString utf8Name;
transferInfo->GetFolderName(getter_Copies(utf8Name));
SetFolderName(utf8Name.get());
for (PRInt32 i = 0; i < transferInfo->m_values.Count(); i++)
SetCharPtrProperty(transferInfo->m_properties[i]->get(), transferInfo->m_values[i]->get());
// ### add whatever other fields we want to copy here.
LoadMemberVariables();
nsMsgViewTypeValue viewType;
nsMsgViewFlagsTypeValue viewFlags;
nsMsgViewSortTypeValue sortType;
nsMsgViewSortOrderValue sortOrder;
transferInfo->GetViewType(&viewType);
transferInfo->GetViewFlags(&viewFlags);
transferInfo->GetSortType(&sortType);
transferInfo->GetSortOrder(&sortOrder);
SetViewType(viewType);
SetViewFlags(viewFlags);
SetSortType(sortType);
SetSortOrder(sortOrder);
return NS_OK;
}

View File

@ -1015,9 +1015,9 @@ NS_IMETHODIMP nsMsgLocalMailFolder::EmptyTrash(nsIMsgWindow *msgWindow,
if (NS_SUCCEEDED(rv) && newTrashFolder)
{
nsCOMPtr <nsIMsgLocalMailFolder> localTrash = do_QueryInterface(newTrashFolder);
newTrashFolder->SetDBTransferInfo(transferInfo);
if (localTrash)
localTrash->RefreshSizeOnDisk();
newTrashFolder->SetDBTransferInfo(transferInfo);
// update the summary totals so the front end will
// show the right thing for the new trash folder
// see bug #161999

View File

@ -269,7 +269,9 @@ NS_IMETHODIMP nsRssIncomingServer::GetCanSearchMessages(PRBool *canSearchMessage
NS_IMETHODIMP nsRssIncomingServer::OnItemAdded(nsIRDFResource *parentItem, nsISupports *item)
{
nsCOMPtr<nsIMsgFolder> folder = do_QueryInterface(item);
NS_ENSURE_TRUE(folder, NS_OK); // just kick out with a success code if the item in question is not a folder
// just kick out with a success code if the item in question is not a folder
if (!folder)
return NS_OK;
nsCOMPtr<nsIMsgIncomingServer> server;
nsresult rv = folder->GetServer(getter_AddRefs(server));