DeprecatedCString DeprecatedCString::mid(unsigned index, unsigned len) const { unsigned size = length(); if( data() && index<size ) // return null if index out-of-range { // clip length if( len > size - index ) len = size - index; // copy and return return DeprecatedCString( &(data()[index]), len+1); // include nul } // degenerate case return DeprecatedCString(); }
// Documentation for the CF_HTML format is available at http://msdn.microsoft.com/workshop/networking/clipboard/htmlclipboard.asp DeprecatedCString markupToCF_HTML(const String& markup, const String& srcURL) { if (!markup.length()) return DeprecatedCString(); DeprecatedCString cf_html ("Version:0.9"); DeprecatedCString startHTML ("\nStartHTML:"); DeprecatedCString endHTML ("\nEndHTML:"); DeprecatedCString startFragment ("\nStartFragment:"); DeprecatedCString endFragment ("\nEndFragment:"); DeprecatedCString sourceURL ("\nSourceURL:"); bool shouldFillSourceURL = !srcURL.isEmpty() && (srcURL != "about:blank"); if (shouldFillSourceURL) sourceURL.append(srcURL.utf8().data()); DeprecatedCString startMarkup ("\n<HTML>\n<BODY>\n<!--StartFragment-->\n"); DeprecatedCString endMarkup ("\n<!--EndFragment-->\n</BODY>\n</HTML>"); // calculate offsets const unsigned UINT_MAXdigits = 10; // number of digits in UINT_MAX in base 10 unsigned startHTMLOffset = cf_html.length() + startHTML.length() + endHTML.length() + startFragment.length() + endFragment.length() + (shouldFillSourceURL ? sourceURL.length() : 0) + (4*UINT_MAXdigits); unsigned startFragmentOffset = startHTMLOffset + startMarkup.length(); CString markupUTF8 = markup.utf8(); unsigned endFragmentOffset = startFragmentOffset + markupUTF8.length(); unsigned endHTMLOffset = endFragmentOffset + endMarkup.length(); // fill in needed data startHTML.append(String::format("%010u", startHTMLOffset).deprecatedString().utf8()); endHTML.append(String::format("%010u", endHTMLOffset).deprecatedString().utf8()); startFragment.append(String::format("%010u", startFragmentOffset).deprecatedString().utf8()); endFragment.append(String::format("%010u", endFragmentOffset).deprecatedString().utf8()); startMarkup.append(markupUTF8.data()); // create full cf_html string from the fragments cf_html.append(startHTML); cf_html.append(endHTML); cf_html.append(startFragment); cf_html.append(endFragment); if (shouldFillSourceURL) cf_html.append(sourceURL); cf_html.append(startMarkup); cf_html.append(endMarkup); return cf_html; }
DeprecatedCString StreamingTextDecoderICU::fromUnicode(const DeprecatedString &qcs, bool allowEntities) { TextEncodingID encoding = m_encoding.effectiveEncoding().encodingID(); if (encoding == WinLatin1Encoding && qcs.isAllLatin1()) return qcs.latin1(); if ((encoding == WinLatin1Encoding || encoding == UTF8Encoding || encoding == ASCIIEncoding) && qcs.isAllASCII()) return qcs.ascii(); // FIXME: We should see if there is "force ASCII range" mode in ICU; // until then, we change the backslash into a yen sign. // Encoding will change the yen sign back into a backslash. DeprecatedString copy = qcs; copy.replace('\\', m_encoding.backslashAsCurrencySymbol()); if (!m_converterICU) createICUConverter(); if (!m_converterICU) return DeprecatedCString(); // FIXME: when DeprecatedString buffer is latin1, it would be nice to // convert from that w/o having to allocate a unicode buffer char buffer[ConversionBufferSize]; const UChar* source = reinterpret_cast<const UChar*>(copy.unicode()); const UChar* sourceLimit = source + copy.length(); UErrorCode err = U_ZERO_ERROR; DeprecatedString normalizedString; if (UNORM_YES != unorm_quickCheck(source, copy.length(), UNORM_NFC, &err)) { normalizedString.truncate(copy.length()); // normalization to NFC rarely increases the length, so this first attempt will usually succeed int32_t normalizedLength = unorm_normalize(source, copy.length(), UNORM_NFC, 0, reinterpret_cast<UChar*>(const_cast<DeprecatedChar*>(normalizedString.unicode())), copy.length(), &err); if (err == U_BUFFER_OVERFLOW_ERROR) { err = U_ZERO_ERROR; normalizedString.truncate(normalizedLength); normalizedLength = unorm_normalize(source, copy.length(), UNORM_NFC, 0, reinterpret_cast<UChar*>(const_cast<DeprecatedChar*>(normalizedString.unicode())), normalizedLength, &err); } source = reinterpret_cast<const UChar*>(normalizedString.unicode()); sourceLimit = source + normalizedLength; } DeprecatedCString result(1); // for trailing zero if (allowEntities) ucnv_setFromUCallBack(m_converterICU, UCNV_FROM_U_CALLBACK_ESCAPE, UCNV_ESCAPE_XML_DEC, 0, 0, &err); else { ucnv_setSubstChars(m_converterICU, "?", 1, &err); ucnv_setFromUCallBack(m_converterICU, UCNV_FROM_U_CALLBACK_SUBSTITUTE, 0, 0, 0, &err); } ASSERT(U_SUCCESS(err)); if (U_FAILURE(err)) return DeprecatedCString(); do { char* target = buffer; char* targetLimit = target + ConversionBufferSize; err = U_ZERO_ERROR; ucnv_fromUnicode(m_converterICU, &target, targetLimit, &source, sourceLimit, 0, true, &err); int count = target - buffer; buffer[count] = 0; result.append(buffer); } while (err == U_BUFFER_OVERFLOW_ERROR); return result; }