diff options
Diffstat (limited to 'WebCore/platform/win/ClipboardUtilitiesWin.cpp')
-rw-r--r-- | WebCore/platform/win/ClipboardUtilitiesWin.cpp | 146 |
1 files changed, 68 insertions, 78 deletions
diff --git a/WebCore/platform/win/ClipboardUtilitiesWin.cpp b/WebCore/platform/win/ClipboardUtilitiesWin.cpp index 7a3e5ff..066e235 100644 --- a/WebCore/platform/win/ClipboardUtilitiesWin.cpp +++ b/WebCore/platform/win/ClipboardUtilitiesWin.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007, 2008 Apple Inc. All rights reserved. + * Copyright (C) 2007 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,12 +26,12 @@ #include "config.h" #include "ClipboardUtilitiesWin.h" +#include "KURL.h" #include "CString.h" #include "DocumentFragment.h" -#include "KURL.h" +#include "markup.h" #include "PlatformString.h" #include "TextEncoding.h" -#include "markup.h" #include <CoreFoundation/CoreFoundation.h> #include <wtf/RetainPtr.h> #include <shlwapi.h> @@ -120,103 +120,93 @@ HGLOBAL createGlobalData(const KURL& url, const String& title) return cbData; } -HGLOBAL createGlobalData(const String& str) -{ - HGLOBAL globalData = ::GlobalAlloc(GPTR, (str.length() + 1) * sizeof(UChar)); - if (!globalData) - return 0; - UChar* buffer = static_cast<UChar*>(::GlobalLock(globalData)); - memcpy(buffer, str.characters(), str.length() * sizeof(UChar)); - buffer[str.length()] = 0; - ::GlobalUnlock(globalData); - return globalData; -} - -HGLOBAL createGlobalData(const Vector<char>& vector) -{ - HGLOBAL globalData = ::GlobalAlloc(GPTR, vector.size() + 1); - if (!globalData) - return 0; - char* buffer = static_cast<char*>(::GlobalLock(globalData)); - memcpy(buffer, vector.data(), vector.size()); - buffer[vector.size()] = 0; - ::GlobalUnlock(globalData); - return globalData; -} - -static void append(Vector<char>& vector, const char* string) -{ - vector.append(string, strlen(string)); +HGLOBAL createGlobalData(String str) +{ + SIZE_T size = (str.length() + 1) * sizeof(UChar); + HGLOBAL cbData = ::GlobalAlloc(GPTR, size); + if (cbData) { + void* buffer = ::GlobalLock(cbData); + memcpy(buffer, str.charactersWithNullTermination(), size); + ::GlobalUnlock(cbData); + } + return cbData; } -static void append(Vector<char>& vector, const CString& string) +HGLOBAL createGlobalData(CString str) { - vector.append(string.data(), string.length()); + SIZE_T size = str.length() * sizeof(char); + HGLOBAL cbData = ::GlobalAlloc(GPTR, size + 1); + if (cbData) { + char* buffer = static_cast<char*>(::GlobalLock(cbData)); + memcpy(buffer, str.data(), size); + buffer[size] = 0; + ::GlobalUnlock(cbData); + } + return cbData; } // Documentation for the CF_HTML format is available at http://msdn.microsoft.com/workshop/networking/clipboard/htmlclipboard.asp -void markupToCF_HTML(const String& markup, const String& srcURL, Vector<char>& result) +DeprecatedCString markupToCF_HTML(const String& markup, const String& srcURL) { - if (markup.isEmpty()) - return; - - #define MAX_DIGITS 10 - #define MAKE_NUMBER_FORMAT_1(digits) MAKE_NUMBER_FORMAT_2(digits) - #define MAKE_NUMBER_FORMAT_2(digits) "%0" #digits "u" - #define NUMBER_FORMAT MAKE_NUMBER_FORMAT_1(MAX_DIGITS) + if (!markup.length()) + return DeprecatedCString(); - const char* header = "Version:0.9\n" - "StartHTML:" NUMBER_FORMAT "\n" - "EndHTML:" NUMBER_FORMAT "\n" - "StartFragment:" NUMBER_FORMAT "\n" - "EndFragment:" NUMBER_FORMAT "\n"; - const char* sourceURLPrefix = "SourceURL:"; + DeprecatedCString cf_html ("Version:0.9"); + DeprecatedCString startHTML ("\nStartHTML:"); + DeprecatedCString endHTML ("\nEndHTML:"); + DeprecatedCString startFragment ("\nStartFragment:"); + DeprecatedCString endFragment ("\nEndFragment:"); + DeprecatedCString sourceURL ("\nSourceURL:"); - const char* startMarkup = "<HTML>\n<BODY>\n<!--StartFragment-->\n"; - const char* endMarkup = "\n<!--EndFragment-->\n</BODY>\n</HTML>"; + bool shouldFillSourceURL = !srcURL.isEmpty() && (srcURL != "about:blank"); + if (shouldFillSourceURL) + sourceURL.append(srcURL.utf8().data()); - CString sourceURLUTF8 = srcURL == blankURL() ? "" : srcURL.utf8(); - CString markupUTF8 = markup.utf8(); + DeprecatedCString startMarkup ("\n<HTML>\n<BODY>\n<!--StartFragment-->\n"); + DeprecatedCString endMarkup ("\n<!--EndFragment-->\n</BODY>\n</HTML>"); // calculate offsets - unsigned startHTMLOffset = strlen(header) - strlen(NUMBER_FORMAT) * 4 + MAX_DIGITS * 4; - if (sourceURLUTF8.length()) - startHTMLOffset += strlen(sourceURLPrefix) + sourceURLUTF8.length() + 1; - unsigned startFragmentOffset = startHTMLOffset + strlen(startMarkup); + 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 + strlen(endMarkup); - - append(result, String::format(header, startHTMLOffset, endHTMLOffset, startFragmentOffset, endFragmentOffset).utf8()); - if (sourceURLUTF8.length()) { - append(result, sourceURLPrefix); - append(result, sourceURLUTF8); - result.append('\n'); - } - append(result, startMarkup); - append(result, markupUTF8); - append(result, endMarkup); - - #undef MAX_DIGITS - #undef MAKE_NUMBER_FORMAT_1 - #undef MAKE_NUMBER_FORMAT_2 - #undef NUMBER_FORMAT + 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; } String urlToMarkup(const KURL& url, const String& title) { - Vector<UChar> markup; - append(markup, "<a href=\""); - append(markup, url.string()); - append(markup, "\">"); - append(markup, title); - append(markup, "</a>"); - return String::adopt(markup); + String markup("<a href=\""); + markup.append(url.string()); + markup.append("\">"); + markup.append(title); + markup.append("</a>"); + return markup; } void replaceNewlinesWithWindowsStyleNewlines(String& str) { static const UChar Newline = '\n'; - static const char* const WindowsNewline("\r\n"); + static const String WindowsNewline("\r\n"); str.replace(Newline, WindowsNewline); } |