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 |