summaryrefslogtreecommitdiff
path: root/Source/Android/jni/GameList/GameFileCache.cpp
diff options
context:
space:
mode:
authorJosJuice <josjuice@gmail.com>2018-06-01 09:36:29 +0200
committerJosJuice <josjuice@gmail.com>2018-06-06 17:34:07 +0200
commit1c027bc148574cf0b05cd04f8ce15132e8115170 (patch)
treecf7d352f8cc68bc26b37168f86c8314d448903a7 /Source/Android/jni/GameList/GameFileCache.cpp
parentdaee5a4b43e95f50a1b024348a19d7f2bb48bdbc (diff)
Use UICommon's game list code on Android
Deduplicates code, and gets rid of some problems the old code had (such as: bad performance when calling native functions, only one disc showing up for multi-disc games, Wii banners being low-res, unnecessarily much effort being needed for adding more metadata).
Diffstat (limited to 'Source/Android/jni/GameList/GameFileCache.cpp')
-rw-r--r--Source/Android/jni/GameList/GameFileCache.cpp121
1 files changed, 121 insertions, 0 deletions
diff --git a/Source/Android/jni/GameList/GameFileCache.cpp b/Source/Android/jni/GameList/GameFileCache.cpp
new file mode 100644
index 0000000000..4b3abf8c2f
--- /dev/null
+++ b/Source/Android/jni/GameList/GameFileCache.cpp
@@ -0,0 +1,121 @@
+// Copyright 2018 Dolphin Emulator Project
+// Licensed under GPLv2+
+// Refer to the license.txt file included.
+
+#include <memory>
+#include <vector>
+
+#include <jni.h>
+
+#include "UICommon/GameFileCache.h"
+#include "jni/AndroidCommon/AndroidCommon.h"
+#include "jni/AndroidCommon/IDCache.h"
+#include "jni/GameList/GameFile.h"
+
+namespace UICommon
+{
+class GameFile;
+}
+
+static UICommon::GameFileCache* GetPointer(JNIEnv* env, jobject obj)
+{
+ return reinterpret_cast<UICommon::GameFileCache*>(
+ env->GetLongField(obj, IDCache::GetGameFileCachePointer()));
+}
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+JNIEXPORT jlong JNICALL Java_org_dolphinemu_dolphinemu_model_GameFileCache_newGameFileCache(
+ JNIEnv* env, jobject obj, jstring path);
+JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_model_GameFileCache_finalize(JNIEnv* env,
+ jobject obj);
+JNIEXPORT jobjectArray JNICALL
+Java_org_dolphinemu_dolphinemu_model_GameFileCache_getAllGames(JNIEnv* env, jobject obj);
+JNIEXPORT jobject JNICALL Java_org_dolphinemu_dolphinemu_model_GameFileCache_addOrGet(JNIEnv* env,
+ jobject obj,
+ jstring path);
+JNIEXPORT jboolean JNICALL Java_org_dolphinemu_dolphinemu_model_GameFileCache_update(
+ JNIEnv* env, jobject obj, jobjectArray folder_paths);
+JNIEXPORT jboolean JNICALL
+Java_org_dolphinemu_dolphinemu_model_GameFileCache_updateAdditionalMetadata(JNIEnv* env,
+ jobject obj);
+JNIEXPORT jboolean JNICALL Java_org_dolphinemu_dolphinemu_model_GameFileCache_load(JNIEnv* env,
+ jobject obj);
+JNIEXPORT jboolean JNICALL Java_org_dolphinemu_dolphinemu_model_GameFileCache_save(JNIEnv* env,
+ jobject obj);
+
+JNIEXPORT jlong JNICALL Java_org_dolphinemu_dolphinemu_model_GameFileCache_newGameFileCache(
+ JNIEnv* env, jobject obj, jstring path)
+{
+ return reinterpret_cast<jlong>(new UICommon::GameFileCache(GetJString(env, path)));
+}
+
+JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_model_GameFileCache_finalize(JNIEnv* env,
+ jobject obj)
+{
+ delete GetPointer(env, obj);
+}
+
+JNIEXPORT jobjectArray JNICALL
+Java_org_dolphinemu_dolphinemu_model_GameFileCache_getAllGames(JNIEnv* env, jobject obj)
+{
+ const UICommon::GameFileCache* ptr = GetPointer(env, obj);
+ const jobjectArray array =
+ env->NewObjectArray(static_cast<jsize>(ptr->GetSize()), IDCache::GetGameFileClass(), nullptr);
+ jsize i = 0;
+ GetPointer(env, obj)->ForEach([env, array, &i](const auto& game_file) {
+ env->SetObjectArrayElement(array, i++, GameFileToJava(env, game_file));
+ });
+ return array;
+}
+
+JNIEXPORT jobject JNICALL Java_org_dolphinemu_dolphinemu_model_GameFileCache_addOrGet(JNIEnv* env,
+ jobject obj,
+ jstring path)
+{
+ bool cache_changed = false;
+ return GameFileToJava(env, GetPointer(env, obj)->AddOrGet(GetJString(env, path), &cache_changed));
+}
+
+JNIEXPORT jboolean JNICALL Java_org_dolphinemu_dolphinemu_model_GameFileCache_update(
+ JNIEnv* env, jobject obj, jobjectArray folder_paths)
+{
+ jsize size = env->GetArrayLength(folder_paths);
+
+ std::vector<std::string> folder_paths_vector;
+ folder_paths_vector.reserve(size);
+
+ for (jsize i = 0; i < size; ++i)
+ {
+ const jstring path = reinterpret_cast<jstring>(env->GetObjectArrayElement(folder_paths, i));
+ folder_paths_vector.push_back(GetJString(env, path));
+ env->DeleteLocalRef(path);
+ }
+
+ return GetPointer(env, obj)->Update(UICommon::FindAllGamePaths(folder_paths_vector, false));
+}
+
+JNIEXPORT jboolean JNICALL
+Java_org_dolphinemu_dolphinemu_model_GameFileCache_updateAdditionalMetadata(JNIEnv* env,
+ jobject obj)
+{
+ return GetPointer(env, obj)->UpdateAdditionalMetadata();
+}
+
+JNIEXPORT jboolean JNICALL Java_org_dolphinemu_dolphinemu_model_GameFileCache_load(JNIEnv* env,
+ jobject obj)
+{
+ return GetPointer(env, obj)->Load();
+}
+
+JNIEXPORT jboolean JNICALL Java_org_dolphinemu_dolphinemu_model_GameFileCache_save(JNIEnv* env,
+ jobject obj)
+{
+ return GetPointer(env, obj)->Save();
+}
+
+#ifdef __cplusplus
+}
+#endif