From bbfc394a4afb75293f3c5ced25d66e4c6d657d20 Mon Sep 17 00:00:00 2001 From: "nhotta%netscape.com" Date: Fri, 22 Sep 2000 23:58:19 +0000 Subject: [PATCH] Changed to escape folder name to prevent 8 bit data from bad conversions, also changed to apply correct conversions (UTF-8 for RDF, OS native charset for file name), bug 52165, r=putterman, a=alecf. --- mailnews/base/util/nsMsgUtils.cpp | 13 ++++++++++++- mailnews/local/src/nsLocalMailFolder.cpp | 17 +++++++---------- mailnews/local/src/nsMailboxService.cpp | 11 ++++++++++- mailnews/local/src/nsParseMailbox.cpp | 6 +++++- 4 files changed, 34 insertions(+), 13 deletions(-) diff --git a/mailnews/base/util/nsMsgUtils.cpp b/mailnews/base/util/nsMsgUtils.cpp index a060b0e8515..0fe7fbdf34d 100644 --- a/mailnews/base/util/nsMsgUtils.cpp +++ b/mailnews/base/util/nsMsgUtils.cpp @@ -36,6 +36,7 @@ #include "nsMsgLocalCID.h" #include "nsMsgBaseCID.h" #include "nsMsgImapCID.h" +#include "nsMsgI18N.h" static NS_DEFINE_CID(kImapUrlCID, NS_IMAPURL_CID); static NS_DEFINE_CID(kCMailboxUrl, NS_MAILBOXURL_CID); @@ -336,7 +337,17 @@ nsresult NS_MsgHashIfNecessary(nsCAutoString &name) nsresult NS_MsgCreatePathStringFromFolderURI(const char *folderURI, nsCString& pathString) { - nsCAutoString oldPath(folderURI); + // A file name has to be in native charset, convert from UTF-8. + nsCAutoString oldPath; + const nsString fileCharset(nsMsgI18NFileSystemCharset()); + char *nativeString; + nsresult rv = ConvertFromUnicode(fileCharset, nsAutoString(NS_ConvertUTF8toUCS2(folderURI)), &nativeString); + if (NS_SUCCEEDED(rv)) + oldPath.Assign(nativeString); + else + oldPath.Assign(folderURI); + PR_FREEIF(nativeString); + nsCAutoString pathPiece; PRInt32 startSlashPos = oldPath.FindChar('/'); diff --git a/mailnews/local/src/nsLocalMailFolder.cpp b/mailnews/local/src/nsLocalMailFolder.cpp index 6563e0965d7..a60eff689db 100644 --- a/mailnews/local/src/nsLocalMailFolder.cpp +++ b/mailnews/local/src/nsLocalMailFolder.cpp @@ -509,18 +509,15 @@ NS_IMETHODIMP nsMsgLocalMailFolder::AddSubfolder(nsAutoString *name, nsCAutoString uri(mURI); uri.Append('/'); - // Convert from Unicode to filesystem charactorset - // XXX URI should use UTF-8? + // URI should use UTF-8 // (see RFC2396 Uniform Resource Identifiers (URI): Generic Syntax) - const nsString fileCharset(nsMsgI18NFileSystemCharset()); - char *convertedName; - rv = ConvertFromUnicode(fileCharset, *name, &convertedName); - if (NS_FAILED(rv)) - return rv; - - uri.Append(convertedName); - PR_Free((void*) convertedName); + char *escapedName = nsEscape(NS_ConvertUCS2toUTF8(name->GetUnicode()), url_Path); + if (escapedName) + { + uri.Append(escapedName); + PR_FREEIF(escapedName); + } nsCOMPtr res; rv = rdf->GetResource(uri.GetBuffer(), getter_AddRefs(res)); diff --git a/mailnews/local/src/nsMailboxService.cpp b/mailnews/local/src/nsMailboxService.cpp index a7b8bd87d7b..5ceca0a7bf9 100644 --- a/mailnews/local/src/nsMailboxService.cpp +++ b/mailnews/local/src/nsMailboxService.cpp @@ -308,8 +308,17 @@ nsresult nsMailboxService::PrepareMessageUrl(const char * aSrcMsgMailboxURI, nsI nsFileSpec folderPath; nsMsgKey msgKey; const char *part = PL_strstr(aSrcMsgMailboxURI, "part="); - rv = nsParseLocalMessageURI(aSrcMsgMailboxURI, folderURI, &msgKey); + + // Unescape folder name + char *unescapedFolderURI = nsCRT::strdup(folderURI); + if (unescapedFolderURI) + { + nsUnescape(unescapedFolderURI); + folderURI.Assign(unescapedFolderURI); + PR_Free(unescapedFolderURI); + } + rv = nsLocalURI2Path(kMailboxMessageRootURI, folderURI, folderPath); if (NS_SUCCEEDED(rv)) diff --git a/mailnews/local/src/nsParseMailbox.cpp b/mailnews/local/src/nsParseMailbox.cpp index 450c11411c8..612101f52a4 100644 --- a/mailnews/local/src/nsParseMailbox.cpp +++ b/mailnews/local/src/nsParseMailbox.cpp @@ -49,6 +49,7 @@ #include "nsRDFCID.h" #include "nsIPref.h" #include "nsIRDFService.h" +#include "nsMsgI18N.h" static NS_DEFINE_CID(kCMailDB, NS_MAILDB_CID); @@ -103,7 +104,10 @@ NS_IMETHODIMP nsMsgMailboxParser::OnStartRequest(nsIChannel * /* aChannel */, ns nsXPIDLCString tempfolder; rv = ioServ->Unescape(folderName, getter_Copies(tempfolder)); - m_folderName.Assign(NS_ConvertUTF8toUCS2(tempfolder)); + // convert from OS native charset to unicode + rv = ConvertToUnicode(nsMsgI18NFileSystemCharset(), tempfolder, m_folderName); + if (NS_FAILED(rv)) + m_folderName.AssignWithConversion(tempfolder); if (fileName) {