java/File: add method ToAbsolutePath() returning AllocatedPath
This commit is contained in:
parent
e44c9a000d
commit
5268f55344
|
@ -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)
|
||||||
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 *
|
return Java::File::ToAbsolutePath(env, file);
|
||||||
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);
|
|
||||||
path2.CopyTo(env, buffer, max_size);
|
|
||||||
return buffer;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
/**
|
/**
|
||||||
* 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()
|
||||||
#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
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* 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 @@
|
||||||
* 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)
|
||||||
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);
|
||||||
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* 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 @@
|
||||||
|
|
||||||
#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 {
|
||||||
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);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue