// Copyright 2017 The Cobalt Authors. All Rights Reserved.
//
// 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 STARBOARD_ANDROID_SHARED_JNI_UTILS_H_
#define STARBOARD_ANDROID_SHARED_JNI_UTILS_H_

#include <jni.h>

#include "starboard/android/shared/jni_env_ext.h"
#include "starboard/configuration.h"
#include "starboard/log.h"
#include "starboard/memory.h"

namespace starboard {
namespace android {
namespace shared {

// Wrapper class to manage the lifetime of a local reference to Java type
// |JT|. This is necessary for local references to |JT|s that are obtained in
// native code that was not called into from Java, since they will otherwise
// not be cleaned up.
template <typename JT>
class ScopedLocalJavaRef {
 public:
  explicit ScopedLocalJavaRef(jobject j_object = NULL)
      : jt_(static_cast<JT>(j_object)) {}
  ~ScopedLocalJavaRef() {
    if (jt_) {
      JniEnvExt::Get()->DeleteLocalRef(jt_);
      jt_ = NULL;
    }
  }
  JT Get() const { return jt_; }
  void Reset(jobject j_object) {
    if (jt_) {
      JniEnvExt::Get()->DeleteLocalRef(jt_);
    }
    jt_ = static_cast<JT>(j_object);
  }
  operator bool() const { return jt_; }

 private:
  JT jt_;

  SB_DISALLOW_COPY_AND_ASSIGN(ScopedLocalJavaRef);
};

// Convenience class to manage the lifetime of a local Java ByteBuffer
// reference, and provide accessors to its properties.
class ScopedJavaByteBuffer {
 public:
  explicit ScopedJavaByteBuffer(jobject j_byte_buffer)
      : j_byte_buffer_(j_byte_buffer) {}
  void* address() const {
    return JniEnvExt::Get()->GetDirectBufferAddress(j_byte_buffer_.Get());
  }
  jint capacity() const {
    return JniEnvExt::Get()->GetDirectBufferCapacity(j_byte_buffer_.Get());
  }
  bool IsNull() const { return !j_byte_buffer_ || !address(); }
  void CopyInto(const void* source, jint count) {
    SB_DCHECK(!IsNull());
    SB_DCHECK(count >= 0 && count <= capacity());
    SbMemoryCopy(address(), source, count);
  }

 private:
  ScopedLocalJavaRef<jobject> j_byte_buffer_;

  SB_DISALLOW_COPY_AND_ASSIGN(ScopedJavaByteBuffer);
};

}  // namespace shared
}  // namespace android
}  // namespace starboard

#endif  // STARBOARD_ANDROID_SHARED_JNI_UTILS_H_
