// 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; }
// Change plain CR and plain LF to CRLF pairs. static DeprecatedCString fixLineBreaks(const DeprecatedCString &s) { // Compute the length. unsigned newLen = 0; const char *p = s.data(); while (char c = *p++) { if (c == '\r') { // Safe to look ahead because of trailing '\0'. if (*p != '\n') { // Turn CR into CRLF. newLen += 2; } } else if (c == '\n') { // Turn LF into CRLF. newLen += 2; } else { // Leave other characters alone. newLen += 1; } } if (newLen == s.length()) { return s; } // Make a copy of the string. p = s.data(); DeprecatedCString result(newLen + 1); char *q = result.data(); while (char c = *p++) { if (c == '\r') { // Safe to look ahead because of trailing '\0'. if (*p != '\n') { // Turn CR into CRLF. *q++ = '\r'; *q++ = '\n'; } } else if (c == '\n') { // Turn LF into CRLF. *q++ = '\r'; *q++ = '\n'; } else { // Leave other characters alone. *q++ = c; } } return result; }
static DeprecatedCString encodeCString(const DeprecatedCString& e) { // http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1 // safe characters like NS handles them for compatibility static const char *safe = "-._*"; int elen = e.length(); DeprecatedCString encoded(( elen+e.contains( '\n' ) )*3+1); int enclen = 0; for(int pos = 0; pos < elen; pos++) { unsigned char c = e[pos]; if ( (( c >= 'A') && ( c <= 'Z')) || (( c >= 'a') && ( c <= 'z')) || (( c >= '0') && ( c <= '9')) || (strchr(safe, c)) ) encoded[enclen++] = c; else if ( c == ' ' ) encoded[enclen++] = '+'; else if ( c == '\n' || ( c == '\r' && e[pos+1] != '\n' ) ) { encoded[enclen++] = '%'; encoded[enclen++] = '0'; encoded[enclen++] = 'D'; encoded[enclen++] = '%'; encoded[enclen++] = '0'; encoded[enclen++] = 'A'; } else if ( c != '\r' ) { encoded[enclen++] = '%'; unsigned int h = c / 16; h += (h > 9) ? ('A' - 10) : '0'; encoded[enclen++] = h; unsigned int l = c % 16; l += (l > 9) ? ('A' - 10) : '0'; encoded[enclen++] = l; } } encoded[enclen++] = '\0'; encoded.truncate(enclen); return encoded; }
void FormDataList::appendString(const DeprecatedString &s) { DeprecatedCString cstr = fixLineBreaks(m_encoding.fromUnicode(s, true)); cstr.truncate(cstr.length()); m_list.append(cstr); }