1645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Copyright 2015 The Chromium Authors. All rights reserved.
2645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Use of this source code is governed by a BSD-style license that can be
3645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// found in the LICENSE file.
4645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
5645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include <jni.h>
6645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
7645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/android/apk_assets.h"
8645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
9645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/android/context_utils.h"
10645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/android/jni_array.h"
11645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/android/jni_string.h"
12645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/android/scoped_java_ref.h"
13cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli#include "base/file_descriptor_store.h"
14645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "jni/ApkAssets_jni.h"
15645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
16645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveznamespace base {
17645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveznamespace android {
18645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
19645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezint OpenApkAsset(const std::string& file_path,
20645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                 base::MemoryMappedFile::Region* region) {
21cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli  // The AssetManager API of the NDK does not expose a method for accessing raw
22cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli  // resources :(
23645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  JNIEnv* env = base::android::AttachCurrentThread();
24645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  ScopedJavaLocalRef<jlongArray> jarr = Java_ApkAssets_open(
25cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli      env, base::android::GetApplicationContext(),
26cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli      base::android::ConvertUTF8ToJavaString(env, file_path));
27645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  std::vector<jlong> results;
28645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  base::android::JavaLongArrayToLongVector(env, jarr.obj(), &results);
29645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  CHECK_EQ(3U, results.size());
30645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  int fd = static_cast<int>(results[0]);
31645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  region->offset = results[1];
32645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  region->size = results[2];
33645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  return fd;
34645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}
35645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
36cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civellibool RegisterApkAssetWithFileDescriptorStore(const std::string& key,
37cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli                                             const base::FilePath& file_path) {
38645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  base::MemoryMappedFile::Region region =
39645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez      base::MemoryMappedFile::Region::kWholeFile;
40cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli  int asset_fd = OpenApkAsset(file_path.value(), &region);
41cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli  if (asset_fd == -1)
42cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli    return false;
43cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli  base::FileDescriptorStore::GetInstance().Set(key, base::ScopedFD(asset_fd),
44cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli                                               region);
45cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli  return true;
46645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}
47645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
48645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}  // namespace android
49645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}  // namespace base
50