void nsFolderCompactState::CleanupTempFilesAfterError() { CloseOutputStream(); if (m_db) m_db->ForceClosed(); nsCOMPtr <nsILocalFile> summaryFile; GetSummaryFileLocation(m_file, getter_AddRefs(summaryFile)); m_file->Remove(false); summaryFile->Remove(false); }
NS_IMETHODIMP nsMsgBrkMBoxStore::CopyFolder(nsIMsgFolder *aSrcFolder, nsIMsgFolder *aDstFolder, bool aIsMoveFolder, nsIMsgWindow *aMsgWindow, nsIMsgCopyServiceListener *aListener, const nsAString &aNewName) { NS_ENSURE_ARG_POINTER(aSrcFolder); NS_ENSURE_ARG_POINTER(aDstFolder); nsAutoString folderName; if (aNewName.IsEmpty()) aSrcFolder->GetName(folderName); else folderName.Assign(aNewName); nsAutoString safeFolderName(folderName); NS_MsgHashIfNecessary(safeFolderName); nsCOMPtr<nsIMsgLocalMailFolder> localSrcFolder(do_QueryInterface(aSrcFolder)); nsCOMPtr<nsIMsgDatabase> srcDB; if (localSrcFolder) localSrcFolder->GetDatabaseWOReparse(getter_AddRefs(srcDB)); bool summaryValid = !!srcDB; srcDB = nullptr; aSrcFolder->ForceDBClosed(); nsCOMPtr<nsIFile> oldPath; nsresult rv = aSrcFolder->GetFilePath(getter_AddRefs(oldPath)); NS_ENSURE_SUCCESS(rv,rv); nsCOMPtr<nsIFile> summaryFile; GetSummaryFileLocation(oldPath, getter_AddRefs(summaryFile)); nsCOMPtr<nsIFile> newPath; rv = aDstFolder->GetFilePath(getter_AddRefs(newPath)); NS_ENSURE_SUCCESS(rv,rv); bool newPathIsDirectory = false; newPath->IsDirectory(&newPathIsDirectory); if (!newPathIsDirectory) { AddDirectorySeparator(newPath); newPath->Create(nsIFile::DIRECTORY_TYPE, 0700); } nsCOMPtr<nsIFile> origPath; oldPath->Clone(getter_AddRefs(origPath)); //copying necessary for aborting.... if failure return rv = oldPath->CopyTo(newPath, safeFolderName); NS_ENSURE_SUCCESS(rv, rv); // Will fail if a file by that name exists // Copy to dir can fail if filespec does not exist. If copy fails, we test // if the filespec exist or not, if it does not that's ok, we continue // without copying it. If it fails and filespec exist and is not zero sized // there is real problem // Copy the file to the new dir nsAutoString dbName(safeFolderName); dbName += NS_LITERAL_STRING(SUMMARY_SUFFIX); rv = summaryFile->CopyTo(newPath, dbName); if (NS_FAILED(rv)) // Test if the copy is successful { // Test if the filespec has data bool exists; int64_t fileSize; summaryFile->Exists(&exists); summaryFile->GetFileSize(&fileSize); if (exists && fileSize > 0) NS_ENSURE_SUCCESS(rv, rv); // Yes, it should have worked ! // else case is filespec is zero sized, no need to copy it, // not an error } nsCOMPtr<nsIMsgFolder> newMsgFolder; rv = aDstFolder->AddSubfolder(safeFolderName, getter_AddRefs(newMsgFolder)); NS_ENSURE_SUCCESS(rv, rv); // linux and mac are not good about maintaining the file stamp when copying // folders around. So if the source folder db is good, set the dest db as // good too. nsCOMPtr<nsIMsgDatabase> destDB; if (summaryValid) { nsAutoString folderLeafName; origPath->GetLeafName(folderLeafName); newPath->Append(folderLeafName); nsCOMPtr<nsIMsgDBService> msgDBService = do_GetService(NS_MSGDB_SERVICE_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); rv = msgDBService->OpenMailDBFromFile(newPath, newMsgFolder, false, true, getter_AddRefs(destDB)); if (rv == NS_MSG_ERROR_FOLDER_SUMMARY_OUT_OF_DATE && destDB) destDB->SetSummaryValid(true); } newMsgFolder->SetPrettyName(folderName); uint32_t flags; aSrcFolder->GetFlags(&flags); newMsgFolder->SetFlags(flags); bool changed = false; rv = aSrcFolder->MatchOrChangeFilterDestination(newMsgFolder, true, &changed); if (changed) aSrcFolder->AlertFilterChanged(aMsgWindow); nsCOMPtr<nsISimpleEnumerator> enumerator; rv = aSrcFolder->GetSubFolders(getter_AddRefs(enumerator)); NS_ENSURE_SUCCESS(rv, rv); // Copy subfolders to the new location nsresult copyStatus = NS_OK; nsCOMPtr<nsIMsgLocalMailFolder> localNewFolder(do_QueryInterface(newMsgFolder, &rv)); if (NS_SUCCEEDED(rv)) { bool hasMore; while (NS_SUCCEEDED(enumerator->HasMoreElements(&hasMore)) && hasMore && NS_SUCCEEDED(copyStatus)) { nsCOMPtr<nsISupports> item; enumerator->GetNext(getter_AddRefs(item)); nsCOMPtr<nsIMsgFolder> folder(do_QueryInterface(item)); if (!folder) continue; copyStatus = localNewFolder->CopyFolderLocal(folder, false, aMsgWindow, aListener); // Test if the call succeeded, if not we have to stop recursive call if (NS_FAILED(copyStatus)) { // Copy failed we have to notify caller to handle the error and stop // moving the folders. In case this happens to the topmost level of // recursive call, then we just need to break from the while loop and // go to error handling code. if (!aIsMoveFolder) return copyStatus; break; } } } if (aIsMoveFolder && NS_SUCCEEDED(copyStatus)) { if (localNewFolder) { nsCOMPtr<nsISupports> srcSupport(do_QueryInterface(aSrcFolder)); localNewFolder->OnCopyCompleted(srcSupport, true); } // Notify the "folder" that was dragged and dropped has been created. No // need to do this for its subfolders. isMoveFolder will be true for folder. aDstFolder->NotifyItemAdded(newMsgFolder); nsCOMPtr<nsIMsgFolder> msgParent; aSrcFolder->GetParent(getter_AddRefs(msgParent)); aSrcFolder->SetParent(nullptr); if (msgParent) { // The files have already been moved, so delete storage false msgParent->PropagateDelete(aSrcFolder, false, aMsgWindow); oldPath->Remove(false); //berkeley mailbox // We need to force closed the source db nsCOMPtr<nsIMsgDatabase> srcDB; aSrcFolder->Delete(); nsCOMPtr<nsIFile> parentPath; rv = msgParent->GetFilePath(getter_AddRefs(parentPath)); NS_ENSURE_SUCCESS(rv,rv); AddDirectorySeparator(parentPath); nsCOMPtr<nsISimpleEnumerator> children; parentPath->GetDirectoryEntries(getter_AddRefs(children)); bool more; // checks if the directory is empty or not if (children && NS_SUCCEEDED(children->HasMoreElements(&more)) && !more) parentPath->Remove(true); } } else { // This is the case where the copy of a subfolder failed. // We have to delete the newDirectory tree to make a "rollback". // Someone should add a popup to warn the user that the move was not // possible. if (aIsMoveFolder && NS_FAILED(copyStatus)) { nsCOMPtr<nsIMsgFolder> msgParent; newMsgFolder->ForceDBClosed(); newMsgFolder->GetParent(getter_AddRefs(msgParent)); newMsgFolder->SetParent(nullptr); if (msgParent) { msgParent->PropagateDelete(newMsgFolder, false, aMsgWindow); newMsgFolder->Delete(); newMsgFolder->ForceDBClosed(); AddDirectorySeparator(newPath); newPath->Remove(true); //berkeley mailbox } return NS_ERROR_FAILURE; } } return NS_OK; }
nsresult nsFolderCompactState::FinishCompact() { if (!m_folder) return NS_ERROR_NOT_INITIALIZED; // All okay time to finish up the compact process nsCOMPtr<nsILocalFile> path; nsCOMPtr<nsIDBFolderInfo> folderInfo; // get leaf name and database name of the folder nsresult rv = m_folder->GetFilePath(getter_AddRefs(path)); nsCOMPtr <nsILocalFile> folderPath = do_CreateInstance(NS_LOCAL_FILE_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr <nsILocalFile> summaryFile; folderPath->InitWithFile(path); // need to make sure we put the .msf file in the same directory // as the original mailbox, so resolve symlinks. folderPath->SetFollowLinks(true); GetSummaryFileLocation(folderPath, getter_AddRefs(summaryFile)); nsCString leafName; summaryFile->GetNativeLeafName(leafName); nsCAutoString dbName(leafName); path->GetNativeLeafName(leafName); // close down the temp file stream; preparing for deleting the old folder // and its database; then rename the temp folder and database m_fileStream->Flush(); m_fileStream->Close(); m_fileStream = nsnull; // make sure the new database is valid. // Close it so we can rename the .msf file. if (m_db) { m_db->ForceClosed(); m_db = nsnull; } nsCOMPtr <nsILocalFile> newSummaryFile; GetSummaryFileLocation(m_file, getter_AddRefs(newSummaryFile)); nsCOMPtr <nsIDBFolderInfo> transferInfo; m_folder->GetDBTransferInfo(getter_AddRefs(transferInfo)); // close down database of the original folder m_folder->ForceDBClosed(); nsCOMPtr<nsIFile> cloneFile; PRInt64 fileSize; m_file->Clone(getter_AddRefs(cloneFile)); cloneFile->GetFileSize(&fileSize); bool tempFileRightSize = (fileSize == m_totalMsgSize); NS_ASSERTION(tempFileRightSize, "temp file not of expected size in compact"); bool folderRenameSucceeded = false; bool msfRenameSucceeded = false; if (tempFileRightSize) { bool summaryFileExists; // remove the old folder and database rv = summaryFile->Remove(false); summaryFile->Exists(&summaryFileExists); if (NS_SUCCEEDED(rv) && !summaryFileExists) { bool folderPathExists; rv = folderPath->Remove(false); folderPath->Exists(&folderPathExists); if (NS_SUCCEEDED(rv) && !folderPathExists) { // rename the copied folder and database to be the original folder and // database rv = m_file->MoveToNative((nsIFile *) nsnull, leafName); NS_ASSERTION(NS_SUCCEEDED(rv), "error renaming compacted folder"); if (NS_SUCCEEDED(rv)) { folderRenameSucceeded = true; rv = newSummaryFile->MoveToNative((nsIFile *) nsnull, dbName); NS_ASSERTION(NS_SUCCEEDED(rv), "error renaming compacted folder's db"); msfRenameSucceeded = NS_SUCCEEDED(rv); } } } NS_ASSERTION(msfRenameSucceeded && folderRenameSucceeded, "rename failed in compact"); } if (!folderRenameSucceeded) m_file->Remove(false); if (!msfRenameSucceeded) newSummaryFile->Remove(false); rv = ReleaseFolderLock(); NS_ASSERTION(NS_SUCCEEDED(rv),"folder lock not released successfully"); if (msfRenameSucceeded && folderRenameSucceeded) { nsCOMPtr<nsIMsgDBService> msgDBService = do_GetService(NS_MSGDB_SERVICE_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); rv = msgDBService->OpenFolderDB(m_folder, true, getter_AddRefs(m_db)); m_db->SetSummaryValid(true); m_folder->SetDBTransferInfo(transferInfo); nsCOMPtr<nsIDBFolderInfo> dbFolderInfo; m_db->GetDBFolderInfo(getter_AddRefs(dbFolderInfo)); // 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); } if (m_db) m_db->Close(true); m_db = nsnull; // Notify that compaction of the folder is completed. nsCOMPtr<nsIMsgFolderNotificationService> notifier(do_GetService(NS_MSGNOTIFICATIONSERVICE_CONTRACTID)); if (notifier) notifier->NotifyItemEvent(m_folder, NS_LITERAL_CSTRING("FolderCompactFinish"), nsnull); m_folder->NotifyCompactCompleted(); if (m_compactAll) rv = CompactNextFolder(); else CompactCompleted(NS_OK); return rv; }
nsresult nsFolderCompactState::FinishCompact() { NS_ENSURE_TRUE(m_folder, NS_ERROR_NOT_INITIALIZED); NS_ENSURE_TRUE(m_file, NS_ERROR_NOT_INITIALIZED); // All okay time to finish up the compact process nsCOMPtr<nsIFile> path; nsCOMPtr<nsIDBFolderInfo> folderInfo; // get leaf name and database name of the folder nsresult rv = m_folder->GetFilePath(getter_AddRefs(path)); nsCOMPtr <nsIFile> folderPath = do_CreateInstance(NS_LOCAL_FILE_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); rv = folderPath->InitWithFile(path); NS_ENSURE_SUCCESS(rv, rv); // need to make sure we put the .msf file in the same directory // as the original mailbox, so resolve symlinks. folderPath->SetFollowLinks(true); nsCOMPtr <nsIFile> oldSummaryFile; rv = GetSummaryFileLocation(folderPath, getter_AddRefs(oldSummaryFile)); NS_ENSURE_SUCCESS(rv, rv); nsAutoCString dbName; oldSummaryFile->GetNativeLeafName(dbName); nsAutoCString folderName; path->GetNativeLeafName(folderName); // close down the temp file stream; preparing for deleting the old folder // and its database; then rename the temp folder and database if (m_fileStream) { m_fileStream->Flush(); m_fileStream->Close(); m_fileStream = nullptr; } // make sure the new database is valid. // Close it so we can rename the .msf file. if (m_db) { m_db->ForceClosed(); m_db = nullptr; } nsCOMPtr <nsIFile> newSummaryFile; rv = GetSummaryFileLocation(m_file, getter_AddRefs(newSummaryFile)); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr <nsIDBFolderInfo> transferInfo; m_folder->GetDBTransferInfo(getter_AddRefs(transferInfo)); // close down database of the original folder m_folder->ForceDBClosed(); nsCOMPtr<nsIFile> cloneFile; int64_t fileSize; rv = m_file->Clone(getter_AddRefs(cloneFile)); if (NS_SUCCEEDED(rv)) rv = cloneFile->GetFileSize(&fileSize); bool tempFileRightSize = (fileSize == m_totalMsgSize); NS_WARN_IF_FALSE(tempFileRightSize, "temp file not of expected size in compact"); bool folderRenameSucceeded = false; bool msfRenameSucceeded = false; if (NS_SUCCEEDED(rv) && tempFileRightSize) { // First we're going to try and move the old summary file out the way. // We don't delete it yet, as we want to keep the files in sync. nsCOMPtr<nsIFile> tempSummaryFile; rv = oldSummaryFile->Clone(getter_AddRefs(tempSummaryFile)); if (NS_SUCCEEDED(rv)) rv = tempSummaryFile->CreateUnique(nsIFile::NORMAL_FILE_TYPE, 0600); nsAutoCString tempSummaryFileName; if (NS_SUCCEEDED(rv)) rv = tempSummaryFile->GetNativeLeafName(tempSummaryFileName); if (NS_SUCCEEDED(rv)) rv = oldSummaryFile->MoveToNative((nsIFile*) nullptr, tempSummaryFileName); NS_WARN_IF_FALSE(NS_SUCCEEDED(rv), "error moving compacted folder's db out of the way"); if (NS_SUCCEEDED(rv)) { // Now we've successfully moved the summary file out the way, try moving // the newly compacted message file over the old one. rv = m_file->MoveToNative((nsIFile *) nullptr, folderName); folderRenameSucceeded = NS_SUCCEEDED(rv); NS_WARN_IF_FALSE(folderRenameSucceeded, "error renaming compacted folder"); if (folderRenameSucceeded) { // That worked, so land the new summary file in the right place. nsCOMPtr<nsIFile> renamedCompactedSummaryFile; newSummaryFile->Clone(getter_AddRefs(renamedCompactedSummaryFile)); if (renamedCompactedSummaryFile) { rv = renamedCompactedSummaryFile->MoveToNative((nsIFile *) nullptr, dbName); msfRenameSucceeded = NS_SUCCEEDED(rv); } NS_WARN_IF_FALSE(msfRenameSucceeded, "error renaming compacted folder's db"); } if (!msfRenameSucceeded) { // Do our best to put the summary file back to where it was rv = tempSummaryFile->MoveToNative((nsIFile*) nullptr, dbName); if (NS_SUCCEEDED(rv)) tempSummaryFile = nullptr; // flagging that a renamed db no longer exists else NS_WARNING("error restoring uncompacted folder's db"); } } // We don't want any temporarily renamed summary file to lie around if (tempSummaryFile) tempSummaryFile->Remove(false); } NS_WARN_IF_FALSE(msfRenameSucceeded, "compact failed"); rv = ReleaseFolderLock(); NS_WARN_IF_FALSE(NS_SUCCEEDED(rv),"folder lock not released successfully"); // Cleanup of nstmp-named compacted files if failure if (!folderRenameSucceeded) { // remove the abandoned compacted version with the wrong name m_file->Remove(false); } if (!msfRenameSucceeded) { // remove the abandoned compacted summary file newSummaryFile->Remove(false); } if (msfRenameSucceeded) { // Transfer local db information from transferInfo nsCOMPtr<nsIMsgDBService> msgDBService = do_GetService(NS_MSGDB_SERVICE_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); rv = msgDBService->OpenFolderDB(m_folder, true, getter_AddRefs(m_db)); NS_ENSURE_TRUE(m_db, NS_FAILED(rv) ? rv : NS_ERROR_FAILURE); m_db->SetSummaryValid(true); m_folder->SetDBTransferInfo(transferInfo); // since we're transferring info from the old db, we need to reset the expunged bytes nsCOMPtr<nsIDBFolderInfo> dbFolderInfo; m_db->GetDBFolderInfo(getter_AddRefs(dbFolderInfo)); if(dbFolderInfo) dbFolderInfo->SetExpungedBytes(0); } if (m_db) m_db->Close(true); m_db = nullptr; // Notify that compaction of the folder is completed. nsCOMPtr<nsIMsgFolderNotificationService> notifier(do_GetService(NS_MSGNOTIFICATIONSERVICE_CONTRACTID)); if (notifier) notifier->NotifyItemEvent(m_folder, NS_LITERAL_CSTRING("FolderCompactFinish"), nullptr); m_folder->NotifyCompactCompleted(); if (m_compactAll) rv = CompactNextFolder(); else CompactCompleted(NS_OK); return rv; }
NS_IMETHODIMP nsMsgMaildirStore::CopyFolder(nsIMsgFolder *aSrcFolder, nsIMsgFolder *aDstFolder, bool aIsMoveFolder, nsIMsgWindow *aMsgWindow, nsIMsgCopyServiceListener *aListener) { NS_ENSURE_ARG_POINTER(aSrcFolder); NS_ENSURE_ARG_POINTER(aDstFolder); nsString folderName; aSrcFolder->GetName(folderName); nsAutoString safeFolderName(folderName); NS_MsgHashIfNecessary(safeFolderName); nsCOMPtr<nsIMsgLocalMailFolder> localSrcFolder(do_QueryInterface(aSrcFolder)); aSrcFolder->ForceDBClosed(); nsCOMPtr<nsIFile> oldPath; nsresult rv = aSrcFolder->GetFilePath(getter_AddRefs(oldPath)); NS_ENSURE_SUCCESS(rv,rv); nsCOMPtr<nsIFile> summaryFile; GetSummaryFileLocation(oldPath, getter_AddRefs(summaryFile)); nsCOMPtr<nsIFile> newPath; rv = aDstFolder->GetFilePath(getter_AddRefs(newPath)); NS_ENSURE_SUCCESS(rv, rv); // create target directory based on our current path bool isServer; aDstFolder->GetIsServer(&isServer); rv = CreateDirectoryForFolder(newPath, isServer); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIFile> origPath; oldPath->Clone(getter_AddRefs(origPath)); rv = oldPath->CopyTo(newPath, EmptyString()); NS_ENSURE_SUCCESS(rv, rv); //will fail if a file by that name exists // Copy to dir can fail if file does not exist. If copy fails, we test // if the file exists or not, if it does not that's ok, we continue // without copying it. If it fails and file exist and is not zero sized // there is real problem. rv = summaryFile->CopyTo(newPath, EmptyString()); if (!NS_SUCCEEDED(rv)) { // Test if the file is not empty bool exists; int64_t fileSize; summaryFile->Exists(&exists); summaryFile->GetFileSize(&fileSize); if (exists && fileSize > 0) NS_ENSURE_SUCCESS(rv, rv); // Yes, it should have worked! // else case is file is zero sized, no need to copy it, // not an error // else case is file does not exist - not an error } nsCOMPtr<nsIMsgFolder> newMsgFolder; rv = aDstFolder->AddSubfolder(safeFolderName, getter_AddRefs(newMsgFolder)); NS_ENSURE_SUCCESS(rv, rv); newMsgFolder->SetPrettyName(folderName); uint32_t flags; aSrcFolder->GetFlags(&flags); newMsgFolder->SetFlags(flags); bool changed = false; rv = aSrcFolder->MatchOrChangeFilterDestination(newMsgFolder, true, &changed); if (changed) aSrcFolder->AlertFilterChanged(aMsgWindow); nsCOMPtr<nsISimpleEnumerator> enumerator; rv = aSrcFolder->GetSubFolders(getter_AddRefs(enumerator)); NS_ENSURE_SUCCESS(rv, rv); // Copy subfolders to the new location nsresult copyStatus = NS_OK; nsCOMPtr<nsIMsgLocalMailFolder> localNewFolder(do_QueryInterface(newMsgFolder, &rv)); if (NS_SUCCEEDED(rv)) { bool hasMore; while (NS_SUCCEEDED(enumerator->HasMoreElements(&hasMore)) && hasMore && NS_SUCCEEDED(copyStatus)) { nsCOMPtr<nsISupports> item; enumerator->GetNext(getter_AddRefs(item)); nsCOMPtr<nsIMsgFolder> folder(do_QueryInterface(item)); if (!folder) continue; copyStatus = localNewFolder->CopyFolderLocal(folder, false, aMsgWindow, aListener); // Test if the call succeeded, if not we have to stop recursive call if (NS_FAILED(copyStatus)) { // Copy failed we have to notify caller to handle the error and stop // moving the folders. In case this happens to the topmost level of // recursive call, then we just need to break from the while loop and // go to error handling code. if (!aIsMoveFolder) return copyStatus; break; } } } if (aIsMoveFolder && NS_SUCCEEDED(copyStatus)) { if (localNewFolder) { nsCOMPtr<nsISupports> srcSupport(do_QueryInterface(aSrcFolder)); localNewFolder->OnCopyCompleted(srcSupport, true); } // Notify that the folder that was dragged and dropped has been created. // No need to do this for its subfolders - isMoveFolder will be true for folder. aDstFolder->NotifyItemAdded(newMsgFolder); nsCOMPtr<nsIMsgFolder> msgParent; aSrcFolder->GetParent(getter_AddRefs(msgParent)); aSrcFolder->SetParent(nullptr); if (msgParent) { // The files have already been moved, so delete storage false msgParent->PropagateDelete(aSrcFolder, false, aMsgWindow); oldPath->Remove(true); nsCOMPtr<nsIMsgDatabase> srcDB; // we need to force closed the source db aSrcFolder->Delete(); nsCOMPtr<nsIFile> parentPath; rv = msgParent->GetFilePath(getter_AddRefs(parentPath)); NS_ENSURE_SUCCESS(rv,rv); AddDirectorySeparator(parentPath); nsCOMPtr<nsISimpleEnumerator> children; parentPath->GetDirectoryEntries(getter_AddRefs(children)); bool more; // checks if the directory is empty or not if (children && NS_SUCCEEDED(children->HasMoreElements(&more)) && !more) parentPath->Remove(true); } } else { // This is the case where the copy of a subfolder failed. // We have to delete the newDirectory tree to make a "rollback". // Someone should add a popup to warn the user that the move was not // possible. if (aIsMoveFolder && NS_FAILED(copyStatus)) { nsCOMPtr<nsIMsgFolder> msgParent; newMsgFolder->ForceDBClosed(); newMsgFolder->GetParent(getter_AddRefs(msgParent)); newMsgFolder->SetParent(nullptr); if (msgParent) { msgParent->PropagateDelete(newMsgFolder, false, aMsgWindow); newMsgFolder->Delete(); newMsgFolder->ForceDBClosed(); AddDirectorySeparator(newPath); newPath->Remove(true); //berkeley mailbox } return NS_ERROR_FAILURE; } } return NS_OK; }