Bug 24064: Need ability to specify Trash folder

r=Henry.Jia
sr=bienvenu
This commit is contained in:
ere%atp.fi 2002-11-27 12:20:37 +00:00
Родитель c788cec71a
Коммит 3d5f029e03
6 изменённых файлов: 133 добавлений и 19 удалений

Просмотреть файл

@ -81,6 +81,8 @@ interface nsIImapIncomingServer : nsISupports {
attribute boolean aOLMailboxView;
attribute boolean storeReadMailInPFC;
attribute boolean storeSentMailInPFC;
attribute wstring trashFolderName;
boolean getIsPFC(in string folderName);
nsIMsgFolder getPFC(in boolean createIfMissing);
attribute boolean downloadBodiesOnGetNewMail;

Просмотреть файл

@ -94,6 +94,9 @@
#include "nsITimer.h"
#include "nsMsgUtils.h"
#define PREF_TRASH_FOLDER_NAME "trash_folder_name"
#define DEFAULT_TRASH_FOLDER_NAME "Trash"
static NS_DEFINE_CID(kCImapHostSessionList, NS_IIMAPHOSTSESSIONLIST_CID);
static NS_DEFINE_CID(kImapProtocolCID, NS_IMAPPROTOCOL_CID);
static NS_DEFINE_CID(kRDFServiceCID, NS_RDFSERVICE_CID);
@ -1584,7 +1587,6 @@ nsresult nsImapIncomingServer::GetFolder(const char* name, nsIMsgFolder** pFolde
return rv;
}
NS_IMETHODIMP nsImapIncomingServer::OnlineFolderDelete(const char *aFolderName)
{
return NS_OK;
@ -1724,7 +1726,37 @@ NS_IMETHODIMP nsImapIncomingServer::DiscoveryDone()
if (NS_FAILED(rv)) return rv;
nsCOMPtr<nsIMsgFolder> rootMsgFolder = do_QueryInterface(rootFolder, &rv);
if (rootMsgFolder)
{
rootMsgFolder->SetPrefFlag();
}
// Verify there is only one trash folder. Another might be present if
// the trash name has been changed.
PRUint32 numFolders;
rv = rootMsgFolder->GetFoldersWithFlag(MSG_FOLDER_FLAG_TRASH, 0, &numFolders, NULL);
if (NS_SUCCEEDED(rv) && numFolders > 1)
{
nsXPIDLString trashName;
if (NS_SUCCEEDED(GetTrashFolderName(getter_Copies(trashName))))
{
nsIMsgFolder *trashFolders[2];
if (NS_SUCCEEDED(rootMsgFolder->GetFoldersWithFlag(MSG_FOLDER_FLAG_TRASH, 2,
&numFolders, trashFolders)))
{
for (int i = 0; i < numFolders; i++)
{
nsXPIDLString folderName;
if (NS_SUCCEEDED(trashFolders[i]->GetName(getter_Copies(folderName))) &&
!folderName.Equals(trashName))
{
trashFolders[i]->ClearFlag(MSG_FOLDER_FLAG_TRASH);
}
NS_RELEASE(trashFolders[i]);
}
}
}
}
}
PRInt32 numUnverifiedFolders;
@ -3733,3 +3765,43 @@ nsImapIncomingServer::GetUriWithNamespacePrefixIfNecessary(PRInt32 namespaceType
}
return rv;
}
NS_IMETHODIMP nsImapIncomingServer::GetTrashFolderName(PRUnichar **retval)
{
nsresult rv = GetUnicharValue(PREF_TRASH_FOLDER_NAME, retval);
if (NS_FAILED(rv))
return rv;
if (!*retval || !**retval)
{
// if GetUnicharValue() above returned allocated empty string, we must free it first
// before allocating space and assigning the default value
if (*retval)
nsMemory::Free(*retval);
*retval = ToNewUnicode(NS_LITERAL_STRING(DEFAULT_TRASH_FOLDER_NAME));
}
return NS_OK;
}
NS_IMETHODIMP nsImapIncomingServer::SetTrashFolderName(const PRUnichar *chvalue)
{
// clear trash flag from the old pref
nsXPIDLString oldTrashName;
nsresult rv = GetTrashFolderName(getter_Copies(oldTrashName));
if (NS_SUCCEEDED(rv))
{
char *oldTrashNameUtf7 = CreateUtf7ConvertedStringFromUnicode(oldTrashName);
if (oldTrashNameUtf7)
{
nsCOMPtr<nsIMsgFolder> oldFolder;
rv = GetFolder(oldTrashNameUtf7, getter_AddRefs(oldFolder));
if (NS_SUCCEEDED(rv) && oldFolder)
{
oldFolder->ClearFlag(MSG_FOLDER_FLAG_TRASH);
}
PR_Free(oldTrashNameUtf7);
}
}
return SetUnicharValue(PREF_TRASH_FOLDER_NAME, chvalue);
}

Просмотреть файл

@ -375,9 +375,13 @@ NS_IMETHODIMP nsImapMailFolder::AddSubfolderWithPath(nsAutoString *name, nsIFile
name->Equals(NS_LITERAL_STRING("Inbox"),
nsCaseInsensitiveStringComparator()))
flags |= MSG_FOLDER_FLAG_INBOX;
else if((isServer || isParentInbox) && name->Equals(NS_LITERAL_STRING("Trash"),
nsCaseInsensitiveStringComparator()))
flags |= MSG_FOLDER_FLAG_TRASH;
else if(isServer || isParentInbox)
{
nsAutoString trashName;
GetTrashFolderName(trashName);
if (name->Equals(trashName))
flags |= MSG_FOLDER_FLAG_TRASH;
}
#if 0
else if(name->EqualsIgnoreCase(NS_LITERAL_STRING("Sent")))
folder->SetFlag(MSG_FOLDER_FLAG_SENTMAIL);
@ -750,7 +754,9 @@ NS_IMETHODIMP nsImapMailFolder::CreateSubfolder(const PRUnichar* folderName, nsI
if (!folderName)
return rv;
if ( nsDependentString(folderName).Equals(NS_LITERAL_STRING("Trash"),nsCaseInsensitiveStringComparator()) ) // Trash , a special folder
nsAutoString trashName;
GetTrashFolderName(trashName);
if ( nsDependentString(folderName).Equals(trashName) ) // Trash , a special folder
{
ThrowAlertMsg("folderExists", msgWindow);
return NS_MSG_FOLDER_EXISTS;
@ -4183,10 +4189,8 @@ nsresult nsImapMailFolder::GetTrashFolder(nsIMsgFolder **pTrashFolder)
{
PRUint32 numFolders;
rv = rootFolder->GetFoldersWithFlag(MSG_FOLDER_FLAG_TRASH, 1, &numFolders, pTrashFolder);
if (numFolders != 1)
rv = NS_ERROR_FAILURE;
if (*pTrashFolder)
NS_ADDREF(*pTrashFolder);
if (numFolders != 1)
rv = NS_ERROR_FAILURE;
}
return rv;
}
@ -7205,3 +7209,20 @@ nsImapMailFolder::GetShouldDownloadAllHeaders(PRBool *aResult)
}
void nsImapMailFolder::GetTrashFolderName(nsAString &aFolderName)
{
nsCOMPtr<nsIMsgIncomingServer> server;
nsCOMPtr<nsIImapIncomingServer> imapServer;
if (NS_SUCCEEDED(GetServer(getter_AddRefs(server))) && server)
imapServer = do_QueryInterface(server);
if (imapServer)
{
nsXPIDLString trashFolderName;
if (NS_SUCCEEDED(imapServer->GetTrashFolderName(getter_Copies(trashFolderName))))
{
aFolderName = trashFolderName;
}
}
}

Просмотреть файл

@ -436,6 +436,8 @@ protected:
nsresult CopyOfflineMsgBody(nsIMsgFolder *srcFolder, nsIMsgDBHdr *destHdr, nsIMsgDBHdr *origHdr);
void GetTrashFolderName(nsAString &aFolderName);
PRBool m_initialized;
PRBool m_haveDiscoveredAllFolders;
PRBool m_haveReadNameFromDB;

Просмотреть файл

@ -108,8 +108,6 @@ PRLogModuleInfo *IMAP;
#define ONE_SECOND ((PRUint32)1000) // one second
const char *kImapTrashFolderName = "Trash"; // **** needs to be localized ****
static NS_DEFINE_CID(kIStreamConverterServiceCID, NS_STREAMCONVERTERSERVICE_CID);
static NS_DEFINE_CID(kSocketTransportServiceCID, NS_SOCKETTRANSPORTSERVICE_CID);
static NS_DEFINE_CID(kEventQueueServiceCID, NS_EVENTQUEUESERVICE_CID);
@ -4136,7 +4134,6 @@ nsImapProtocol::GetSubscribingNow()
void
nsImapProtocol::DiscoverMailboxSpec(nsImapMailboxSpec * adoptedBoxSpec)
{
// IMAP_LoadTrashFolderName(); **** needs to work on localization issues
nsIMAPNamespace *ns = nsnull;
NS_ASSERTION (m_hostSessionList, "fatal null host session list");
@ -4164,7 +4161,7 @@ nsImapProtocol::DiscoverMailboxSpec(nsImapMailboxSpec * adoptedBoxSpec)
// if not using the Trash model
!onlineTrashFolderExists &&
PL_strstr(adoptedBoxSpec->allocatedPathName,
kImapTrashFolderName))
GetTrashFolderName()))
{
PRBool trashExists = PR_FALSE;
nsCString trashMatch(CreatePossibleTrashName(nsPrefix));
@ -6483,17 +6480,35 @@ void nsImapProtocol::RenameMailbox(const char *existingName,
char * nsImapProtocol::CreatePossibleTrashName(const char *prefix)
{
// mscott we used to have a localized global string for the trash name...
// I haven't don't localization stuff yet so I'm going to do a bad thing and just
// use a string literal....(only temporary!!!!! =))...
// IMAP_LoadTrashFolderName();
nsCString returnTrash(prefix);
returnTrash += "Trash";
returnTrash += GetTrashFolderName();
return ToNewCString(returnTrash);
}
const char * nsImapProtocol::GetTrashFolderName()
{
if (m_trashFolderName.IsEmpty())
{
nsCOMPtr<nsIImapIncomingServer> server = do_QueryReferent(m_server);
if (server)
{
nsXPIDLString trashFolderName;
if (NS_SUCCEEDED(server->GetTrashFolderName(getter_Copies(trashFolderName))))
{
char *trashFolderNameUtf7 = CreateUtf7ConvertedStringFromUnicode(trashFolderName);
if (trashFolderNameUtf7)
{
m_trashFolderName.Assign(trashFolderNameUtf7);
PR_Free(trashFolderNameUtf7);
}
}
}
}
return m_trashFolderName.get();
}
void nsImapProtocol::Lsub(const char *mailboxPattern, PRBool addDirectoryIfNecessary)
{
ProgressEventFunctionUsingId (IMAP_STATUS_LOOKING_FOR_MAILBOX);

Просмотреть файл

@ -387,6 +387,7 @@ private:
PRUint32 m_allocatedSize; // allocated size
PRUint32 m_totalDataSize; // total data size
PRUint32 m_curReadIndex; // current read index
nsCAutoString m_trashFolderName;
// Ouput stream for writing commands to the socket
nsCOMPtr<nsITransport> m_channel;
@ -568,6 +569,7 @@ private:
PRBool MailboxIsNoSelectMailbox(const char *mailboxName);
char * CreatePossibleTrashName(const char *prefix);
const char * GetTrashFolderName();
PRBool FolderNeedsACLInitialized(const char *folderName);
void DiscoverMailboxList();
void DiscoverAllAndSubscribedBoxes();