Commit b8f1850b authored by Max Kellermann's avatar Max Kellermann

db/Configured: store database file in cache directory

Add class Context which wraps the Android/Java Context class and add a JNI wrapper for method Context.getCacheDir().
parent 5268f553
...@@ -254,6 +254,7 @@ libjava_a_SOURCES = \ ...@@ -254,6 +254,7 @@ libjava_a_SOURCES = \
noinst_LIBRARIES += libandroid.a noinst_LIBRARIES += libandroid.a
libandroid_a_SOURCES = \ libandroid_a_SOURCES = \
src/android/Context.cxx src/android/Context.hxx \
src/android/Environment.cxx src/android/Environment.hxx src/android/Environment.cxx src/android/Environment.hxx
libandroid_a_CPPFLAGS = $(AM_CPPFLAGS) -Iandroid/build/include libandroid_a_CPPFLAGS = $(AM_CPPFLAGS) -Iandroid/build/include
......
...@@ -19,9 +19,11 @@ ...@@ -19,9 +19,11 @@
package org.musicpd; package org.musicpd;
import android.content.Context;
/** /**
* Bridge to native code. * Bridge to native code.
*/ */
public class Bridge { public class Bridge {
public static native void run(); public static native void run(Context context);
} }
...@@ -57,6 +57,6 @@ public class Main extends Activity implements Runnable { ...@@ -57,6 +57,6 @@ public class Main extends Activity implements Runnable {
} }
@Override public void run() { @Override public void run() {
Bridge.run(); Bridge.run(this);
} }
} }
...@@ -93,6 +93,7 @@ ...@@ -93,6 +93,7 @@
#include "java/Global.hxx" #include "java/Global.hxx"
#include "java/File.hxx" #include "java/File.hxx"
#include "android/Environment.hxx" #include "android/Environment.hxx"
#include "android/Context.hxx"
#include "org_musicpd_Bridge.h" #include "org_musicpd_Bridge.h"
#endif #endif
...@@ -118,6 +119,10 @@ static constexpr unsigned DEFAULT_BUFFER_BEFORE_PLAY = 10; ...@@ -118,6 +119,10 @@ static constexpr unsigned DEFAULT_BUFFER_BEFORE_PLAY = 10;
static constexpr Domain main_domain("main"); static constexpr Domain main_domain("main");
#ifdef ANDROID
Context *context;
#endif
Instance *instance; Instance *instance;
static StateFile *state_file; static StateFile *state_file;
...@@ -679,14 +684,17 @@ int mpd_main(int argc, char *argv[]) ...@@ -679,14 +684,17 @@ int mpd_main(int argc, char *argv[])
gcc_visibility_default gcc_visibility_default
JNIEXPORT void JNICALL JNIEXPORT void JNICALL
Java_org_musicpd_Bridge_run(JNIEnv *env, jclass) Java_org_musicpd_Bridge_run(JNIEnv *env, jclass, jobject _context)
{ {
Java::Init(env); Java::Init(env);
Java::File::Initialise(env); Java::File::Initialise(env);
Environment::Initialise(env); Environment::Initialise(env);
context = new Context(env, _context);
mpd_main(0, nullptr); mpd_main(0, nullptr);
delete context;
Environment::Deinitialise(env); Environment::Deinitialise(env);
} }
......
...@@ -21,8 +21,13 @@ ...@@ -21,8 +21,13 @@
#define MPD_MAIN_HXX #define MPD_MAIN_HXX
class EventLoop; class EventLoop;
class Context;
struct Instance; struct Instance;
#ifdef ANDROID
extern Context *context;
#endif
extern Instance *instance; extern Instance *instance;
#ifndef ANDROID #ifndef ANDROID
......
/*
* Copyright (C) 2003-2014 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "config.h"
#include "Context.hxx"
#include "java/Class.hxx"
#include "java/File.hxx"
#include "fs/AllocatedPath.hxx"
AllocatedPath
Context::GetCacheDir(JNIEnv *env) const
{
assert(env != nullptr);
Java::Class cls(env, env->GetObjectClass(Get()));
jmethodID method = env->GetMethodID(cls, "getCacheDir",
"()Ljava/io/File;");
assert(method);
jobject file = env->CallObjectMethod(Get(), method);
if (file == nullptr) {
env->ExceptionClear();
return AllocatedPath::Null();
}
return Java::File::ToAbsolutePath(env, file);
}
/*
* Copyright (C) 2003-2014 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef MPD_ANDROID_CONTEXT_HXX
#define MPD_ANDROID_CONTEXT_HXX
#include "java/Object.hxx"
class AllocatedPath;
class Context : public Java::Object {
public:
Context(JNIEnv *env, jobject obj):Java::Object(env, obj) {}
gcc_pure
AllocatedPath GetCacheDir(JNIEnv *env) const;
};
#endif
...@@ -26,6 +26,13 @@ ...@@ -26,6 +26,13 @@
#include "util/Error.hxx" #include "util/Error.hxx"
#include "Log.hxx" #include "Log.hxx"
#ifdef ANDROID
#include "Main.hxx"
#include "android/Context.hxx"
#include "fs/AllocatedPath.hxx"
#include "plugins/simple/SimpleDatabasePlugin.hxx"
#endif
Database * Database *
CreateConfiguredDatabase(EventLoop &loop, DatabaseListener &listener, CreateConfiguredDatabase(EventLoop &loop, DatabaseListener &listener,
Error &error) Error &error)
...@@ -49,9 +56,26 @@ CreateConfiguredDatabase(EventLoop &loop, DatabaseListener &listener, ...@@ -49,9 +56,26 @@ CreateConfiguredDatabase(EventLoop &loop, DatabaseListener &listener,
param = allocated; param = allocated;
} }
if (param == nullptr) if (param == nullptr) {
#ifdef ANDROID
/* if there is no override, use the Android cache
directory */
const AllocatedPath cache_dir =
context->GetCacheDir(Java::GetEnv());
if (cache_dir.IsNull())
return nullptr; return nullptr;
const auto db_file = AllocatedPath::Build(cache_dir, "mpd.db");
allocated = new config_param("database");
allocated->AddBlockParam("path", db_file.c_str(), -1);
param = allocated;
#else
return nullptr;
#endif
}
Database *db = DatabaseGlobalInit(loop, listener, *param, Database *db = DatabaseGlobalInit(loop, listener, *param,
error); error);
delete allocated; delete allocated;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment