Commit 5268f553 authored by Max Kellermann's avatar Max Kellermann

java/File: add method ToAbsolutePath() returning AllocatedPath

parent e44c9a00
...@@ -17,18 +17,18 @@ ...@@ -17,18 +17,18 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/ */
#include "config.h"
#include "Environment.hxx" #include "Environment.hxx"
#include "java/Class.hxx" #include "java/Class.hxx"
#include "java/String.hxx" #include "java/String.hxx"
#include "java/File.hxx" #include "java/File.hxx"
#include "util/StringUtil.hxx" #include "util/StringUtil.hxx"
#include "fs/AllocatedPath.hxx"
namespace Environment { namespace Environment {
static Java::TrivialClass cls; static Java::TrivialClass cls;
static jmethodID getExternalStorageDirectory_method; static jmethodID getExternalStorageDirectory_method;
static jmethodID getExternalStoragePublicDirectory_method; static jmethodID getExternalStoragePublicDirectory_method;
static jstring getExternalStorageDirectory(JNIEnv *env);
}; };
void void
...@@ -51,63 +51,35 @@ Environment::Deinitialise(JNIEnv *env) ...@@ -51,63 +51,35 @@ Environment::Deinitialise(JNIEnv *env)
cls.Clear(env); cls.Clear(env);
} }
static jstring AllocatedPath
ToAbsolutePathChecked(JNIEnv *env, jobject file) Environment::getExternalStorageDirectory()
{
if (file == nullptr)
return nullptr;
jstring path = Java::File::getAbsolutePath(env, file);
env->DeleteLocalRef(file);
return path;
}
static jstring
Environment::getExternalStorageDirectory(JNIEnv *env)
{
jobject file = env->CallStaticObjectMethod(cls,
getExternalStorageDirectory_method);
return ToAbsolutePathChecked(env, file);
}
char *
Environment::getExternalStorageDirectory(char *buffer, size_t max_size)
{ {
JNIEnv *env = Java::GetEnv(); JNIEnv *env = Java::GetEnv();
jstring value = getExternalStorageDirectory(env); jobject file =
if (value == nullptr) env->CallStaticObjectMethod(cls,
return nullptr; getExternalStorageDirectory_method);
if (file == nullptr)
return AllocatedPath::Null();
Java::String value2(env, value); return Java::File::ToAbsolutePath(env, file);
value2.CopyTo(env, buffer, max_size);
return buffer;
} }
static jstring AllocatedPath
getExternalStoragePublicDirectory(JNIEnv *env, const char *type) Environment::getExternalStoragePublicDirectory(const char *type)
{ {
if (Environment::getExternalStoragePublicDirectory_method == nullptr) if (getExternalStoragePublicDirectory_method == nullptr)
/* needs API level 8 */ /* needs API level 8 */
return nullptr; return AllocatedPath::Null();
JNIEnv *env = Java::GetEnv();
Java::String type2(env, type); Java::String type2(env, type);
jobject file = env->CallStaticObjectMethod(Environment::cls, jobject file = env->CallStaticObjectMethod(Environment::cls,
Environment::getExternalStoragePublicDirectory_method, Environment::getExternalStoragePublicDirectory_method,
type2.Get()); type2.Get());
return ToAbsolutePathChecked(env, file); if (file == nullptr)
} return AllocatedPath::Null();
char *
Environment::getExternalStoragePublicDirectory(char *buffer, size_t max_size,
const char *type)
{
JNIEnv *env = Java::GetEnv();
jstring path = ::getExternalStoragePublicDirectory(env, type);
if (path == nullptr)
return nullptr;
Java::String path2(env, path); return Java::File::ToAbsolutePath(env, file);
path2.CopyTo(env, buffer, max_size);
return buffer;
} }
...@@ -20,8 +20,11 @@ ...@@ -20,8 +20,11 @@
#ifndef MPD_ANDROID_ENVIRONMENT_HXX #ifndef MPD_ANDROID_ENVIRONMENT_HXX
#define MPD_ANDROID_ENVIRONMENT_HXX #define MPD_ANDROID_ENVIRONMENT_HXX
#include "Compiler.h"
#include <jni.h> #include <jni.h>
#include <stddef.h>
class AllocatedPath;
namespace Environment { namespace Environment {
void Initialise(JNIEnv *env); void Initialise(JNIEnv *env);
...@@ -30,10 +33,11 @@ namespace Environment { ...@@ -30,10 +33,11 @@ namespace Environment {
/** /**
* Determine the mount point of the external SD card. * Determine the mount point of the external SD card.
*/ */
char *getExternalStorageDirectory(char *buffer, size_t max_size); gcc_pure
AllocatedPath getExternalStorageDirectory();
char *getExternalStoragePublicDirectory(char *buffer, size_t max_size, gcc_pure
const char *type); AllocatedPath getExternalStoragePublicDirectory(const char *type);
}; };
#endif #endif
...@@ -246,13 +246,7 @@ AllocatedPath GetUserMusicDir() ...@@ -246,13 +246,7 @@ AllocatedPath GetUserMusicDir()
#elif defined(USE_XDG) #elif defined(USE_XDG)
return GetUserDir("XDG_MUSIC_DIR"); return GetUserDir("XDG_MUSIC_DIR");
#elif defined(ANDROID) #elif defined(ANDROID)
char buffer[1024]; return Environment::getExternalStoragePublicDirectory("Music");
if (Environment::getExternalStoragePublicDirectory(buffer,
sizeof(buffer),
"Music") == nullptr)
return AllocatedPath::Null();
return AllocatedPath::FromUTF8(buffer);
#else #else
return AllocatedPath::Null(); return AllocatedPath::Null();
#endif #endif
......
/* /*
* Copyright (C) 2010-2012 Max Kellermann <max@duempel.org> * Copyright (C) 2010-2014 Max Kellermann <max@duempel.org>
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
...@@ -27,8 +27,13 @@ ...@@ -27,8 +27,13 @@
* OF THE POSSIBILITY OF SUCH DAMAGE. * OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "config.h"
#include "File.hxx" #include "File.hxx"
#include "Class.hxx" #include "Class.hxx"
#include "String.hxx"
#include "Object.hxx"
#include "fs/AllocatedPath.hxx"
#include "fs/Limits.hxx"
jmethodID Java::File::getAbsolutePath_method; jmethodID Java::File::getAbsolutePath_method;
...@@ -40,3 +45,23 @@ Java::File::Initialise(JNIEnv *env) ...@@ -40,3 +45,23 @@ Java::File::Initialise(JNIEnv *env)
getAbsolutePath_method = env->GetMethodID(cls, "getAbsolutePath", getAbsolutePath_method = env->GetMethodID(cls, "getAbsolutePath",
"()Ljava/lang/String;"); "()Ljava/lang/String;");
} }
AllocatedPath
Java::File::ToAbsolutePath(JNIEnv *env, jobject _file)
{
assert(env != nullptr);
assert(_file != nullptr);
LocalObject file(env, _file);
const jstring path = getAbsolutePath(env, file);
if (path == nullptr) {
env->ExceptionClear();
return AllocatedPath::Null();
}
Java::String path2(env, path);
char buffer[MPD_PATH_MAX];
path2.CopyTo(env, buffer, sizeof(buffer));
return AllocatedPath::FromUTF8(buffer);
}
/* /*
* Copyright (C) 2010-2012 Max Kellermann <max@duempel.org> * Copyright (C) 2010-2014 Max Kellermann <max@duempel.org>
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
...@@ -34,6 +34,8 @@ ...@@ -34,6 +34,8 @@
#include <jni.h> #include <jni.h>
class AllocatedPath;
namespace Java { namespace Java {
/** /**
* Wrapper for a java.io.File object. * Wrapper for a java.io.File object.
...@@ -42,12 +44,22 @@ namespace Java { ...@@ -42,12 +44,22 @@ namespace Java {
static jmethodID getAbsolutePath_method; static jmethodID getAbsolutePath_method;
public: public:
gcc_nonnull_all
static void Initialise(JNIEnv *env); static void Initialise(JNIEnv *env);
gcc_nonnull_all
static jstring getAbsolutePath(JNIEnv *env, jobject file) { static jstring getAbsolutePath(JNIEnv *env, jobject file) {
return (jstring)env->CallObjectMethod(file, return (jstring)env->CallObjectMethod(file,
getAbsolutePath_method); getAbsolutePath_method);
} }
/**
* Invoke File.getAbsolutePath() and release the
* specified File reference.
*/
gcc_pure gcc_nonnull_all
static AllocatedPath ToAbsolutePath(JNIEnv *env,
jobject file);
}; };
} }
......
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