add support for xmailboxinfo for doing imap sharing admin urls r=naving, sr=sspitzer 123093 and 124011

This commit is contained in:
bienvenu%netscape.com 2002-02-08 02:05:28 +00:00
parent a911b05d03
commit 9f48923e0d
8 changed files with 128 additions and 29 deletions

View File

@ -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);

View File

@ -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;
};

View File

@ -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)

View File

@ -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))

View File

@ -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;

View File

@ -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();

View File

@ -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();

View File

@ -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)
{