changes to get news reply to work.

git-svn-id: svn://10.0.0.236/branches/MailNews_Performance_20010208_BRANCH@87594 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
sspitzer%netscape.com
2001-02-21 21:48:06 +00:00
parent b99c7dbb88
commit c9f69a19da
3 changed files with 102 additions and 115 deletions

View File

@@ -169,7 +169,7 @@ nsNewsURI2Path(const char* rootURI, const char* uriStr, nsFileSpec& pathResult)
/* parses NewsMessageURI */
nsresult
nsParseNewsMessageURI(const char* uri, nsCString& messageUriWithoutKey, PRUint32 *key)
nsParseNewsMessageURI(const char* uri, nsCString& folderURI, PRUint32 *key)
{
if(!key)
return NS_ERROR_NULL_POINTER;
@@ -181,7 +181,8 @@ nsParseNewsMessageURI(const char* uri, nsCString& messageUriWithoutKey, PRUint32
PRInt32 keyEndSeparator = uriStr.FindCharInSet("?&",
keySeparator);
uriStr.Left(messageUriWithoutKey, keySeparator);
uriStr.Left(folderURI, keySeparator);
folderURI.Cut(4, 8); // cut out the _message part of news_message:
nsCAutoString keyStr;
if (keyEndSeparator != -1)

View File

@@ -59,6 +59,7 @@
#include "nsIWebNavigation.h"
#include "nsIIOService.h"
#include "nsIPrompt.h"
#include "nsIRDFService.h"
#undef GetPort // XXX Windows!
#undef SetPort // XXX Windows!
@@ -119,14 +120,18 @@ nsNntpService::SaveMessageToDisk(const char *aMessageURI,
printf("nsNntpService::SaveMessageToDisk(%s,...)\n",aMessageURI);
#endif
nsCAutoString uri(aMessageURI);
nsCAutoString uri;
nsCAutoString newsgroupName;
nsMsgKey key = nsMsgKey_None;
if (PL_strncmp(aMessageURI, kNewsMessageRootURI, kNewsMessageRootURILen) == 0)
rv = ConvertNewsMessageURI2NewsURI(aMessageURI, uri, newsgroupName, &key);
else
return NS_ERROR_UNEXPECTED;
if (PL_strncmp(aMessageURI, kNewsMessageRootURI, kNewsMessageRootURILen) == 0) {
rv = ConvertNewsMessageURI2NewsURI(aMessageURI, uri, newsgroupName, nsnull, &key);
NS_ENSURE_SUCCESS(rv,rv);
}
else {
rv = NS_ERROR_UNEXPECTED;
NS_ENSURE_SUCCESS(rv,rv);
}
// now create a url with this uri spec
nsCOMPtr<nsIURI> myuri;
@@ -161,36 +166,24 @@ nsNntpService::DisplayMessage(const char* aMessageURI, nsISupports * aDisplayCon
nsIMsgWindow *aMsgWindow, nsIUrlListener * aUrlListener, const PRUnichar * aCharsetOverride, nsIURI ** aURL)
{
nsresult rv = NS_OK;
if (!aMessageURI) {
return NS_ERROR_NULL_POINTER;
}
NS_ENSURE_ARG_POINTER(aMessageURI);
#ifdef DEBUG_NEWS
printf("nsNntpService::DisplayMessage(%s,...)\n",aMessageURI);
#endif
nsCAutoString uri(aMessageURI);
nsCAutoString newsGroupNameUri(aMessageURI);
nsCAutoString uri;
nsCAutoString newsgroupName;
nsMsgKey key = nsMsgKey_None;
nsCOMPtr <nsIMsgNewsFolder> newsFolder;
if (PL_strncmp(aMessageURI, kNewsMessageRootURI, kNewsMessageRootURILen) == 0) {
rv = ConvertNewsMessageURI2NewsURI(aMessageURI, uri, newsgroupName, &key);
NS_ASSERTION(NS_SUCCEEDED(rv),"failed to convert the news_message:// uri");
rv = ConvertNewsMessageURI2NewsURI(aMessageURI, uri, newsgroupName, getter_AddRefs(newsFolder), &key);
NS_ENSURE_SUCCESS(rv,rv);
}
else {
// todo: if we get here, make sure uri really a news article url (example: "news://host/aa@bb")
#ifdef DEBUG_seth
printf("todo: if we get here, make sure uri really a news article url (example: news://host/aa@bb\n");
#endif
uri = aMessageURI;
}
newsGroupNameUri.ReplaceSubstring("news_message:", "news:");
PRInt32 poundPos = newsGroupNameUri.RFindChar('#', PR_FALSE);
nsCOMPtr <nsIMsgNewsFolder> newsFolder;
if (poundPos != -1)
{
newsGroupNameUri.Truncate(poundPos);
nsGetNewsGroupFromUri(newsGroupNameUri, getter_AddRefs(newsFolder));
}
// now create a url with this uri spec
nsCOMPtr<nsIURI> myuri;
@@ -292,117 +285,97 @@ NS_IMETHODIMP nsNntpService::OpenAttachment(const char *aContentType,
NS_IMETHODIMP nsNntpService::GetUrlForUri(const char *aMessageURI, nsIURI **aURL, nsIMsgWindow *aMsgWindow)
{
nsresult rv = NS_OK;
nsCAutoString uri(aMessageURI);
nsCAutoString uri;
nsCAutoString newsgroupName;
nsMsgKey key = nsMsgKey_None;
if (PL_strncmp(aMessageURI, kNewsMessageRootURI, kNewsMessageRootURILen) == 0)
{
rv = ConvertNewsMessageURI2NewsURI(aMessageURI, uri, newsgroupName, &key);
if (NS_SUCCEEDED(rv))
rv = ConvertNewsMessageURI2NewsURI(aMessageURI, uri, newsgroupName, nsnull, &key);
NS_ENSURE_SUCCESS(rv,rv);
rv = ConstructNntpUrl(uri, newsgroupName, key, nsnull, aMsgWindow, aURL);
NS_ENSURE_SUCCESS(rv,rv);
}
else
else {
rv = NS_ERROR_UNEXPECTED;
NS_ENSURE_SUCCESS(rv,rv);
}
return rv;
}
nsresult nsNntpService::ConvertNewsMessageURI2NewsURI(const char *messageURI, nsCString &newsURI, nsCString &newsgroupName, nsMsgKey *key)
nsresult
nsNntpService::DecomposeNewsMessageURI(const char * aMessageURI, nsIMsgFolder ** aFolder, nsMsgKey *aMsgKey)
{
nsCAutoString hostname;
nsCAutoString messageUriWithoutKey;
NS_ENSURE_ARG_POINTER(aMessageURI);
NS_ENSURE_ARG_POINTER(aFolder);
NS_ENSURE_ARG_POINTER(aMsgKey);
nsresult rv = NS_OK;
nsCAutoString folderURI;
rv = nsParseNewsMessageURI(aMessageURI, folderURI, aMsgKey);
NS_ENSURE_SUCCESS(rv,rv);
nsCOMPtr <nsIRDFService> rdf = do_GetService("@mozilla.org/rdf/rdf-service;1",&rv);
NS_ENSURE_SUCCESS(rv,rv);
nsCOMPtr<nsIRDFResource> res;
rv = rdf->GetResource(folderURI, getter_AddRefs(res));
NS_ENSURE_SUCCESS(rv,rv);
rv = res->QueryInterface(NS_GET_IID(nsIMsgFolder), (void **) aFolder);
NS_ENSURE_SUCCESS(rv,rv);
return NS_OK;
}
// turn news_message://news.mozilla.org/netscape.test#1
// into something like news://news.mozilla.org/3A413309.4080507%40netscape.com
nsresult nsNntpService::ConvertNewsMessageURI2NewsURI(const char *messageURI, nsCString &newsURI, nsCString &newsgroupName, nsIMsgNewsFolder **outFolder, nsMsgKey *key)
{
NS_ENSURE_ARG_POINTER(messageURI);
NS_ENSURE_ARG_POINTER(key);
nsresult rv = NS_OK;
nsCOMPtr <nsIMsgFolder> folder;
// messageURI is of the form: "news_message://news.mcom.com/mcom.linux#1"
// if successful, we should get
// messageUriWithoutKey = "news_message://news.mcom.com/mcom.linux"
// key = 1
rv = nsParseNewsMessageURI(messageURI, messageUriWithoutKey, key);
if (NS_FAILED(rv)) {
return rv;
}
rv = DecomposeNewsMessageURI(messageURI, getter_AddRefs(folder), key);
NS_ENSURE_SUCCESS(rv,rv);
// turn news_message://news.mcom.com/mcom.linux -> news.mcom.com/mcom.linux
// stick "news.mcom.com/mcom.linux" in hostname.
messageUriWithoutKey.Right(hostname, messageUriWithoutKey.Length() - kNewsMessageRootURILen - 1);
// take news.mcom.com/mcom.linux (in hostname) and put
// "mcom.linux" into newsgroupName and truncate to leave
// "news.mcom.com" in hostname
PRInt32 hostEnd = hostname.FindChar('/');
if (hostEnd > 0) {
hostname.Right(newsgroupName, hostname.Length() - hostEnd - 1);
hostname.Truncate(hostEnd);
}
else {
// error!
// we didn't find a "/" in something we thought looked like this:
// news.mcom.com/mcom.linux
return NS_ERROR_FAILURE;
}
#ifdef DEBUG_NEWS
printf("ConvertNewsMessageURI2NewsURI(%s,??) -> %s %u\n", messageURI, newsgroupName.GetBuffer(), *key);
#endif
nsFileSpec pathResult;
rv = nsNewsURI2Path(kNewsMessageRootURI, messageUriWithoutKey, pathResult);
if (NS_FAILED(rv)) {
return rv;
}
nsCOMPtr<nsIMsgDatabase> newsDBFactory;
nsCOMPtr<nsIMsgDatabase> newsDB;
rv = nsComponentManager::CreateInstance(kCNewsDB, nsnull, NS_GET_IID(nsIMsgDatabase), getter_AddRefs(newsDBFactory));
if (NS_FAILED(rv) || (!newsDBFactory)) {
return rv;
}
nsCOMPtr <nsIFileSpec> dbFileSpec;
NS_NewFileSpecWithSpec(pathResult, getter_AddRefs(dbFileSpec));
rv = newsDBFactory->Open(dbFileSpec, PR_TRUE, PR_FALSE, getter_AddRefs(newsDB));
if (NS_FAILED(rv) || (!newsDB)) {
return rv;
}
nsCOMPtr<nsIMsgDBHdr> msgHdr;
rv = newsDB->GetMsgHdrForKey((nsMsgKey) *key, getter_AddRefs(msgHdr));
if (NS_FAILED(rv) || (!msgHdr)) {
return rv;
}
nsCOMPtr <nsIMsgDBHdr> msgHdr;
rv = folder->GetMessageHeader(*key, getter_AddRefs(msgHdr));
NS_ENSURE_SUCCESS(rv,rv);
nsXPIDLCString messageId;
rv = msgHdr->GetMessageId(getter_Copies(messageId));
NS_ENSURE_SUCCESS(rv,rv);
#ifdef DEBUG_NEWS
PRUint32 bytes;
PRUint32 lines;
rv = msgHdr->GetMessageSize(&bytes);
rv = msgHdr->GetLineCount(&lines);
nsCOMPtr <nsIMsgIncomingServer> server;
rv = folder->GetServer(getter_AddRefs(server));
NS_ENSURE_SUCCESS(rv,rv);
printf("bytes = %u\n",bytes);
printf("lines = %u\n",lines);
#endif
nsCOMPtr <nsIMsgNewsFolder> newsFolder = do_QueryInterface(folder, &rv);
NS_ENSURE_SUCCESS(rv,rv);
if (NS_FAILED(rv)) {
return rv;
}
nsXPIDLCString name;
rv = newsFolder->GetAsciiName(getter_Copies(name));
NS_ENSURE_SUCCESS(rv,rv);
newsgroupName = (const char *) name;
newsURI = kNewsRootURI;
newsURI += "/";
newsURI += hostname;
nsXPIDLCString serverURI;
rv = server->GetServerURI(getter_Copies(serverURI));
NS_ENSURE_SUCCESS(rv,rv);
newsURI = (const char *)serverURI;
newsURI += "/";
newsURI += (const char*)messageId;
#ifdef DEBUG_NEWS
printf("newsURI = %s\n", (const char *)nsCAutoString(newsURI));
#endif
if (outFolder) {
*outFolder = newsFolder;
NS_IF_ADDREF(*outFolder);
}
return NS_OK;
}
@@ -1635,5 +1608,17 @@ nsNntpService::HandleContent(const char * aContentType, const char * aCommand, c
NS_IMETHODIMP
nsNntpService::MessageURIToMsgHdr(const char *uri, nsIMsgDBHdr **_retval)
{
return NS_ERROR_NOT_IMPLEMENTED;
NS_ENSURE_ARG_POINTER(uri);
NS_ENSURE_ARG_POINTER(_retval);
nsresult rv = NS_OK;
nsCOMPtr <nsIMsgFolder> folder;
nsMsgKey msgKey;
rv = DecomposeNewsMessageURI(uri, getter_AddRefs(folder), &msgKey);
NS_ENSURE_SUCCESS(rv,rv);
rv = folder->GetMessageHeader(msgKey, _retval);
NS_ENSURE_SUCCESS(rv,rv);
return NS_OK;
}

View File

@@ -68,6 +68,7 @@ protected:
nsresult ConvertNewsMessageURI2NewsURI(const char *messageURI,
nsCString &newsURI,
nsCString &newsgroupName,
nsIMsgNewsFolder **outFolder,
nsMsgKey *aKey);
nsresult SetUpNntpUrlForPosting(nsINntpUrl * nntpUrl, const char *newsgroupNames, const char *newshost, char **newsUrlSpec);
@@ -81,7 +82,7 @@ protected:
// a convience routine to run news urls
nsresult RunNewsUrl (nsIURI * aUrl, nsIMsgWindow *aMsgWindow, nsISupports * aConsumer);
static PRBool findNewsServerWithGroup(nsISupports *aElement, void *data);
nsresult DecomposeNewsMessageURI(const char * aMessageURI, nsIMsgFolder ** aFolder, nsMsgKey *aMsgKey);
PRBool mPrintingOperation; // Flag for printing operations
PRBool mOpenAttachmentOperation; // Flag for opening attachments