diff --git a/content/html/content/src/nsFormSubmission.cpp b/content/html/content/src/nsFormSubmission.cpp
index 3fe58d7a4e1..3ea7f5da5ae 100644
--- a/content/html/content/src/nsFormSubmission.cpp
+++ b/content/html/content/src/nsFormSubmission.cpp
@@ -35,6 +35,7 @@
#include "nsDOMError.h"
#include "nsHTMLValue.h"
#include "nsGenericElement.h"
+#include "nsISaveAsCharset.h"
// JBK added for submit move from content frame
#include "nsIFile.h"
@@ -46,7 +47,6 @@ static NS_DEFINE_CID(kFormProcessorCID, NS_FORMPROCESSOR_CID);
#include "nsIURI.h"
#include "nsNetUtil.h"
static NS_DEFINE_CID(kIOServiceCID, NS_IOSERVICE_CID);
-#include "nsIUnicodeEncoder.h"
#include "nsIPref.h"
#include "nsSpecialSystemDirectory.h"
#include "nsLinebreakConverter.h"
@@ -82,7 +82,7 @@ class nsFormSubmission : public nsIFormSubmission {
public:
nsFormSubmission(const nsAString& aCharset,
- nsIUnicodeEncoder* aEncoder,
+ nsISaveAsCharset* aEncoder,
nsIFormProcessor* aFormProcessor,
PRInt32 aBidiOptions)
: mCharset(aCharset),
@@ -115,10 +115,10 @@ protected:
// Encoding Helpers
char* EncodeVal(const nsAString& aIn);
char* UnicodeToNewBytes(const PRUnichar* aSrc, PRUint32 aLen,
- nsIUnicodeEncoder* aEncoder);
+ nsISaveAsCharset* aEncoder);
nsString mCharset;
- nsCOMPtr mEncoder;
+ nsCOMPtr mEncoder;
nsCOMPtr mFormProcessor;
PRInt32 mBidiOptions;
@@ -129,9 +129,8 @@ public:
nsAString& oCharset);
static nsresult GetEncoder(nsIForm* form,
nsIPresContext* aPresContext,
- PRUint8 aCtrlsModAtSubmit,
const nsAString& aCharset,
- nsIUnicodeEncoder** encoder);
+ nsISaveAsCharset** encoder);
static nsresult GetEnumAttr(nsIForm* form, nsIAtom* atom, PRInt32* aValue);
};
@@ -143,7 +142,7 @@ class nsFSURLEncoded : public nsFormSubmission
{
public:
nsFSURLEncoded(const nsAString& aCharset,
- nsIUnicodeEncoder* aEncoder,
+ nsISaveAsCharset* aEncoder,
nsIFormProcessor* aFormProcessor,
PRInt32 aBidiOptions,
PRInt32 aMethod)
@@ -361,7 +360,7 @@ class nsFSMultipartFormData : public nsFormSubmission
{
public:
nsFSMultipartFormData(const nsAString& aCharset,
- nsIUnicodeEncoder* aEncoder,
+ nsISaveAsCharset* aEncoder,
nsIFormProcessor* aFormProcessor,
PRInt32 aBidiOptions);
virtual ~nsFSMultipartFormData() { }
@@ -407,7 +406,7 @@ NS_IMPL_QUERY_INTERFACE_INHERITED0(nsFSMultipartFormData, nsFormSubmission)
// Constructor
//
nsFSMultipartFormData::nsFSMultipartFormData(const nsAString& aCharset,
- nsIUnicodeEncoder* aEncoder,
+ nsISaveAsCharset* aEncoder,
nsIFormProcessor* aFormProcessor,
PRInt32 aBidiOptions)
: nsFormSubmission(aCharset, aEncoder, aFormProcessor, aBidiOptions)
@@ -684,8 +683,8 @@ GetSubmissionFromForm(nsIForm* aForm,
nsFormSubmission::GetSubmitCharset(aForm, ctrlsModAtSubmit, charset);
// Get unicode encoder
- nsCOMPtr encoder;
- nsFormSubmission::GetEncoder(aForm, aPresContext, ctrlsModAtSubmit, charset,
+ nsCOMPtr encoder;
+ nsFormSubmission::GetEncoder(aForm, aPresContext, charset,
getter_AddRefs(encoder));
// Get form processor
@@ -766,9 +765,6 @@ nsFormSubmission::GetSubmitCharset(nsIForm* form,
value.GetStringValue(acceptCharsetValue);
}
-#ifdef DEBUG_ftang
- printf("accept-charset = %s\n", acceptCharsetValue.ToNewUTF8String());
-#endif
PRInt32 charsetLen = acceptCharsetValue.Length();
if (charsetLen > 0) {
PRInt32 offset=0;
@@ -785,9 +781,6 @@ nsFormSubmission::GetSubmitCharset(nsIForm* form,
if (cnt > 0) {
nsAutoString charset;
acceptCharsetValue.Mid(charset, offset, cnt);
-#ifdef DEBUG_ftang
- printf("charset[i] = %s\n",charset.ToNewUTF8String());
-#endif
if (NS_SUCCEEDED(calias->GetPreferred(charset, oCharset)))
return;
}
@@ -838,41 +831,34 @@ nsFormSubmission::GetSubmitCharset(nsIForm* form,
nsresult
nsFormSubmission::GetEncoder(nsIForm* form,
nsIPresContext* aPresContext,
- PRUint8 aCtrlsModAtSubmit,
const nsAString& aCharset,
- nsIUnicodeEncoder** encoder)
+ nsISaveAsCharset** aEncoder)
{
- *encoder = nsnull;
+ *aEncoder = nsnull;
nsresult rv = NS_OK;
-#ifdef DEBUG_ftang
- printf("charset=%s\n", ToNewCString(charset));
-#endif
- // Get Charset, get the encoder.
- nsCOMPtr ccm(
- do_GetService(kCharsetConverterManagerCID, &rv));
+ nsAutoString charset(aCharset);
+ if(charset.Equals(NS_LITERAL_STRING("ISO-8859-1")))
+ charset.Assign(NS_LITERAL_STRING("windows-1252"));
+
+ rv = CallCreateInstance( NS_SAVEASCHARSET_CONTRACTID, aEncoder);
+ NS_ASSERTION(NS_SUCCEEDED(rv), "create nsISaveAsCharset failed");
NS_ENSURE_SUCCESS(rv, rv);
- if (ccm) {
- nsString charset(aCharset);
- if (charset.Equals(NS_LITERAL_STRING("ISO-8859-1")))
- charset.Assign(NS_LITERAL_STRING("windows-1252"));
- rv = ccm->GetUnicodeEncoder(&charset, encoder);
- NS_ENSURE_SUCCESS(rv, rv);
- // XXX Commenting this out for now since it was never called up until now
- // and no one appears to have noticed. But it appears to be useful stuff,
- // so it stays for the day when we realize we're doing it wrong.
- // rv = (*encoder)->SetOutputErrorBehavior(
- // nsIUnicodeEncoder::kOnError_Replace,
- // nsnull,
- // (PRUnichar)'?');
- }
+
+ rv = (*aEncoder)->Init(NS_ConvertUCS2toUTF8(charset).get(),
+ (nsISaveAsCharset::attr_EntityAfterCharsetConv +
+ nsISaveAsCharset::attr_FallbackDecimalNCR),
+ 0);
+ NS_ASSERTION(NS_SUCCEEDED(rv), "initialize nsISaveAsCharset failed");
+ NS_ENSURE_SUCCESS(rv, rv);
+
return NS_OK;
}
// i18n helper routines
char*
nsFormSubmission::UnicodeToNewBytes(const PRUnichar* aSrc, PRUint32 aLen,
- nsIUnicodeEncoder* aEncoder)
+ nsISaveAsCharset* aEncoder)
{
nsresult rv = NS_OK;
@@ -932,28 +918,14 @@ nsFormSubmission::UnicodeToNewBytes(const PRUnichar* aSrc, PRUint32 aLen,
}
#endif
+
char* res = nsnull;
- rv = aEncoder->Reset();
- if (NS_FAILED(rv)) {
- return nsnull;
- }
-
- PRInt32 maxByteLen = 0;
- rv = aEncoder->GetMaxLength(aSrc, (PRInt32)aLen, &maxByteLen);
- if (NS_FAILED(rv)) {
- return nsnull;
- }
-
- res = new char[maxByteLen+1];
- if (res) {
- PRInt32 reslen = maxByteLen;
- PRInt32 reslen2;
- PRInt32 srclen = aLen;
- aEncoder->Convert(aSrc, &srclen, res, &reslen);
- reslen2 = maxByteLen - reslen;
- aEncoder->Finish(res + reslen, &reslen2);
- res[reslen+reslen2] = '\0';
- }
+ if(aSrc && aSrc[0]) {
+ rv = aEncoder->Convert(aSrc, &res);
+ NS_ASSERTION(NS_SUCCEEDED(rv), "conversion failed");
+ }
+ if(! res)
+ res = nsCRT::strdup("");
return res;
}