65 lines
1.4 KiB
C++
65 lines
1.4 KiB
C++
// 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_t offset, int whence) {
|
|
// not supported by Javas OutputStream
|
|
return -1;
|
|
}
|
|
|
|
int64_t 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;
|
|
}
|