12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/android/important_file_writer_android.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string> 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/android/jni_string.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/important_file_writer.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/threading/thread_restrictions.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "jni/ImportantFileWriterAndroid_jni.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base { 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace android { 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static jboolean WriteFileAtomically(JNIEnv* env, 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) jclass /* clazz */, 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) jstring file_name, 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) jbyteArray data) { 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This is called on the UI thread during shutdown to save tab data, so 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // needs to enable IO. 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ThreadRestrictions::ScopedAllowIO allow_io; 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string native_file_name; 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::android::ConvertJavaStringToUTF8(env, file_name, &native_file_name); 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath path(native_file_name); 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int data_length = env->GetArrayLength(data); 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) jbyte* native_data = env->GetByteArrayElements(data, NULL); 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string native_data_string(reinterpret_cast<char *>(native_data), 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data_length); 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool result = base::ImportantFileWriter::WriteFileAtomically( 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) path, native_data_string); 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) env->ReleaseByteArrayElements(data, native_data, JNI_ABORT); 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RegisterImportantFileWriterAndroid(JNIEnv* env) { 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return RegisterNativesImpl(env); 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace android 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace base 43