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