/* * when copy-paste, mozilla wants data encoded using UCS2, * other app such as StarOffice use "text/html"(RFC2854). * This function convert data(got from GTK clipboard) * to data mozilla wanted. * * data from GTK clipboard can be 3 forms: * 1. From current mozilla * "text/html", charset = utf-16 * 2. From old version mozilla or mozilla-based app * content("body" only), charset = utf-16 * 3. From other app who use "text/html" when copy-paste * "text/html", has "charset" info * * data : got from GTK clipboard * dataLength: got from GTK clipboard * body : pass to Mozilla * bodyLength: pass to Mozilla */ void ConvertHTMLtoUCS2(guchar * data, PRInt32 dataLength, PRUnichar** unicodeData, PRInt32& outUnicodeLen) { nsCAutoString charset; GetHTMLCharset(data, dataLength, charset);// get charset of HTML if (charset.EqualsLiteral("UTF-16")) {//current mozilla outUnicodeLen = (dataLength / 2) - 1; *unicodeData = NS_REINTERPRET_CAST(PRUnichar*, nsMemory::Alloc((outUnicodeLen + sizeof('\0')) * sizeof(PRUnichar))); if (unicodeData) { memcpy(*unicodeData, data + sizeof(PRUnichar), outUnicodeLen * sizeof(PRUnichar)); (*unicodeData)[outUnicodeLen] = '\0'; } } else if (charset.EqualsLiteral("UNKNOWN")) {
/* * when copy-paste, mozilla wants data encoded using UCS2, * other app such as StarOffice use "text/html"(RFC2854). * This function convert data(got from GTK clipboard) * to data mozilla wanted. * * data from GTK clipboard can be 3 forms: * 1. From current mozilla * "text/html", charset = utf-16 * 2. From old version mozilla or mozilla-based app * content("body" only), charset = utf-16 * 3. From other app who use "text/html" when copy-paste * "text/html", has "charset" info * * data : got from GTK clipboard * dataLength: got from GTK clipboard * body : pass to Mozilla * bodyLength: pass to Mozilla */ void ConvertHTMLtoUCS2(guchar * data, PRInt32 dataLength, PRUnichar** unicodeData, PRInt32& outUnicodeLen) { nsCAutoString charset; GetHTMLCharset(data, dataLength, charset);// get charset of HTML if (charset.EqualsLiteral("UTF-16")) {//current mozilla outUnicodeLen = (dataLength / 2) - 1; *unicodeData = reinterpret_cast<PRUnichar*> (nsMemory::Alloc((outUnicodeLen + sizeof('\0')) * sizeof(PRUnichar))); if (*unicodeData) { memcpy(*unicodeData, data + sizeof(PRUnichar), outUnicodeLen * sizeof(PRUnichar)); (*unicodeData)[outUnicodeLen] = '\0'; } } else if (charset.EqualsLiteral("UNKNOWN")) { outUnicodeLen = 0; return; } else { // app which use "text/html" to copy&paste nsCOMPtr<nsIUnicodeDecoder> decoder; nsresult rv; // get the decoder nsCOMPtr<nsICharsetConverterManager> ccm = do_GetService(NS_CHARSETCONVERTERMANAGER_CONTRACTID, &rv); if (NS_FAILED(rv)) { #ifdef DEBUG_CLIPBOARD g_print(" can't get CHARSET CONVERTER MANAGER service\n"); #endif outUnicodeLen = 0; return; } rv = ccm->GetUnicodeDecoder(charset.get(), getter_AddRefs(decoder)); if (NS_FAILED(rv)) { #ifdef DEBUG_CLIPBOARD g_print(" get unicode decoder error\n"); #endif outUnicodeLen = 0; return; } // converting decoder->GetMaxLength((const char *)data, dataLength, &outUnicodeLen); // |outUnicodeLen| is number of chars if (outUnicodeLen) { *unicodeData = reinterpret_cast<PRUnichar*> (nsMemory::Alloc((outUnicodeLen + sizeof('\0')) * sizeof(PRUnichar))); if (*unicodeData) { PRInt32 numberTmp = dataLength; decoder->Convert((const char *)data, &numberTmp, *unicodeData, &outUnicodeLen); #ifdef DEBUG_CLIPBOARD if (numberTmp != dataLength) printf("didn't consume all the bytes\n"); #endif // null terminate. Convert() doesn't do it for us (*unicodeData)[outUnicodeLen] = '\0'; } } // if valid length } }