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:
parent
22de1e81bb
commit
160b62fbc8
@ -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)
|
||||
|
||||
@ -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
|
||||
{
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user