nsresult nsTestUConv::TestEncoders() { char * trace = "TestEncoders"; mLog.AddTrace(trace); nsresult res = NS_OK; nsCOMPtr<nsICharsetConverterManager> ccMan = do_GetService(kCharsetConverterManagerCID, &res); if (NS_FAILED(res)) return res; nsCOMPtr<nsIUTF8StringEnumerator> encoders; res = ccMan->GetEncoderList(getter_AddRefs(encoders)); if (NS_FAILED(res)) return res; PRUint32 encoderCount=0; PRBool hasMore; encoders->HasMore(&hasMore); nsCAutoString charset; while (hasMore) { encoders->GetNext(charset); encoders->HasMore(&hasMore); } mLog.DelTrace(trace); return res; }
nsresult nsTestUConv::TestDecoders() { char * trace = "TestDecoders"; mLog.AddTrace(trace); nsresult res = NS_OK; // XXX write me mLog.DelTrace(trace); return res; }
nsresult nsTestUConv::DisplayDetectors() { const char * trace = "DisplayDetectors"; mLog.AddTrace(trace); nsresult res = NS_OK; nsCOMPtr<nsICharsetConverterManager> ccMan = do_GetService(kCharsetConverterManagerCID, &res); if (NS_FAILED(res)) { mLog.PrintError("NS_WITH_SERVICE", res); return res; } // charset detectors nsCOMPtr<nsIUTF8StringEnumerator> detectors; res = ccMan->GetCharsetDetectorList(getter_AddRefs(detectors)); if (NS_FAILED(res)) { mLog.PrintError("GetCharsetDetectorList()", res); return res; } printf("***** Character Set Detectors *****\n"); bool hasMore; detectors->HasMore(&hasMore); while (hasMore) { nsAutoCString detectorName; res = detectors->GetNext(detectorName); if (NS_FAILED(res)) { mLog.PrintError("GetNext()", res); return res; } printf("%s", detectorName.get()); PrintSpaces(36 - detectorName.Length()); // align to hard coded column number nsAutoString title; res = ccMan->GetCharsetTitle(detectorName.get(), title); if (NS_FAILED(res)) title.SetLength(0); printf("\"%s\"\n", NS_LossyConvertUTF16toASCII(title).get()); detectors->HasMore(&hasMore); } mLog.DelTrace(trace); return NS_OK; }
nsresult nsTestUConv::TestCharsetManager() { char * trace = "TestCharsetManager"; mLog.AddTrace(trace); nsresult res = NS_OK; nsAutoString name; nsCOMPtr<nsIAtom> csAtom; nsCOMPtr<nsICharsetConverterManager> ccMan = do_GetService(kCharsetConverterManagerCID, &res); if (NS_FAILED(res)) { mLog.PrintError("NS_WITH_SERVICE", res); return res; } mLog.DelTrace(trace); return res; }
nsresult nsTestUConv::TestTempBug() { char * trace = "TestTempBug"; mLog.AddTrace(trace); nsresult res = NS_OK; NS_NAMED_LITERAL_CSTRING(charset, "ISO-2022-JP"); PRUnichar src[] = {0x0043, 0x004e, 0x0045, 0x0054, 0x0020, 0x004A, 0x0061, 0x0070, 0x0061, 0x006E, 0x0020, 0x7DE8, 0x96C6, 0x5C40}; PRUnichar * srcEnd = src + ARRAY_SIZE(src); char dest[BIG_BUFFER_SIZE]; char * destEnd = dest + BIG_BUFFER_SIZE; PRUnichar * p = src; char * q = dest; res = Encode(&p, srcEnd, &q, destEnd, charset); mLog.DelTrace(trace); return res; }
nsresult nsTestUConv::Main(int aArgC, char ** aArgV) { char * trace = "Main"; mLog.AddTrace(trace); nsresult res = NS_OK; if (aArgC < 2) { // no arguments were passed to the program, so we just run the self tests res = TestCharsetManager(); if (NS_SUCCEEDED(res)) res = TestEncoders(); if (NS_SUCCEEDED(res)) res = TestDecoders(); } else if (!strcmp(aArgV[1], "-tempbug")) { // we are testing a temporary bug res = TestTempBug(); } else if (!strcmp(aArgV[1], "-display")) { // display all the available data res = DisplayDetectors(); if (NS_SUCCEEDED(res)) res = DisplayCharsets(); } mLog.DelTrace(trace); return res; }
nsresult nsTestUConv::Encode(PRUnichar ** aSrc, PRUnichar * aSrcEnd, char ** aDest, char * aDestEnd, const nsAFlatCString& aCharset) { char * trace = "Encode"; mLog.AddTrace(trace); nsresult res = NS_OK; nsCOMPtr<nsICharsetConverterManager> ccMan = do_GetService(kCharsetConverterManagerCID, &res); if (NS_FAILED(res)) { mLog.PrintError("NS_WITH_SERVICE", res); return res; } nsCOMPtr<nsIUnicodeEncoder> enc; res = ccMan->GetUnicodeEncoder(aCharset.get(), getter_AddRefs(enc)); if (NS_FAILED(res)) { mLog.PrintError("GetUnicodeEncoder()", res); return res; } res = ConvertEncode(aSrc, aSrcEnd, aDest, aDestEnd, enc); if (NS_FAILED(res)) { mLog.PrintError("Convert()", res); return res; } res = FinishEncode(aDest, aDestEnd, enc); if (NS_FAILED(res)) { mLog.PrintError("Finish()", res); return res; } mLog.DelTrace(trace); return res; }
nsresult nsTestUConv::DisplayCharsets() { char * trace = "DisplayCharsets"; mLog.AddTrace(trace); nsresult res = NS_OK; nsCOMPtr<nsICharsetConverterManager> ccMan = do_GetService(kCharsetConverterManagerCID, &res); if (NS_FAILED(res)) { mLog.PrintError("NS_WITH_SERVICE", res); return res; } nsCOMPtr<nsIUTF8StringEnumerator> decoders; nsCOMPtr<nsIUTF8StringEnumerator> encoders; res = ccMan->GetDecoderList(getter_AddRefs(decoders)); if (NS_FAILED(res)) { mLog.PrintError("GetDecoderList()", res); return res; } res = ccMan->GetEncoderList(getter_AddRefs(encoders)); if (NS_FAILED(res)) { mLog.PrintError("GetEncoderList()", res); return res; } printf("***** Character Sets *****\n"); PRUint32 encCount = 0, decCount = 0; PRUint32 basicEncCount = 0, basicDecCount = 0; nsCStringArray allCharsets; nsCAutoString charset; PRBool hasMore; encoders->HasMore(&hasMore); while (hasMore) { res = encoders->GetNext(charset); if (NS_SUCCEEDED(res)) allCharsets.AppendCString(charset); encoders->HasMore(&hasMore); } nsAutoString prop, str; PRUint32 count = allCharsets.Count(); for (PRUint32 i = 0; i < count; i++) { const nsCString* charset = allCharsets[i]; printf("%s", charset->get()); PrintSpaces(24 - charset->Length()); // align to hard coded column number nsCOMPtr<nsIUnicodeDecoder> dec = NULL; res = ccMan->GetUnicodeDecoder(charset->get(), getter_AddRefs(dec)); if (NS_FAILED(res)) printf (" "); else { printf("D"); decCount++; } #ifdef NS_DEBUG // show the "basic" decoder classes if (dec) { nsCOMPtr<nsIBasicDecoder> isBasic = do_QueryInterface(dec); if (isBasic) { basicDecCount++; printf("b"); } else printf(" "); } else printf(" "); #endif nsCOMPtr<nsIUnicodeEncoder> enc = NULL; res = ccMan->GetUnicodeEncoder(charset->get(), getter_AddRefs(enc)); if (NS_FAILED(res)) printf (" "); else { printf("E"); encCount++; } #ifdef NS_DEBUG if (enc) { nsCOMPtr<nsIBasicEncoder> isBasic = do_QueryInterface(enc); if (isBasic) { basicEncCount++; printf("b"); } else printf(" "); } else printf(" "); #endif printf(" "); prop.AssignLiteral(".notForBrowser"); res = ccMan->GetCharsetData(charset->get(), prop.get(), str); if ((dec != NULL) && (NS_FAILED(res))) printf ("B"); else printf("X"); prop.AssignLiteral(".notForComposer"); res = ccMan->GetCharsetData(charset->get(), prop.get(), str); if ((enc != NULL) && (NS_FAILED(res))) printf ("C"); else printf("X"); prop.AssignLiteral(".notForMailView"); res = ccMan->GetCharsetData(charset->get(), prop.get(), str); if ((dec != NULL) && (NS_FAILED(res))) printf ("V"); else printf("X"); prop.AssignLiteral(".notForMailEdit"); res = ccMan->GetCharsetData(charset->get(), prop.get(), str); if ((enc != NULL) && (NS_FAILED(res))) printf ("E"); else printf("X"); printf("(%3d, %3d) ", encCount, decCount); res = ccMan->GetCharsetTitle(charset->get(), str); if (NS_FAILED(res)) str.SetLength(0); NS_LossyConvertUCS2toASCII buff2(str); printf(" \"%s\"\n", buff2.get()); } printf("%u of %u decoders are basic (%d%%)\n", basicDecCount, decCount, (basicDecCount * 100) / decCount); printf("%u of %u encoders are basic (%d%%)\n", basicEncCount, encCount, (basicEncCount * 100) / encCount); mLog.DelTrace(trace); return NS_OK; }