mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-02 12:07:52 +00:00
add support for xmailboxinfo for doing imap sharing admin urls r=naving, sr=sspitzer 123093 and 124011
This commit is contained in:
parent
a911b05d03
commit
9f48923e0d
@ -237,6 +237,11 @@ interface nsIImapService : nsISupports
|
||||
in nsIUrlListener aUrlListener);
|
||||
|
||||
|
||||
nsIURI getFolderAdminUrl(in nsIEventQueue aClientEventQueue,
|
||||
in nsIMsgFolder aMailFolder,
|
||||
in nsIMsgWindow aMsgWindow,
|
||||
in nsIUrlListener aUrlListener);
|
||||
|
||||
void getListOfFoldersOnServer(in nsIImapIncomingServer aServer, in nsIMsgWindow aMsgWindow);
|
||||
void getListOfFoldersWithPath(in nsIImapIncomingServer aServer, in nsIMsgWindow aMsgWindow, in string folderPath);
|
||||
|
||||
|
@ -84,6 +84,7 @@ interface nsIMsgImapMailFolder : nsISupports {
|
||||
attribute unsigned long aclFlags;
|
||||
attribute boolean isNamespace;
|
||||
readonly attribute boolean canIOpenThisFolder;
|
||||
attribute string adminUrl;
|
||||
readonly attribute boolean hasAdminUrl;
|
||||
};
|
||||
|
||||
|
@ -1571,8 +1571,20 @@ NS_IMETHODIMP nsImapIncomingServer::FolderIsNoSelect(const char *aFolderName, P
|
||||
|
||||
NS_IMETHODIMP nsImapIncomingServer::SetFolderAdminURL(const char *aFolderName, const char *aFolderAdminUrl)
|
||||
{
|
||||
nsresult rv = NS_ERROR_FAILURE;
|
||||
return rv;
|
||||
nsCOMPtr <nsIFolder> rootFolder;
|
||||
nsresult rv = GetRootFolder(getter_AddRefs(rootFolder));
|
||||
if(NS_SUCCEEDED(rv) && rootFolder)
|
||||
{
|
||||
nsCOMPtr <nsIMsgImapMailFolder> imapRoot = do_QueryInterface(rootFolder);
|
||||
if (imapRoot)
|
||||
{
|
||||
nsCOMPtr <nsIMsgImapMailFolder> foundFolder;
|
||||
rv = imapRoot->FindOnlineSubFolder(aFolderName, getter_AddRefs(foundFolder));
|
||||
if (NS_SUCCEEDED(rv) && foundFolder)
|
||||
return foundFolder->SetAdminUrl(aFolderAdminUrl);
|
||||
}
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsImapIncomingServer::SubscribeUpgradeFinished(PRBool bringUpSubscribeUI)
|
||||
|
@ -3139,21 +3139,29 @@ NS_IMETHODIMP nsImapMailFolder::FolderPrivileges(nsIMsgWindow *window)
|
||||
nsresult rv = NS_ERROR_NULL_POINTER; // if no window...
|
||||
if (window)
|
||||
{
|
||||
nsXPIDLCString manageMailAccountUrl;
|
||||
rv = GetServerAdminUrl(getter_Copies(manageMailAccountUrl));
|
||||
if (NS_SUCCEEDED(rv) && manageMailAccountUrl.Length())
|
||||
if (!m_adminUrl.IsEmpty())
|
||||
{
|
||||
nsCOMPtr <nsIDocShell> docShell;
|
||||
rv = window->GetRootDocShell(getter_AddRefs(docShell));
|
||||
if (NS_SUCCEEDED(rv) && docShell)
|
||||
{
|
||||
nsCOMPtr<nsIURI> uri;
|
||||
if (NS_FAILED(rv = NS_NewURI(getter_AddRefs(uri), manageMailAccountUrl.get())))
|
||||
if (NS_FAILED(rv = NS_NewURI(getter_AddRefs(uri), m_adminUrl.get())))
|
||||
return rv;
|
||||
rv = docShell->LoadURI(uri, nsnull, nsIWebNavigation::LOAD_FLAGS_IS_LINK);
|
||||
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
nsCOMPtr<nsIImapService> imapService(do_GetService(kCImapService, &rv));
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
// selecting the folder with m_downloadingFolderForOfflineUse true will cause
|
||||
// us to fetch any message bodies we don't have.
|
||||
rv = imapService->GetFolderAdminUrl(m_eventQueue, this, window, this, nsnull);
|
||||
if (NS_SUCCEEDED(rv))
|
||||
m_urlRunning = PR_TRUE;
|
||||
}
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
@ -3167,6 +3175,18 @@ NS_IMETHODIMP nsImapMailFolder::GetHasAdminUrl(PRBool *aBool)
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsImapMailFolder::GetAdminUrl(char **aResult)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(aResult);
|
||||
*aResult = ToNewCString(m_adminUrl);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsImapMailFolder::SetAdminUrl(const char *adminUrl)
|
||||
{
|
||||
m_adminUrl = adminUrl;
|
||||
return NS_OK;
|
||||
}
|
||||
nsresult nsImapMailFolder::MoveIncorporatedMessage(nsIMsgDBHdr *mailHdr,
|
||||
nsIMsgDatabase *sourceDB,
|
||||
const char *destFolderUri,
|
||||
@ -4228,6 +4248,11 @@ nsImapMailFolder::OnStopRunningUrl(nsIURI *aUrl, nsresult aExitCode)
|
||||
|
||||
}
|
||||
break;
|
||||
case nsIImapUrl::nsImapRefreshFolderUrls:
|
||||
// we finished getting an admin url for the folder.
|
||||
if (!m_adminUrl.IsEmpty())
|
||||
FolderPrivileges(aWindow);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@ -4674,15 +4699,16 @@ nsImapMailFolder::FillInFolderProps(nsIMsgImapFolderProps *aFolderProps)
|
||||
rv = bundle->FormatStringFromID(IMAP_OTHER_USERS_FOLDER_TYPE_DESCRIPTION, params, 1, getter_Copies(folderTypeDesc));
|
||||
}
|
||||
|
||||
// personal folder - 4.x distinguished between shared and not personal folders,
|
||||
// but put up the same folder type, so we don't need to distinguish here, I guess.
|
||||
// else if (GetFolderACL()->GetIsFolderShared())
|
||||
// folderTypeStringID = IMAP_PERSONAL_SHARED_FOLDER_TYPE_NAME;
|
||||
else
|
||||
if (GetFolderACL()->GetIsFolderShared())
|
||||
{
|
||||
folderTypeStringID = IMAP_PERSONAL_SHARED_FOLDER_TYPE_NAME;
|
||||
folderTypeDescStringID = IMAP_PERSONAL_SHARED_FOLDER_TYPE_DESCRIPTION;
|
||||
}
|
||||
else
|
||||
{
|
||||
folderTypeStringID = IMAP_PERSONAL_SHARED_FOLDER_TYPE_NAME;
|
||||
folderTypeDescStringID = IMAP_PERSONAL_FOLDER_TYPE_DESCRIPTION;
|
||||
}
|
||||
|
||||
rv = IMAPGetStringByID(folderTypeStringID, getter_Copies(folderType));
|
||||
if (NS_SUCCEEDED(rv))
|
||||
|
@ -463,6 +463,7 @@ protected:
|
||||
nsCString m_ownerUserName; // username of the "other user," as in
|
||||
// "Other Users' Mailboxes"
|
||||
|
||||
nsCString m_adminUrl; // url to run to set admin privileges for this folder
|
||||
nsIMAPNamespace *m_namespace; // Opaque pointer to the IMAP namespace for this folder
|
||||
// Use libnet accessors for various namespace functionality
|
||||
PRPackedBool m_verifiedAsOnlineFolder;
|
||||
|
@ -5173,7 +5173,7 @@ void nsImapProtocol::XMailboxInfo(const char *mailboxName)
|
||||
|
||||
command.Append(" XMAILBOXINFO \"");
|
||||
command.Append(mailboxName);
|
||||
command.Append("\" MANAGEURL POSTURL" CRLF);
|
||||
command.Append("\" MANAGEURL POSTURL" CRLF);
|
||||
|
||||
nsresult rv = SendData(command.get());
|
||||
if (NS_SUCCEEDED(rv))
|
||||
@ -5286,6 +5286,29 @@ PRBool nsImapProtocol::MailboxIsNoSelectMailbox(const char *mailboxName)
|
||||
return rv;
|
||||
}
|
||||
|
||||
nsresult nsImapProtocol::SetFolderAdminUrl(const char *mailboxName)
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
nsIMAPNamespace *nsForMailbox = nsnull;
|
||||
m_hostSessionList->GetNamespaceForMailboxForHost(GetImapServerKey(),
|
||||
mailboxName, nsForMailbox);
|
||||
|
||||
nsXPIDLCString name;
|
||||
|
||||
if (nsForMailbox)
|
||||
m_runningUrl->AllocateCanonicalPath(mailboxName,
|
||||
nsForMailbox->GetDelimiter(),
|
||||
getter_Copies(name));
|
||||
else
|
||||
m_runningUrl->AllocateCanonicalPath(mailboxName,
|
||||
kOnlineHierarchySeparatorUnknown,
|
||||
getter_Copies(name));
|
||||
|
||||
if (m_imapServerSink)
|
||||
rv = m_imapServerSink->SetFolderAdminURL(name, GetServerStateParser().GetManageFolderUrl());
|
||||
return rv;
|
||||
}
|
||||
// returns PR_TRUE is the delete succeeded (regardless of subscription changes)
|
||||
PRBool nsImapProtocol::DeleteMailboxRespectingSubscriptions(const char *mailboxName)
|
||||
{
|
||||
@ -6426,11 +6449,9 @@ void nsImapProtocol::ProcessAuthenticatedStateURL()
|
||||
break;
|
||||
case nsIImapUrl::nsImapRefreshFolderUrls:
|
||||
sourceMailbox = OnCreateServerSourceFolderPathString();
|
||||
#ifdef UNREADY_CODE
|
||||
XMailboxInfo(sourceMailbox);
|
||||
if (GetServerStateParser().LastCommandSuccessful())
|
||||
InitializeFolderUrl(sourceMailbox);
|
||||
#endif
|
||||
SetFolderAdminUrl(sourceMailbox);
|
||||
break;
|
||||
case nsIImapUrl::nsImapDeleteFolder:
|
||||
sourceMailbox = OnCreateServerSourceFolderPathString();
|
||||
|
@ -305,6 +305,7 @@ public:
|
||||
// Clears all rights for a given folder, for all users.
|
||||
void ClearAllFolderRights(const char *mailboxName, nsIMAPNamespace *nsForMailbox);
|
||||
|
||||
nsresult SetFolderAdminUrl(const char *mailboxName);
|
||||
void WaitForFEEventCompletion();
|
||||
void HandleMemoryFailure();
|
||||
void HandleCurrentUrlError();
|
||||
|
@ -3146,20 +3146,6 @@ char *CreateIMAPStatusFolderURL(const char *imapHost, const char *mailboxName, c
|
||||
|
||||
}
|
||||
|
||||
/* Refresh the admin url for a folder on the given IMAP host */
|
||||
char *CreateIMAPRefreshFolderURLs(const char *imapHost, const char *mailboxName, char delimiter)
|
||||
{
|
||||
static const char *formatString = "refreshfolderurls>%c%s";
|
||||
|
||||
char *returnString = createStartOfIMAPurl(imapHost, nsCRT::strlen(formatString) + nsCRT::strlen(mailboxName));
|
||||
if (returnString)
|
||||
sprintf(returnString + nsCRT::strlen(returnString), formatString, delimiter, mailboxName);
|
||||
/* Reviewed 4.51 safe use of sprintf */
|
||||
|
||||
return returnString;
|
||||
|
||||
}
|
||||
|
||||
/* Force the reload of all parts of the message given in url */
|
||||
char *IMAP_CreateReloadAllPartsUrl(const char *url)
|
||||
{
|
||||
@ -3667,6 +3653,52 @@ nsImapService::UnsubscribeFolder(nsIEventQueue* eventQueue,
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsImapService::GetFolderAdminUrl(nsIEventQueue *aClientEventQueue,
|
||||
nsIMsgFolder *anImapFolder,
|
||||
nsIMsgWindow *aMsgWindow,
|
||||
nsIUrlListener *aUrlListener,
|
||||
nsIURI** aURL)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(aClientEventQueue);
|
||||
NS_ENSURE_ARG_POINTER(anImapFolder);
|
||||
NS_ENSURE_ARG_POINTER(aMsgWindow);
|
||||
nsCOMPtr<nsIImapUrl> imapUrl;
|
||||
nsCAutoString urlSpec;
|
||||
nsresult rv;
|
||||
PRUnichar hierarchySeparator = GetHierarchyDelimiter(anImapFolder);
|
||||
rv = CreateStartOfImapUrl(nsnull, getter_AddRefs(imapUrl), anImapFolder, aUrlListener, urlSpec, hierarchySeparator);
|
||||
|
||||
if (NS_SUCCEEDED(rv) && imapUrl)
|
||||
{
|
||||
// nsImapUrl::SetSpec() will set the imap action properly
|
||||
rv = imapUrl->SetImapAction(nsIImapUrl::nsImapRefreshFolderUrls);
|
||||
|
||||
nsCOMPtr <nsIMsgMailNewsUrl> mailNewsUrl = do_QueryInterface(imapUrl);
|
||||
mailNewsUrl->SetMsgWindow(aMsgWindow);
|
||||
mailNewsUrl->SetUpdatingFolder(PR_TRUE);
|
||||
imapUrl->AddChannelToLoadGroup();
|
||||
rv = SetImapUrlSink(anImapFolder, imapUrl);
|
||||
|
||||
if (NS_SUCCEEDED(rv))
|
||||
{
|
||||
nsXPIDLCString folderName;
|
||||
GetFolderName(anImapFolder, getter_Copies(folderName));
|
||||
urlSpec.Append("/refreshfolderurls>");
|
||||
urlSpec.AppendWithConversion(hierarchySeparator);
|
||||
urlSpec.Append((const char *) folderName);
|
||||
rv = mailNewsUrl->SetSpec(urlSpec.get());
|
||||
if (NS_SUCCEEDED(rv))
|
||||
rv = GetImapConnectionAndLoadUrl(aClientEventQueue,
|
||||
imapUrl,
|
||||
nsnull,
|
||||
aURL);
|
||||
}
|
||||
} // if we have a url to run....
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsImapService::DownloadMessagesForOffline(const char *messageIds, nsIMsgFolder *aFolder, nsIUrlListener *aUrlListener, nsIMsgWindow *aMsgWindow)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user