blob: cc87920a5ca2b13d6bab7c4894991d1f39f2a23c [file] [log] [blame]
// Copyright (c) 2014 The Chromium Embedded Framework Authors. All rights
// reserved. Use of this source code is governed by a BSD-style license that
// can be found in the LICENSE file.
#include "write_handler.h"
#include "jni_util.h"
#include "util.h"
WriteHandler::WriteHandler(JNIEnv* env, jobject jOutputStream)
: handle_(env, jOutputStream) {}
WriteHandler::~WriteHandler() {
ScopedJNIEnv env;
if (!env)
return;
if (handle_) {
JNI_CALL_VOID_METHOD(env, handle_, "close", "()V");
}
}
size_t WriteHandler::Write(const void* ptr, size_t size, size_t n) {
base::AutoLock lock_scope(lock_);
size_t rv = n;
ScopedJNIEnv env;
if (!env)
return rv;
jbyteArray jbyteArray = env->NewByteArray((jsize)(size * n));
env->SetByteArrayRegion(jbyteArray, 0, (jsize)(size * n), (const jbyte*)ptr);
JNI_CALL_VOID_METHOD_EX(env, handle_, "write", "([B)V", jbyteArray);
if (env->ExceptionOccurred()) {
env->ExceptionClear();
rv = 0;
}
offset_ += (rv * size);
env->DeleteLocalRef(jbyteArray);
return rv;
}
int WriteHandler::Seek(int64 offset, int whence) {
// not supported by Javas OutputStream
return -1;
}
int64 WriteHandler::Tell() {
return offset_;
}
int WriteHandler::Flush() {
ScopedJNIEnv env;
if (env) {
JNI_CALL_VOID_METHOD(env, handle_, "flush", "()V");
}
return 0;
}
bool WriteHandler::MayBlock() {
return false;
}