/*
 * Copyright (C) 2009 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_BYTE_ARRAY_H_included
#define SCOPED_BYTE_ARRAY_H_included

#include "JNIHelp.h"

// A smart pointer that provides read-only access to a Java byte[].
class ScopedByteArray {
public:
    ScopedByteArray(JNIEnv* env, jbyteArray byteArray)
    : mEnv(env), mByteArray(byteArray), mBytes(NULL)
    {
        mBytes = env->GetByteArrayElements(mByteArray, NULL);
    }

    ~ScopedByteArray() {
        if (mBytes) {
            mEnv->ReleaseByteArrayElements(mByteArray, mBytes, JNI_ABORT);
        }
    }

    const jbyte* bytes() const {
        return mBytes;
    }

    // Element access.
    const char& operator[](size_t n) const {
        const char* array = reinterpret_cast<const char*>(mBytes);
        return array[n];
    }

private:
    JNIEnv* mEnv;
    jbyteArray mByteArray;
    jbyte* mBytes;
};

#endif  // SCOPED_BYTE_ARRAY_H_included
