net_string_util_icu_alternatives_android.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "net/base/net_string_util_icu_alternatives_android.h" 6 7#include "base/android/jni_android.h" 8#include "base/android/jni_string.h" 9#include "base/strings/string16.h" 10#include "base/strings/string_piece.h" 11#include "jni/NetStringUtil_jni.h" 12#include "net/base/net_string_util.h" 13 14namespace net { 15 16namespace { 17 18// Attempts to convert |text| encoded in |charset| to a jstring (Java unicode 19// string). Returns the result jstring, or NULL on failure. 20ScopedJavaLocalRef<jstring> ConvertToJstring(const std::string& text, 21 const char* charset) { 22 JNIEnv* env = base::android::AttachCurrentThread(); 23 jobject java_byte_buffer = 24 env->NewDirectByteBuffer(const_cast<char*>(text.data()), text.length()); 25 base::android::ScopedJavaLocalRef<jstring> java_charset = 26 base::android::ConvertUTF8ToJavaString(env, base::StringPiece(charset)); 27 ScopedJavaLocalRef<jstring> java_result = 28 android::Java_NetStringUtil_convertToUnicode(env, java_byte_buffer, 29 java_charset.obj()); 30 return java_result; 31} 32 33// Attempts to convert |text| encoded in |charset| to a jstring (Java unicode 34// string) and then normalizes the string. Returns the result jstring, or NULL 35// on failure. 36ScopedJavaLocalRef<jstring> ConvertToNormalizedJstring( 37 const std::string& text, const char* charset) { 38 JNIEnv* env = base::android::AttachCurrentThread(); 39 jobject java_byte_buffer = 40 env->NewDirectByteBuffer(const_cast<char*>(text.data()), text.length()); 41 base::android::ScopedJavaLocalRef<jstring> java_charset = 42 base::android::ConvertUTF8ToJavaString(env, base::StringPiece(charset)); 43 ScopedJavaLocalRef<jstring> java_result = 44 android::Java_NetStringUtil_convertToUnicodeAndNormalize( 45 env, java_byte_buffer, java_charset.obj()); 46 return java_result; 47} 48 49// Converts |text| encoded in |charset| to a jstring (Java unicode string). 50// Any characters that can not be converted are replaced with U+FFFD. 51ScopedJavaLocalRef<jstring> ConvertToJstringWithSubstitutions( 52 const std::string& text, const char* charset) { 53 JNIEnv* env = base::android::AttachCurrentThread(); 54 jobject java_byte_buffer = 55 env->NewDirectByteBuffer(const_cast<char*>(text.data()), text.length()); 56 base::android::ScopedJavaLocalRef<jstring> java_charset = 57 base::android::ConvertUTF8ToJavaString(env, base::StringPiece(charset)); 58 ScopedJavaLocalRef<jstring> java_result = 59 android::Java_NetStringUtil_convertToUnicodeWithSubstitutions( 60 env, java_byte_buffer, java_charset.obj()); 61 return java_result; 62} 63 64} // namespace 65 66const char* const kCharsetLatin1 = "ISO-8859-1"; 67 68bool ConvertToUtf8(const std::string& text, const char* charset, 69 std::string* output) { 70 output->clear(); 71 ScopedJavaLocalRef<jstring> java_result = ConvertToJstring(text, charset); 72 if (java_result.is_null()) 73 return false; 74 *output = base::android::ConvertJavaStringToUTF8(java_result); 75 return true; 76} 77 78bool ConvertToUtf8AndNormalize(const std::string& text, const char* charset, 79 std::string* output) { 80 output->clear(); 81 ScopedJavaLocalRef<jstring> java_result = ConvertToNormalizedJstring( 82 text, charset); 83 if (java_result.is_null()) 84 return false; 85 *output = base::android::ConvertJavaStringToUTF8(java_result); 86 return true; 87} 88 89bool ConvertToUTF16(const std::string& text, const char* charset, 90 base::string16* output) { 91 output->clear(); 92 ScopedJavaLocalRef<jstring> java_result = ConvertToJstring(text, charset); 93 if (java_result.is_null()) 94 return false; 95 *output = base::android::ConvertJavaStringToUTF16(java_result); 96 return true; 97} 98 99bool ConvertToUTF16WithSubstitutions(const std::string& text, 100 const char* charset, 101 base::string16* output) { 102 output->clear(); 103 ScopedJavaLocalRef<jstring> java_result = 104 ConvertToJstringWithSubstitutions(text, charset); 105 if (java_result.is_null()) 106 return false; 107 *output = base::android::ConvertJavaStringToUTF16(java_result); 108 return true; 109} 110 111bool RegisterNetStringUtils(JNIEnv* env) { 112 return android::RegisterNativesImpl(env); 113} 114 115} // namespace net 116