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:
parent
1b216fafd4
commit
7eb66b31d4
@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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--;
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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))
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user