| // 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; |
| } |