From 7eb66b31d4b0fa9f59abb2602f64998e048fbd9b Mon Sep 17 00:00:00 2001 From: "jefft%netscape.com" Date: Tue, 29 Feb 2000 01:16:55 +0000 Subject: [PATCH] fixed bug 28445 - [PDT+] Error displayed after selecting the renamed subfolders; bug 20366 - Unsuccessful IMAP folder rename makes folder disappear; r=bienvenu,a=phil git-svn-id: svn://10.0.0.236/trunk@61821 18797224-902f-48f8-a5cc-f745e15eee43 --- .../base/resources/content/widgetglue.js | 11 +++---- mozilla/mailnews/base/util/nsMsgFolder.cpp | 29 ++++++++++++------ .../imap/public/nsIMsgImapMailFolder.idl | 1 + .../imap/src/nsImapIncomingServer.cpp | 11 ++++--- .../mailnews/imap/src/nsImapMailFolder.cpp | 30 ++++++++++--------- mozilla/mailnews/imap/src/nsImapMailFolder.h | 2 +- mozilla/mailnews/imap/src/nsImapProtocol.cpp | 16 +++++----- 7 files changed, 57 insertions(+), 43 deletions(-) diff --git a/mozilla/mailnews/base/resources/content/widgetglue.js b/mozilla/mailnews/base/resources/content/widgetglue.js index 609d8541bc8..faeeaf8c330 100644 --- a/mozilla/mailnews/base/resources/content/widgetglue.js +++ b/mozilla/mailnews/base/resources/content/widgetglue.js @@ -795,20 +795,21 @@ function MsgRenameFolder() function RenameFolder(name,uri) { dump("uri,name = " + uri + "," + name + "\n"); - var tree = GetFolderTree(); - if (tree) + var folderTree = GetFolderTree(); + if (folderTree) { if (uri && (uri != "") && name && (name != "")) { var selectedFolder = GetResourceFromUri(uri); - tree.clearItemSelection(); - messenger.RenameFolder(tree.database, selectedFolder, name); + folderTree.clearItemSelection(); + folderTree.clearCellSelection(); + messenger.RenameFolder(folderTree.database, selectedFolder, name); } else { dump("no name or nothing selected\n"); } } else { - dump("no tree\n"); + dump("no folder tree\n"); } } diff --git a/mozilla/mailnews/base/util/nsMsgFolder.cpp b/mozilla/mailnews/base/util/nsMsgFolder.cpp index bd732d475cd..2c75a3e2e45 100644 --- a/mozilla/mailnews/base/util/nsMsgFolder.cpp +++ b/mozilla/mailnews/base/util/nsMsgFolder.cpp @@ -940,6 +940,8 @@ NS_IMETHODIMP nsMsgFolder::PropagateDelete(nsIMsgFolder *folder, PRBool deleteSt { if (folder == child.get()) { + //Remove self as parent + child->SetParent(nsnull); // maybe delete disk storage for it, and its subfolders status = child->RecursiveDelete(deleteStorage); @@ -948,8 +950,6 @@ NS_IMETHODIMP nsMsgFolder::PropagateDelete(nsIMsgFolder *folder, PRBool deleteSt //Remove from list of subfolders. mSubFolders->RemoveElement(supports); - //Remove self as parent - child->SetParent(nsnull); nsCOMPtr childSupports(do_QueryInterface(child)); nsCOMPtr folderSupports; rv = QueryInterface(NS_GET_IID(nsISupports), getter_AddRefs(folderSupports)); @@ -957,6 +957,10 @@ NS_IMETHODIMP nsMsgFolder::PropagateDelete(nsIMsgFolder *folder, PRBool deleteSt NotifyItemDeleted(folderSupports, childSupports, "folderView"); break; } + else + { // setting parent back if we failed + child->SetParent(this); + } } else { @@ -987,14 +991,21 @@ NS_IMETHODIMP nsMsgFolder::RecursiveDelete(PRBool deleteStorage) if(NS_SUCCEEDED(status)) { - status = child->RecursiveDelete(deleteStorage); // recur - mSubFolders->RemoveElement(child); // unlink it from this's child list child->SetParent(nsnull); - nsCOMPtr childSupports(do_QueryInterface(child)); - nsCOMPtr folderSupports; - rv = QueryInterface(NS_GET_IID(nsISupports), getter_AddRefs(folderSupports)); - if(childSupports && NS_SUCCEEDED(rv)) - NotifyItemDeleted(folderSupports, childSupports, "folderView"); + status = child->RecursiveDelete(deleteStorage); // recur + if (NS_SUCCEEDED(status)) + { + mSubFolders->RemoveElement(child); // unlink it from this's child list + nsCOMPtr childSupports(do_QueryInterface(child)); + nsCOMPtr folderSupports; + rv = QueryInterface(NS_GET_IID(nsISupports), getter_AddRefs(folderSupports)); + if(childSupports && NS_SUCCEEDED(rv)) + NotifyItemDeleted(folderSupports, childSupports, "folderView"); + } + else + { // setting parent back if we failed for some reason + child->SetParent(this); + } } cnt--; } diff --git a/mozilla/mailnews/imap/public/nsIMsgImapMailFolder.idl b/mozilla/mailnews/imap/public/nsIMsgImapMailFolder.idl index c92fc1aee43..ee226eb9aab 100644 --- a/mozilla/mailnews/imap/public/nsIMsgImapMailFolder.idl +++ b/mozilla/mailnews/imap/public/nsIMsgImapMailFolder.idl @@ -28,6 +28,7 @@ interface nsIMsgImapMailFolder : nsISupports { void RemoveSubFolder(in nsIMsgFolder folder); void CreateClientSubfolderInfo(in string folderName, in wchar hierarchyDelimiter); void List(); + void RenameLocal(in string newname); attribute boolean verifiedAsOnlineFolder; attribute boolean explicitlyVerify; attribute wchar hierarchyDelimiter; diff --git a/mozilla/mailnews/imap/src/nsImapIncomingServer.cpp b/mozilla/mailnews/imap/src/nsImapIncomingServer.cpp index f7b5981cce4..89f887c0af5 100644 --- a/mozilla/mailnews/imap/src/nsImapIncomingServer.cpp +++ b/mozilla/mailnews/imap/src/nsImapIncomingServer.cpp @@ -770,13 +770,12 @@ NS_IMETHODIMP nsImapIncomingServer::OnlineFolderRename(const char *oldName, cons nsCOMPtr me; rv = GetFolder(oldName, getter_AddRefs(me)); if (NS_FAILED(rv)) return rv; - rv = me->GetParent(getter_AddRefs(iFolder)); + + nsCOMPtr folder; + folder = do_QueryInterface(me, &rv); if (NS_SUCCEEDED(rv)) - { - parent = do_QueryInterface(iFolder, &rv); - if (NS_SUCCEEDED(rv)) - parent->RemoveSubFolder(me); - } + folder->RenameLocal(newName); + nsCOMPtr rootFolder; rv = GetRootFolder(getter_AddRefs(rootFolder)); if (NS_SUCCEEDED(rv)) diff --git a/mozilla/mailnews/imap/src/nsImapMailFolder.cpp b/mozilla/mailnews/imap/src/nsImapMailFolder.cpp index 574ba30a5cf..03d31ccf7e7 100644 --- a/mozilla/mailnews/imap/src/nsImapMailFolder.cpp +++ b/mozilla/mailnews/imap/src/nsImapMailFolder.cpp @@ -282,6 +282,12 @@ NS_IMETHODIMP nsImapMailFolder::AddSubfolder(nsAutoString *name, mSubFolders->AppendElement(supports); *child = folder; NS_IF_ADDREF(*child); + nsCOMPtr imapFolder = do_QueryInterface(folder); + if (imapFolder) + { + // for renaming + imapFolder->SetOnlineName(""); + } return rv; } @@ -893,10 +899,6 @@ NS_IMETHODIMP nsImapMailFolder::Delete () NS_IMETHODIMP nsImapMailFolder::Rename (const PRUnichar *newName) { nsresult rv = NS_ERROR_FAILURE; - char *utf7Name = CreateUtf7ConvertedStringFromUnicode(newName); - rv = RenameLocal(utf7Name); - nsCRT::free(utf7Name); - NS_WITH_SERVICE (nsIImapService, imapService, kCImapService, &rv); if (NS_SUCCEEDED(rv)) rv = imapService->RenameLeaf(m_eventQueue, this, newName, this, @@ -929,8 +931,15 @@ NS_IMETHODIMP nsImapMailFolder::ForceDBClosed() return NS_OK; } -nsresult nsImapMailFolder::RenameLocal(const char *newName) +NS_IMETHODIMP + nsImapMailFolder::RenameLocal(const char *newName) { + nsCAutoString leafname = newName; + // newName always in the canonical form "greatparent/parentname/leafname" + PRInt32 leafpos = leafname.RFindChar('/'); + if (leafpos >0) + leafname.Cut(0, leafpos+1); + m_msgParser = null_nsCOMPtr(); ForceDBClosed(); @@ -955,7 +964,7 @@ nsresult nsImapMailFolder::RenameLocal(const char *newName) nsFileSpec fileSpec; oldPathSpec->GetFileSpec(&fileSpec); nsLocalFolderSummarySpec oldSummarySpec(fileSpec); - nsCAutoString newNameStr = newName; + nsCAutoString newNameStr = leafname; newNameStr += ".msf"; rv = oldSummarySpec.Rename(newNameStr.GetBuffer()); if (NS_SUCCEEDED(rv)) @@ -967,7 +976,7 @@ nsresult nsImapMailFolder::RenameLocal(const char *newName) } if (cnt > 0) { - newNameStr = newName; + newNameStr = leafname; newNameStr += ".sbd"; dirSpec.Rename(newNameStr.GetBuffer()); } @@ -3040,13 +3049,6 @@ nsImapMailFolder::OnStopRunningUrl(nsIURI *aUrl, nsresult aExitCode) } break; case nsIImapUrl::nsImapRenameFolder: - if (NS_FAILED(aExitCode)) - { - char *oldName = nsnull; - imapUrl->CreateServerDestinationFolderPathString(&oldName); - RenameLocal(oldName); - nsCRT::free(oldName); - } break; default: break; diff --git a/mozilla/mailnews/imap/src/nsImapMailFolder.h b/mozilla/mailnews/imap/src/nsImapMailFolder.h index 53b687bcb91..b63c51ac0f7 100644 --- a/mozilla/mailnews/imap/src/nsImapMailFolder.h +++ b/mozilla/mailnews/imap/src/nsImapMailFolder.h @@ -277,7 +277,7 @@ protected: PRBool InTrash(nsIMsgFolder* folder); nsresult GetServerKey(char **serverKey); - nsresult RenameLocal(const char *newName); + //nsresult RenameLocal(const char *newName); nsresult AddDirectorySeparator(nsFileSpec &path); nsresult CreateDirectoryForFolder(nsFileSpec &path); nsresult CreateSubFolders(nsFileSpec &path); diff --git a/mozilla/mailnews/imap/src/nsImapProtocol.cpp b/mozilla/mailnews/imap/src/nsImapProtocol.cpp index 9d6cd602390..2c05bc97029 100644 --- a/mozilla/mailnews/imap/src/nsImapProtocol.cpp +++ b/mozilla/mailnews/imap/src/nsImapProtocol.cpp @@ -795,29 +795,29 @@ nsImapProtocol::TellThreadToDie(PRBool isSaveToClose) // **** jt - This routine should only be called by imap service. nsAutoCMonitor(this); - // if the connection is closed,then don't try to send data - // to the connection. - PRBool connectionIsLost = !TestFlag(IMAP_CONNECTION_IS_OPEN); - PRBool closeNeeded = GetServerStateParser().GetIMAPstate() == nsImapServerResponseParser::kFolderSelected && isSaveToClose; nsCString command; nsresult rv = NS_OK; + PRUint32 writeCount; - if (closeNeeded && GetDeleteIsMoveToTrash() && !connectionIsLost) + if (closeNeeded && GetDeleteIsMoveToTrash() && + TestFlag(IMAP_CONNECTION_IS_OPEN)) { IncrementCommandTagNumber(); command = GetServerCommandTag(); command.Append(" close" CRLF); - rv = SendData(command.GetBuffer()); + rv = m_outputStream->Write(command.GetBuffer(), command.Length(), + &writeCount); } - if (!connectionIsLost) + if (NS_SUCCEEDED(rv) && TestFlag(IMAP_CONNECTION_IS_OPEN)) { IncrementCommandTagNumber(); command = GetServerCommandTag(); command.Append(" logout" CRLF); - rv = SendData(command.GetBuffer()); + rv = m_outputStream->Write(command.GetBuffer(), command.Length(), + &writeCount); } PR_EnterMonitor(m_threadDeathMonitor);