From c9f69a19da7754df52f2d4081cb8b20a51b6c41b Mon Sep 17 00:00:00 2001 From: "sspitzer%netscape.com" Date: Wed, 21 Feb 2001 21:48:06 +0000 Subject: [PATCH] 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 --- mozilla/mailnews/news/src/nsNewsUtils.cpp | 5 +- mozilla/mailnews/news/src/nsNntpService.cpp | 209 +++++++++----------- mozilla/mailnews/news/src/nsNntpService.h | 3 +- 3 files changed, 102 insertions(+), 115 deletions(-) diff --git a/mozilla/mailnews/news/src/nsNewsUtils.cpp b/mozilla/mailnews/news/src/nsNewsUtils.cpp index 30c94186908..e003fe66951 100644 --- a/mozilla/mailnews/news/src/nsNewsUtils.cpp +++ b/mozilla/mailnews/news/src/nsNewsUtils.cpp @@ -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) diff --git a/mozilla/mailnews/news/src/nsNntpService.cpp b/mozilla/mailnews/news/src/nsNntpService.cpp index 3643a00881b..13ac416dfc1 100644 --- a/mozilla/mailnews/news/src/nsNntpService.cpp +++ b/mozilla/mailnews/news/src/nsNntpService.cpp @@ -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 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 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 newsFolder; - if (poundPos != -1) - { - newsGroupNameUri.Truncate(poundPos); - nsGetNewsGroupFromUri(newsGroupNameUri, getter_AddRefs(newsFolder)); - } + // now create a url with this uri spec nsCOMPtr 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 rdf = do_GetService("@mozilla.org/rdf/rdf-service;1",&rv); + NS_ENSURE_SUCCESS(rv,rv); + + nsCOMPtr 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 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 newsDBFactory; - nsCOMPtr newsDB; - - rv = nsComponentManager::CreateInstance(kCNewsDB, nsnull, NS_GET_IID(nsIMsgDatabase), getter_AddRefs(newsDBFactory)); - if (NS_FAILED(rv) || (!newsDBFactory)) { - return rv; - } - - nsCOMPtr 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 msgHdr; - - rv = newsDB->GetMsgHdrForKey((nsMsgKey) *key, getter_AddRefs(msgHdr)); - if (NS_FAILED(rv) || (!msgHdr)) { - return rv; - } + nsCOMPtr 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 server; + rv = folder->GetServer(getter_AddRefs(server)); + NS_ENSURE_SUCCESS(rv,rv); - printf("bytes = %u\n",bytes); - printf("lines = %u\n",lines); -#endif + nsCOMPtr 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 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; } diff --git a/mozilla/mailnews/news/src/nsNntpService.h b/mozilla/mailnews/news/src/nsNntpService.h index 7f618a21810..bd6393b9f91 100644 --- a/mozilla/mailnews/news/src/nsNntpService.h +++ b/mozilla/mailnews/news/src/nsNntpService.h @@ -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