// Copyright 2013 The Chromium 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 "base/android/important_file_writer_android.h"

#include <string>

#include "base/android/jni_string.h"
#include "base/files/important_file_writer.h"
#include "jni/ImportantFileWriterAndroid_jni.h"

namespace base {
namespace android {

static jboolean WriteFileAtomically(JNIEnv* env,
                                    jclass /* clazz */,
                                    jstring file_name,
                                    jbyteArray data) {
  std::string native_file_name;
  base::android::ConvertJavaStringToUTF8(env, file_name, &native_file_name);
  base::FilePath path(native_file_name);
  int data_length = env->GetArrayLength(data);
  jbyte* native_data = env->GetByteArrayElements(data, NULL);
  std::string native_data_string(reinterpret_cast<char *>(native_data),
                                 data_length);
  bool result = base::ImportantFileWriter::WriteFileAtomically(
      path, native_data_string);
  env->ReleaseByteArrayElements(data, native_data, JNI_ABORT);
  return result;
}

bool RegisterImportantFileWriterAndroid(JNIEnv* env) {
  return RegisterNativesImpl(env);
}

}  // namespace android
}  // namespace base

// Copyright 2013 The Chromium 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 "base/android/important_file_writer_android.h"

#include <string>

#include "base/android/jni_string.h"
#include "base/files/important_file_writer.h"
#include "base/threading/thread_restrictions.h"
#include "jni/ImportantFileWriterAndroid_jni.h"

namespace base {
namespace android {

static jboolean WriteFileAtomically(JNIEnv* env,
                                    jclass /* clazz */,
                                    jstring file_name,
                                    jbyteArray data) {
  // This is called on the UI thread during shutdown to save tab data, so
  // needs to enable IO.
  base::ThreadRestrictions::ScopedAllowIO();
  std::string native_file_name;
  base::android::ConvertJavaStringToUTF8(env, file_name, &native_file_name);
  base::FilePath path(native_file_name);
  int data_length = env->GetArrayLength(data);
  jbyte* native_data = env->GetByteArrayElements(data, NULL);
  std::string native_data_string(reinterpret_cast<char *>(native_data),
                                 data_length);
  bool result = base::ImportantFileWriter::WriteFileAtomically(
      path, native_data_string);
  env->ReleaseByteArrayElements(data, native_data, JNI_ABORT);
  return result;
}

bool RegisterImportantFileWriterAndroid(JNIEnv* env) {
  return RegisterNativesImpl(env);
}

}  // namespace android
}  // namespace base

Allow atomic file writes from Android on the UI thread.
Allow atomic file writes from Android on the UI thread.

This is needed because Android writes its tab data during closedown or
when the browser goes into the background. This has to be done on
the UI thread to ensure timely completion.

BUG=148011

Review URL: https://codereview.chromium.org/12457007
Patch from Anthony Berent <aberent@chromium.org>.

git-svn-id: de016e52bd170d2d4f2344f9bf92d50478b649e0@186392 0039d316-1c4b-4281-b951-d872f2087c98
