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
This commit is contained in:
jefft%netscape.com 2000-02-29 01:16:55 +00:00
parent 1b216fafd4
commit 7eb66b31d4
7 changed files with 57 additions and 43 deletions

View File

@ -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");
}
}

View File

@ -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<nsISupports> childSupports(do_QueryInterface(child));
nsCOMPtr<nsISupports> 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<nsISupports> childSupports(do_QueryInterface(child));
nsCOMPtr<nsISupports> 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<nsISupports> childSupports(do_QueryInterface(child));
nsCOMPtr<nsISupports> 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--;
}

View File

@ -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;

View File

@ -770,13 +770,12 @@ NS_IMETHODIMP nsImapIncomingServer::OnlineFolderRename(const char *oldName, cons
nsCOMPtr<nsIMsgFolder> me;
rv = GetFolder(oldName, getter_AddRefs(me));
if (NS_FAILED(rv)) return rv;
rv = me->GetParent(getter_AddRefs(iFolder));
nsCOMPtr<nsIMsgImapMailFolder> 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<nsIFolder> rootFolder;
rv = GetRootFolder(getter_AddRefs(rootFolder));
if (NS_SUCCEEDED(rv))

View File

@ -282,6 +282,12 @@ NS_IMETHODIMP nsImapMailFolder::AddSubfolder(nsAutoString *name,
mSubFolders->AppendElement(supports);
*child = folder;
NS_IF_ADDREF(*child);
nsCOMPtr<nsIMsgImapMailFolder> 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;

View File

@ -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);

View File

@ -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);