Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(224)

Unified Diff: chrome_frame/icu_stubs.cc

Issue 218019: Initial import of the Chrome Frame codebase. Integration in chrome.gyp coming... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 11 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome_frame/html_utils.cc ('k') | chrome_frame/ie8_types.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome_frame/icu_stubs.cc
===================================================================
--- chrome_frame/icu_stubs.cc (revision 0)
+++ chrome_frame/icu_stubs.cc (revision 0)
@@ -0,0 +1,169 @@
+// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/logging.h"
+#include "base/string_util.h"
+#include "googleurl/src/url_canon.h"
+
+#include <windows.h>
+
+////////////////////////////////////////////////////////////////////////////////
+// Avoid dependency on string_util_icu.cc (which pulls in icu).
+
+std::string WideToAnsiDirect(const wchar_t* wide, size_t wide_len) {
+ std::string ret;
+ char* write = WriteInto(&ret, wide_len + 1);
+ for (size_t i = 0; i < wide_len; ++i) {
+ // We can only convert characters below 0x80 directly from wide to ansi.
+ DCHECK(wide[i] <= 127) << "can't convert";
+ write[i] = static_cast<char>(wide[i]);
+ }
+
+ write[wide_len] = '\0';
+
+ return ret;
+}
+
+bool WideToUTF8(const wchar_t* wide, size_t wide_len, std::string* utf8) {
+ DCHECK(utf8);
+
+ // Add a cutoff. If it's all ASCII, convert it directly
+ size_t i;
+ for (i = 0; i < wide_len; ++i) {
+ if (wide[i] > 127)
+ break;
+ }
+
+ // If we made it to the end without breaking, then it's all ANSI, so do a
+ // quick convert
+ if (i == wide_len) {
+ *utf8 = WideToAnsiDirect(wide, wide_len);
+ return true;
+ }
+
+ // Figure out how long the string is
+ int size = WideCharToMultiByte(CP_UTF8, 0, wide, wide_len + 1, NULL, 0, NULL,
+ NULL);
+
+ if (size > 0) {
+ WideCharToMultiByte(CP_UTF8, 0, wide, wide_len + 1, WriteInto(utf8, size),
+ size, NULL, NULL);
+ }
+
+ return (size > 0);
+}
+
+std::string WideToUTF8(const std::wstring& wide) {
+ std::string ret;
+ if (!wide.empty()) {
+ // Ignore the success flag of this call, it will do the best it can for
+ // invalid input, which is what we want here.
+ WideToUTF8(wide.data(), wide.length(), &ret);
+ }
+ return ret;
+}
+
+bool UTF8ToWide(const char* src, size_t src_len, std::wstring* output) {
+ DCHECK(output);
+
+ if (src_len == 0) {
+ output->clear();
+ return true;
+ }
+
+ int wide_chars = MultiByteToWideChar(CP_UTF8, 0, src, src_len, NULL, 0);
+ if (!wide_chars) {
+ NOTREACHED();
+ return false;
+ }
+
+ wide_chars++; // make room for L'\0'
+ // Note that WriteInto will fill the string with '\0', so in the case
+ // where the input string is not \0 terminated, we will still be ensured
+ // that the output string will be.
+ if (!MultiByteToWideChar(CP_UTF8, 0, src, src_len,
+ WriteInto(output, wide_chars), wide_chars)) {
+ NOTREACHED();
+ output->clear();
+ return false;
+ }
+
+ return true;
+}
+
+std::wstring UTF8ToWide(const base::StringPiece& utf8) {
+ std::wstring ret;
+ if (!utf8.empty())
+ UTF8ToWide(utf8.data(), utf8.length(), &ret);
+ return ret;
+}
+
+#ifdef WCHAR_T_IS_UTF16
+string16 UTF8ToUTF16(const std::string& utf8) {
+ std::wstring ret;
+ if (!utf8.empty())
+ UTF8ToWide(utf8.data(), utf8.length(), &ret);
+ return ret;
+}
+#else
+#error Need WCHAR_T_IS_UTF16
+#endif
+
+////////////////////////////////////////////////////////////////////////////////
+// Replace ICU dependent functions in googleurl.
+/*#define __UTF_H__
+#include "third_party/icu38/public/common/unicode/utf16.h"
+#define U_IS_SURROGATE(c) (((c)&0xfffff800)==0xd800)
+extern const char16 kUnicodeReplacementCharacter;*/
+
+namespace url_canon {
+
+bool IDNToASCII(const char16* src, int src_len, CanonOutputW* output) {
+ // We should only hit this when the user attempts to navigate
+ // CF to an invalid URL.
+ DLOG(WARNING) << __FUNCTION__ << " not implemented";
+ return false;
+}
+
+bool ReadUTFChar(const char* str, int* begin, int length,
+ unsigned* code_point_out) {
+ // We should only hit this when the user attempts to navigate
+ // CF to an invalid URL.
+ DLOG(WARNING) << __FUNCTION__ << " not implemented";
+
+ // TODO(tommi): consider if we can use something like
+ // http://bjoern.hoehrmann.de/utf-8/decoder/dfa/
+ return false;
+}
+
+bool ReadUTFChar(const char16* str, int* begin, int length,
+ unsigned* code_point) {
+/*
+ if (U16_IS_SURROGATE(str[*begin])) {
+ if (!U16_IS_SURROGATE_LEAD(str[*begin]) || *begin + 1 >= length ||
+ !U16_IS_TRAIL(str[*begin + 1])) {
+ // Invalid surrogate pair.
+ *code_point = kUnicodeReplacementCharacter;
+ return false;
+ } else {
+ // Valid surrogate pair.
+ *code_point = U16_GET_SUPPLEMENTARY(str[*begin], str[*begin + 1]);
+ (*begin)++;
+ }
+ } else {
+ // Not a surrogate, just one 16-bit word.
+ *code_point = str[*begin];
+ }
+
+ if (U_IS_UNICODE_CHAR(*code_point))
+ return true;
+
+ // Invalid code point.
+ *code_point = kUnicodeReplacementCharacter;
+ return false;*/
+ CHECK(false);
+ return false;
+}
+
+} // namespace url_canon
« no previous file with comments | « chrome_frame/html_utils.cc ('k') | chrome_frame/ie8_types.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698