#include <fcntl.h>
#include <jni.h>
#include <memory>
#include <string>
#include "android_webview/browser/variations/variations_seed_loader.h"
#include "android_webview/browser_jni_headers/VariationsSeedLoader_jni.h"
#include "android_webview/proto/aw_variations_seed.pb.h"
#include "base/android/jni_string.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/files/scoped_file.h"
using base::android::ConvertJavaStringToUTF8;
using base::android::ConvertUTF8ToJavaString;
using base::android::JavaParamRef;
namespace android_webview {
AwVariationsSeed* g_seed = nullptr;
namespace {
bool IsSeedValid(AwVariationsSeed* seed) {
return seed->has_signature() && seed->has_date() && seed->has_country() &&
seed->has_is_gzip_compressed() && seed->has_seed_data();
}
}
static jboolean JNI_VariationsSeedLoader_ParseAndSaveSeedProto(
JNIEnv* env,
const JavaParamRef<jstring>& seed_path) {
std::unique_ptr<AwVariationsSeed> seed =
std::make_unique<AwVariationsSeed>(AwVariationsSeed::default_instance());
std::string native_seed_path = ConvertJavaStringToUTF8(seed_path);
base::ScopedFD seed_fd(open(native_seed_path.c_str(), O_RDONLY));
if (!seed->ParseFromFileDescriptor(seed_fd.get())) {
return false;
}
if (IsSeedValid(seed.get())) {
g_seed = seed.release();
return true;
} else {
return false;
}
}
static jboolean JNI_VariationsSeedLoader_ParseAndSaveSeedProtoFromByteArray(
JNIEnv* env,
const JavaParamRef<jbyteArray>& seed_as_bytes) {
std::unique_ptr<AwVariationsSeed> seed =
std::make_unique<AwVariationsSeed>(AwVariationsSeed::default_instance());
jbyte* src_bytes = env->GetByteArrayElements(seed_as_bytes, nullptr);
if (!seed->ParseFromArray(src_bytes,
env->GetArrayLength(seed_as_bytes.obj()))) {
return false;
}
if (IsSeedValid(seed.get())) {
g_seed = seed.release();
return true;
} else {
return false;
}
}
static jlong JNI_VariationsSeedLoader_GetSavedSeedDate(JNIEnv* env) {
return g_seed ? g_seed->date() : 0;
}
std::unique_ptr<AwVariationsSeed> TakeSeed() {
std::unique_ptr<AwVariationsSeed> seed(g_seed);
g_seed = nullptr;
return seed;
}
}