fix 175488 we don't recognize some imap folders as special folder if they're under the inbox, r/sr=mscott

git-svn-id: svn://10.0.0.236/trunk@145260 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
bienvenu%nventure.com 2003-07-28 01:03:46 +00:00
parent 22de1e81bb
commit 160b62fbc8
2 changed files with 85 additions and 122 deletions

View File

@ -464,8 +464,8 @@ NS_IMPL_IDPREF_BOOL(AttachSignature, "attach_signature");
NS_IMPL_IDPREF_INT(SignatureDate,"sig_date");
NS_IMPL_IDPREF_BOOL(DoFcc, "fcc");
NS_IMPL_FOLDERPREF_STR(FccFolder, "fcc_folder");
NS_IMPL_FOLDERPREF_STR(FccFolder, "fcc_folder");
NS_IMPL_IDPREF_STR(FccFolderPickerMode, "fcc_folder_picker_mode");
NS_IMPL_IDPREF_STR(DraftsFolderPickerMode, "drafts_folder_picker_mode");
NS_IMPL_IDPREF_STR(TmplFolderPickerMode, "tmpl_folder_picker_mode");
@ -585,74 +585,99 @@ nsMsgIdentity::getFolderPref(const char *prefname, char **retval, PRBool mustHav
rv = setFolderPref(prefname, (const char *)*retval);
}
}
// get the corresponding RDF resource
// RDF will create the folder resource if it doesn't already exist
nsCOMPtr<nsIRDFService> rdf(do_GetService(kRDFServiceCID, &rv));
if (NS_FAILED(rv)) return rv;
nsCOMPtr<nsIRDFResource> resource;
rv = rdf->GetResource(nsDependentCString(*retval), getter_AddRefs(resource));
if (NS_FAILED(rv))
return rv;
nsCOMPtr <nsIMsgFolder> folderResource;
folderResource = do_QueryInterface(resource, &rv);
if (NS_SUCCEEDED(rv) && folderResource)
{
// don't check validity of folder - caller will handle creating it
nsCOMPtr<nsIMsgIncomingServer> server;
//make sure that folder hierarchy is built so that legitimate parent-child relationship is established
rv = folderResource->GetServer(getter_AddRefs(server));
if (server)
{
nsCOMPtr <nsIMsgFolder> msgFolder;
rv = server->GetMsgFolderFromURI(folderResource, *retval, getter_AddRefs(msgFolder));
if (NS_SUCCEEDED(rv))
return msgFolder->GetURI(retval);
}
}
return rv;
}
nsresult
nsMsgIdentity::setFolderPref(const char *prefname, const char *value)
{
nsXPIDLCString oldpref;
nsresult rv;
nsCOMPtr<nsIRDFResource> res;
nsCOMPtr<nsIMsgFolder> folder;
PRUint32 folderflag;
nsCOMPtr<nsIRDFService> rdf(do_GetService(kRDFServiceCID, &rv));
nsXPIDLCString oldpref;
nsresult rv;
nsCOMPtr<nsIRDFResource> res;
nsCOMPtr<nsIMsgFolder> folder;
PRUint32 folderflag;
nsCOMPtr<nsIRDFService> rdf(do_GetService(kRDFServiceCID, &rv));
if (nsCRT::strcmp(prefname, "fcc_folder") == 0)
{
// Clear the temporary return receipt filter so that the new filter
// rule can be recreated (by ConfigureTemporaryReturnReceiptsFilter()).
nsCOMPtr<nsIMsgAccountManager> accountManager =
do_GetService(NS_MSGACCOUNTMANAGER_CONTRACTID, &rv);
NS_ENSURE_SUCCESS(rv,rv);
if (nsCRT::strcmp(prefname, "fcc_folder") == 0)
nsCOMPtr<nsISupportsArray> servers;
rv = accountManager->GetServersForIdentity(this, getter_AddRefs(servers));
NS_ENSURE_SUCCESS(rv,rv);
PRUint32 cnt = 0;
servers->Count(&cnt);
if (cnt > 0)
{
// Clear the temporary return receipt filter so that the new filter
// rule can be recreated (by ConfigureTemporaryReturnReceiptsFilter()).
nsCOMPtr<nsIMsgAccountManager> accountManager =
do_GetService(NS_MSGACCOUNTMANAGER_CONTRACTID, &rv);
NS_ENSURE_SUCCESS(rv,rv);
nsCOMPtr<nsISupportsArray> servers;
rv = accountManager->GetServersForIdentity(this, getter_AddRefs(servers));
NS_ENSURE_SUCCESS(rv,rv);
PRUint32 cnt = 0;
servers->Count(&cnt);
if (cnt > 0)
{
nsCOMPtr<nsISupports> supports = getter_AddRefs(servers->ElementAt(0));
nsCOMPtr<nsIMsgIncomingServer> server = do_QueryInterface(supports,&rv);
if (NS_SUCCEEDED(rv))
server->ClearTemporaryReturnReceiptsFilter(); // okay to fail; no need to check for return code
}
folderflag = MSG_FOLDER_FLAG_SENTMAIL;
nsCOMPtr<nsISupports> supports = getter_AddRefs(servers->ElementAt(0));
nsCOMPtr<nsIMsgIncomingServer> server = do_QueryInterface(supports,&rv);
if (NS_SUCCEEDED(rv))
server->ClearTemporaryReturnReceiptsFilter(); // okay to fail; no need to check for return code
}
else if (nsCRT::strcmp(prefname, "draft_folder") == 0)
folderflag = MSG_FOLDER_FLAG_DRAFTS;
else if (nsCRT::strcmp(prefname, "stationery_folder") == 0)
folderflag = MSG_FOLDER_FLAG_TEMPLATES;
else
return NS_ERROR_FAILURE;
// get the old folder, and clear the special folder flag on it
rv = getFolderPref(prefname, getter_Copies(oldpref), PR_FALSE);
if (NS_SUCCEEDED(rv) && (const char*)oldpref)
folderflag = MSG_FOLDER_FLAG_SENTMAIL;
}
else if (nsCRT::strcmp(prefname, "draft_folder") == 0)
folderflag = MSG_FOLDER_FLAG_DRAFTS;
else if (nsCRT::strcmp(prefname, "stationery_folder") == 0)
folderflag = MSG_FOLDER_FLAG_TEMPLATES;
else
return NS_ERROR_FAILURE;
// get the old folder, and clear the special folder flag on it
rv = getFolderPref(prefname, getter_Copies(oldpref), PR_FALSE);
if (NS_SUCCEEDED(rv) && (const char*)oldpref)
{
rv = rdf->GetResource(oldpref, getter_AddRefs(res));
if (NS_SUCCEEDED(rv) && res)
{
rv = rdf->GetResource(oldpref, getter_AddRefs(res));
if (NS_SUCCEEDED(rv) && res)
{
folder = do_QueryInterface(res, &rv);
if (NS_SUCCEEDED(rv))
rv = folder->ClearFlag(folderflag);
}
folder = do_QueryInterface(res, &rv);
if (NS_SUCCEEDED(rv))
rv = folder->ClearFlag(folderflag);
}
// set the new folder, and set the special folder flags on it
rv = setCharPref(prefname, value);
if (NS_SUCCEEDED(rv))
}
// set the new folder, and set the special folder flags on it
rv = setCharPref(prefname, value);
if (NS_SUCCEEDED(rv))
{
rv = rdf->GetResource(nsDependentCString(value), getter_AddRefs(res));
if (NS_SUCCEEDED(rv) && res)
{
rv = rdf->GetResource(nsDependentCString(value), getter_AddRefs(res));
if (NS_SUCCEEDED(rv) && res)
{
folder = do_QueryInterface(res, &rv);
if (NS_SUCCEEDED(rv))
rv = folder->SetFlag(folderflag);
}
folder = do_QueryInterface(res, &rv);
if (NS_SUCCEEDED(rv))
rv = folder->SetFlag(folderflag);
}
return rv;
}
return rv;
}
NS_IMETHODIMP nsMsgIdentity::SetUnicharAttribute(const char *aName, const PRUnichar *val)

View File

@ -56,9 +56,7 @@
#include "nsMsgComposeStringBundle.h"
#include "nsMsgCompUtils.h"
#include "prcmon.h"
#include "nsImapCore.h"
#include "nsIMsgImapMailFolder.h"
#include "nsIImapIncomingServer.h"
#include "nsIEventQueueService.h"
#include "nsMsgSimulateError.h"
@ -428,12 +426,12 @@ LocateMessageFolder(nsIMsgIdentity *userIdentity,
if (!msgFolder) return NS_ERROR_NULL_POINTER;
*msgFolder = nsnull;
if (!aFolderURI || !*aFolderURI) {
if (!aFolderURI || !*aFolderURI)
return NS_ERROR_INVALID_ARG;
}
// as long as it doesn't start with anyfolder://
if (PL_strncasecmp(ANY_SERVER, aFolderURI, strlen(aFolderURI)) != 0) {
if (PL_strncasecmp(ANY_SERVER, aFolderURI, strlen(aFolderURI)) != 0)
{
nsCOMPtr<nsIRDFService> rdf(do_GetService(kRDFServiceCID, &rv));
if (NS_FAILED(rv)) return rv;
@ -451,68 +449,8 @@ LocateMessageFolder(nsIMsgIdentity *userIdentity,
nsCOMPtr<nsIMsgIncomingServer> server;
//make sure that folder hierarchy is built so that legitimate parent-child relationship is established
rv = folderResource->GetServer(getter_AddRefs(server));
#if 0
// XXX TODO
// JUNK MAIL RELATED
// this should work, but I'm not going to turn it on until I test it more
NS_ENSURE_SUCCESS(rv,rv);
return server->GetMsgFolderFromURI(folderResource, aFolderURI, aMsgFolder);
#else
if (server)
{
nsCOMPtr<nsIMsgFolder> rootMsgFolder;
server->GetRootMsgFolder(getter_AddRefs(rootMsgFolder));
if (rootMsgFolder)
{
nsCOMPtr<nsIImapIncomingServer> imapServer = do_QueryInterface(server);
// Make sure an specific IMAP folder has correct personal namespace
// See bugzilla bug 90494 (http://bugzilla.mozilla.org/show_bug.cgi?id=90494)
PRBool namespacePrefixAdded = PR_FALSE;
nsXPIDLCString folderUriWithNamespace;
if (imapServer)
{
imapServer->GetUriWithNamespacePrefixIfNecessary(kPersonalNamespace, aFolderURI, getter_Copies(folderUriWithNamespace));
if (!folderUriWithNamespace.IsEmpty())
{
rv = rootMsgFolder->GetChildWithURI(folderUriWithNamespace, PR_TRUE, PR_FALSE, msgFolder);
namespacePrefixAdded = PR_TRUE;
}
else
rv = rootMsgFolder->GetChildWithURI(aFolderURI, PR_TRUE, PR_FALSE, msgFolder);
}
else
rv = rootMsgFolder->GetChildWithURI(aFolderURI, PR_TRUE, PR_TRUE /*caseInsensitive*/, msgFolder);
/* we didn't find the folder so we will have to create new one.
CreateIfMissing does that provided we pass in a dummy folder */
if (!*msgFolder)
{
if (namespacePrefixAdded)
{
nsCOMPtr<nsIRDFResource> resource;
rv = rdf->GetResource(folderUriWithNamespace, getter_AddRefs(resource));
if (NS_FAILED(rv)) return rv;
nsCOMPtr <nsIMsgFolder> folderResource;
folderResource = do_QueryInterface(resource, &rv);
if (NS_FAILED(rv)) return rv;
*msgFolder = folderResource;
NS_ADDREF(*msgFolder);
}
else
{
*msgFolder = folderResource;
NS_ADDREF(*msgFolder);
}
}
return rv;
}
else
return NS_MSG_ERROR_FOLDER_MISSING;
}
else
return NS_MSG_ERROR_FOLDER_MISSING;
#endif
return server->GetMsgFolderFromURI(folderResource, aFolderURI, msgFolder);
}
else
{