1d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes/* 2d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes * Copyright (C) 2010 The Android Open Source Project 3d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes * 4d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes * Licensed under the Apache License, Version 2.0 (the "License"); 5d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes * you may not use this file except in compliance with the License. 6d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes * You may obtain a copy of the License at 7d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes * 8d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 9d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes * 10d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes * Unless required by applicable law or agreed to in writing, software 11d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 12d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes * See the License for the specific language governing permissions and 14d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes * limitations under the License. 15d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes */ 16d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes 17d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes#ifndef SCOPED_JAVA_UNICODE_STRING_H_included 18d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes#define SCOPED_JAVA_UNICODE_STRING_H_included 19d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes 20d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes#include "JNIHelp.h" 21a656b24ce0513b5f6115c40e6bb9181c5cea93d6Elliott Hughes#include "unicode/unistr.h" 22d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes 23d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes// A smart pointer that provides access to an ICU UnicodeString given a JNI 24d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes// jstring. We give ICU a direct pointer to the characters on the Java heap. 259de899cc3ffd3aa3f8f827201cbe14120609018bElliott Hughes// It's clever enough to copy-on-write if necessary. 26d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughesclass ScopedJavaUnicodeString { 27d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughespublic: 28d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes ScopedJavaUnicodeString(JNIEnv* env, jstring s) : mEnv(env), mString(s) { 29d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes mChars = env->GetStringChars(mString, NULL); 30d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes const int32_t charCount = env->GetStringLength(mString); 31d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes mUnicodeString.setTo(false, mChars, charCount); 32d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes } 33d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes 34d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes ~ScopedJavaUnicodeString() { 35d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes mEnv->ReleaseStringChars(mString, mChars); 36d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes } 37d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes 389de899cc3ffd3aa3f8f827201cbe14120609018bElliott Hughes const UnicodeString& unicodeString() const { 399de899cc3ffd3aa3f8f827201cbe14120609018bElliott Hughes return mUnicodeString; 409de899cc3ffd3aa3f8f827201cbe14120609018bElliott Hughes } 419de899cc3ffd3aa3f8f827201cbe14120609018bElliott Hughes 429de899cc3ffd3aa3f8f827201cbe14120609018bElliott Hughes UnicodeString& unicodeString() { 43d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes return mUnicodeString; 44d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes } 45d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes 46d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughesprivate: 47d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes JNIEnv* mEnv; 48d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes jstring mString; 49d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes const UChar* mChars; 50d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes UnicodeString mUnicodeString; 517ca6fd0dca02f7abdd8808db78357743bbdd23a5Elliott Hughes 527ca6fd0dca02f7abdd8808db78357743bbdd23a5Elliott Hughes // Disallow copy and assignment. 537ca6fd0dca02f7abdd8808db78357743bbdd23a5Elliott Hughes ScopedJavaUnicodeString(const ScopedJavaUnicodeString&); 547ca6fd0dca02f7abdd8808db78357743bbdd23a5Elliott Hughes void operator=(const ScopedJavaUnicodeString&); 55d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes}; 56d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes 57d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes#endif // SCOPED_JAVA_UNICODE_STRING_H_included 58