From 1eace18e91d3374f998db18ba60a28542e49bccb Mon Sep 17 00:00:00 2001 From: "yokoyama%netscape.com" Date: Fri, 22 Jun 2001 01:28:18 +0000 Subject: [PATCH] Bug : 58866 Remove AssignWithConversion() which corrupts non-ASCII filename and replace with FS charset converter. r=ftang. sr=mscott ask a=chofmann --- docshell/base/nsDefaultURIFixup.cpp | 61 +++++++++++++++++++++++------ docshell/base/nsDefaultURIFixup.h | 3 +- 2 files changed, 52 insertions(+), 12 deletions(-) diff --git a/docshell/base/nsDefaultURIFixup.cpp b/docshell/base/nsDefaultURIFixup.cpp index 826953e5b42f..064a7c9af649 100644 --- a/docshell/base/nsDefaultURIFixup.cpp +++ b/docshell/base/nsDefaultURIFixup.cpp @@ -127,25 +127,20 @@ nsresult nsDefaultURIFixup::FileURIFixup(const PRUnichar* aStringURI, nsIURI** aURI) { nsAutoString uriSpecIn(aStringURI); - nsAutoString uriSpecOut(aStringURI); + nsCAutoString uriSpecOut; nsresult rv = ConvertFileToStringURI(uriSpecIn, uriSpecOut); if (NS_SUCCEEDED(rv)) { - // if this is file url, we need to convert the URI - // from Unicode to the FS charset - nsCAutoString inFSCharset; - NS_ENSURE_SUCCESS(ConvertStringURIToFileCharset(uriSpecOut, inFSCharset), - NS_ERROR_FAILURE); - - if(NS_SUCCEEDED(NS_NewURI(aURI, inFSCharset.get(), nsnull))) + // if this is file url, uriSpecOut is already in FS charset + if(NS_SUCCEEDED(NS_NewURI(aURI, uriSpecOut.get(), nsnull))) return NS_OK; } return NS_ERROR_FAILURE; } nsresult nsDefaultURIFixup::ConvertFileToStringURI(nsString& aIn, - nsString& aOut) + nsCString& aOut) { PRBool attemptFixup = PR_FALSE; @@ -176,13 +171,42 @@ nsresult nsDefaultURIFixup::ConvertFileToStringURI(nsString& aIn, // platform. nsCOMPtr filePath; - nsCAutoString file; file.AssignWithConversion(aIn); + nsCAutoString file; + + // this is not the real fix but a temporary fix + // in order to really fix the problem, we need to change the + // nsICmdLineService interface to use wstring to pass paramenters + // instead of string since path name and other argument could be + // in non ascii.(see bug 87127) Since it is too risky to make interface change right + // now, we decide not to do so now. + // Therefore, the aIn we receive here maybe already in damage form + // (e.g. treat every bytes as ISO-8859-1 and cast up to PRUnichar + // while the real data could be in file system charset ) + // we choice the following logic which will work for most of the case. + // Case will still failed only if it meet ALL the following condiction: + // 1. running on CJK, Russian, or Greek system, and + // 2. user type it from URL bar + // 3. the file name contains character in the range of + // U+00A1-U+00FF but encode as different code point in file + // system charset (e.g. ACP on window)- this is very rare case + // We should remove this logic and convert to File system charset here + // once we change nsICmdLineService to use wstring and ensure + // all the Unicode data come in is correctly converted. + if (PossiblyByteExpandedFileName(aIn)) { + // removes high byte + file.AssignWithConversion(aIn); + } + else { + // converts from Unicode to FS Charset + ConvertStringURIToFileCharset(aIn, file); + } + nsresult rv = NS_NewLocalFile(file, PR_FALSE, getter_AddRefs(filePath)); if (NS_SUCCEEDED(rv)) { nsXPIDLCString fileurl; filePath->GetURL(getter_Copies(fileurl)); - aOut.AssignWithConversion(fileurl); + aOut.Assign(fileurl); return NS_OK; } } @@ -190,6 +214,21 @@ nsresult nsDefaultURIFixup::ConvertFileToStringURI(nsString& aIn, return NS_ERROR_FAILURE; } +PRBool nsDefaultURIFixup::PossiblyByteExpandedFileName(nsString& aIn) +{ + // XXXXX HACK XXXXX : please don't copy this code. + // There are cases where aIn contains the locale byte chars padded to short + // (thus the name "ByteExpanded"); whereas other cases + // have proper Unicode code points. + // This is a temporary fix. Please refer to 58866, 86948 + const PRUnichar* uniChar = aIn.get(); + for (PRUint32 i = 0; i < aIn.Length(); i++) { + if ((uniChar[i] >= 0x0080) && (uniChar[i] <= 0x00FF)) { + return PR_TRUE; + } + } + return PR_FALSE; +} nsresult nsDefaultURIFixup::ConvertStringURIToFileCharset(nsString& aIn, nsCString& aOut) diff --git a/docshell/base/nsDefaultURIFixup.h b/docshell/base/nsDefaultURIFixup.h index f1742536d73a..9b6deea60ccf 100644 --- a/docshell/base/nsDefaultURIFixup.h +++ b/docshell/base/nsDefaultURIFixup.h @@ -45,9 +45,10 @@ protected: private: /* additional members */ nsresult FileURIFixup(const PRUnichar* aStringURI, nsIURI** aURI); - nsresult ConvertFileToStringURI(nsString& aIn, nsString& aOut); + nsresult ConvertFileToStringURI(nsString& aIn, nsCString& aOut); nsresult ConvertStringURIToFileCharset(nsString& aIn, nsCString& aOut); nsresult KeywordURIFixup(const PRUnichar* aStringURI, nsIURI** aURI); + PRBool PossiblyByteExpandedFileName(nsString& aIn); nsCOMPtr mPrefs; };