#include <string>
#include "base/android/jni_android.h"
#include "base/android/jni_string.h"
#include "base/strings/string_piece.h"
#include "net/base/net_string_util.h"
#include "net/net_jni_headers/NetStringUtil_jni.h"
using base::android::ScopedJavaLocalRef;
namespace net {
namespace {
ScopedJavaLocalRef<jstring> ConvertToJstring(base::StringPiece text,
const char* charset) {
JNIEnv* env = base::android::AttachCurrentThread();
ScopedJavaLocalRef<jobject> java_byte_buffer(
env,
env->NewDirectByteBuffer(const_cast<char*>(text.data()), text.length()));
base::android::CheckException(env);
base::android::ScopedJavaLocalRef<jstring> java_charset =
base::android::ConvertUTF8ToJavaString(env, base::StringPiece(charset));
ScopedJavaLocalRef<jstring> java_result =
android::Java_NetStringUtil_convertToUnicode(env, java_byte_buffer,
java_charset);
return java_result;
}
ScopedJavaLocalRef<jstring> ConvertToNormalizedJstring(base::StringPiece text,
const char* charset) {
JNIEnv* env = base::android::AttachCurrentThread();
ScopedJavaLocalRef<jobject> java_byte_buffer(
env,
env->NewDirectByteBuffer(const_cast<char*>(text.data()), text.length()));
base::android::CheckException(env);
base::android::ScopedJavaLocalRef<jstring> java_charset =
base::android::ConvertUTF8ToJavaString(env, base::StringPiece(charset));
ScopedJavaLocalRef<jstring> java_result =
android::Java_NetStringUtil_convertToUnicodeAndNormalize(
env, java_byte_buffer, java_charset);
return java_result;
}
ScopedJavaLocalRef<jstring> ConvertToJstringWithSubstitutions(
base::StringPiece text,
const char* charset) {
JNIEnv* env = base::android::AttachCurrentThread();
ScopedJavaLocalRef<jobject> java_byte_buffer(
env,
env->NewDirectByteBuffer(const_cast<char*>(text.data()), text.length()));
base::android::CheckException(env);
base::android::ScopedJavaLocalRef<jstring> java_charset =
base::android::ConvertUTF8ToJavaString(env, base::StringPiece(charset));
ScopedJavaLocalRef<jstring> java_result =
android::Java_NetStringUtil_convertToUnicodeWithSubstitutions(
env, java_byte_buffer, java_charset);
return java_result;
}
}
const char* const kCharsetLatin1 = "ISO-8859-1";
bool ConvertToUtf8(base::StringPiece text,
const char* charset,
std::string* output) {
output->clear();
ScopedJavaLocalRef<jstring> java_result = ConvertToJstring(text, charset);
if (java_result.is_null())
return false;
*output = base::android::ConvertJavaStringToUTF8(java_result);
return true;
}
bool ConvertToUtf8AndNormalize(base::StringPiece text,
const char* charset,
std::string* output) {
output->clear();
ScopedJavaLocalRef<jstring> java_result = ConvertToNormalizedJstring(
text, charset);
if (java_result.is_null())
return false;
*output = base::android::ConvertJavaStringToUTF8(java_result);
return true;
}
bool ConvertToUTF16(base::StringPiece text,
const char* charset,
std::u16string* output) {
output->clear();
ScopedJavaLocalRef<jstring> java_result = ConvertToJstring(text, charset);
if (java_result.is_null())
return false;
*output = base::android::ConvertJavaStringToUTF16(java_result);
return true;
}
bool ConvertToUTF16WithSubstitutions(base::StringPiece text,
const char* charset,
std::u16string* output) {
output->clear();
ScopedJavaLocalRef<jstring> java_result =
ConvertToJstringWithSubstitutions(text, charset);
if (java_result.is_null())
return false;
*output = base::android::ConvertJavaStringToUTF16(java_result);
return true;
}
bool ToUpper(base::StringPiece16 str, std::u16string* output) {
output->clear();
JNIEnv* env = base::android::AttachCurrentThread();
ScopedJavaLocalRef<jstring> java_new_str(
env,
env->NewString(reinterpret_cast<const jchar*>(str.data()), str.length()));
if (java_new_str.is_null())
return false;
ScopedJavaLocalRef<jstring> java_result =
android::Java_NetStringUtil_toUpperCase(env, java_new_str);
if (java_result.is_null())
return false;
*output = base::android::ConvertJavaStringToUTF16(java_result);
return true;
}
}