| /* | |
| * Copyright (C) 2010 The Android Open Source Project | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); | |
| * you may not use this file except in compliance with the License. | |
| * You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| */ | |
| #ifndef SCOPED_JAVA_UNICODE_STRING_H_included | |
| #define SCOPED_JAVA_UNICODE_STRING_H_included | |
| #include "JNIHelp.h" | |
| #include "unicode/unistr.h" | |
| // A smart pointer that provides access to an ICU UnicodeString given a JNI | |
| // jstring. We give ICU a direct pointer to the characters on the Java heap. | |
| // It's clever enough to copy-on-write if necessary. | |
| class ScopedJavaUnicodeString { | |
| public: | |
| ScopedJavaUnicodeString(JNIEnv* env, jstring s) : mEnv(env), mString(s) { | |
| if (s == NULL) { | |
| jniThrowNullPointerException(mEnv, NULL); | |
| } else { | |
| mChars = env->GetStringChars(mString, NULL); | |
| const int32_t charCount = env->GetStringLength(mString); | |
| mUnicodeString.setTo(false, mChars, charCount); | |
| } | |
| } | |
| ~ScopedJavaUnicodeString() { | |
| if (mString != NULL) { | |
| mEnv->ReleaseStringChars(mString, mChars); | |
| } | |
| } | |
| bool valid() const { | |
| return (mString != NULL); | |
| } | |
| const icu::UnicodeString& unicodeString() const { | |
| return mUnicodeString; | |
| } | |
| icu::UnicodeString& unicodeString() { | |
| return mUnicodeString; | |
| } | |
| private: | |
| JNIEnv* mEnv; | |
| jstring mString; | |
| const UChar* mChars; | |
| icu::UnicodeString mUnicodeString; | |
| // Disallow copy and assignment. | |
| ScopedJavaUnicodeString(const ScopedJavaUnicodeString&); | |
| void operator=(const ScopedJavaUnicodeString&); | |
| }; | |
| #endif // SCOPED_JAVA_UNICODE_STRING_H_included |