summaryrefslogtreecommitdiffstats
path: root/WebCore/platform/win/ClipboardUtilitiesWin.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/platform/win/ClipboardUtilitiesWin.cpp')
-rw-r--r--WebCore/platform/win/ClipboardUtilitiesWin.cpp146
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);
}