Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8942e5a3 authored by Kenny Root's avatar Kenny Root Committed by android code review
Browse files

Merge "Use libcore Posix class for StatFs implementation"

parents 48de12c5 bdd23ae9
Loading
Loading
Loading
Loading
+52 −34
Original line number Diff line number Diff line
@@ -16,59 +16,77 @@

package android.os;

import libcore.io.ErrnoException;
import libcore.io.Libcore;
import libcore.io.StructStatFs;

/**
 * Retrieve overall information about the space on a filesystem. This is a
 * Wrapper for Unix statfs().
 * wrapper for Unix statfs().
 */
public class StatFs {
    private StructStatFs mStat;

    /**
     * Construct a new StatFs for looking at the stats of the
     * filesystem at <var>path</var>.  Upon construction, the stat of
     * the file system will be performed, and the values retrieved available
     * from the methods on this class.
     * Construct a new StatFs for looking at the stats of the filesystem at
     * {@code path}. Upon construction, the stat of the file system will be
     * performed, and the values retrieved available from the methods on this
     * class.
     *
     * @param path A path in the desired file system to state.
     * @param path path in the desired file system to stat.
     */
    public StatFs(String path) { native_setup(path); }
    public StatFs(String path) {
        mStat = doStat(path);
    }

    private static StructStatFs doStat(String path) {
        try {
            return Libcore.os.statfs(path);
        } catch (ErrnoException e) {
            throw new IllegalArgumentException("Invalid path: " + path, e);
        }
    }

    /**
     * Perform a restat of the file system referenced by this object.  This
     * is the same as re-constructing the object with the same file system
     * path, and the new stat values are available upon return.
     * Perform a restat of the file system referenced by this object. This is
     * the same as re-constructing the object with the same file system path,
     * and the new stat values are available upon return.
     */
    public void restat(String path) { native_restat(path); }

    @Override
    protected void finalize() { native_finalize(); }
    public void restat(String path) {
        mStat = doStat(path);
    }

    /**
     * The size, in bytes, of a block on the file system.  This corresponds
     * to the Unix statfs.f_bsize field.
     * The size, in bytes, of a block on the file system. This corresponds to
     * the Unix {@code statfs.f_bsize} field.
     */
    public native int getBlockSize();
    public int getBlockSize() {
        return (int) mStat.f_bsize;
    }

    /**
     * The total number of blocks on the file system.  This corresponds
     * to the Unix statfs.f_blocks field.
     * The total number of blocks on the file system. This corresponds to the
     * Unix {@code statfs.f_blocks} field.
     */
    public native int getBlockCount();
    public int getBlockCount() {
        return (int) mStat.f_blocks;
    }

    /**
     * The total number of blocks that are free on the file system, including
     * reserved blocks (that are not available to normal applications). This
     * corresponds to the Unix statfs.f_bfree field.  Most applications will
     * want to use {@link #getAvailableBlocks()} instead.
     * corresponds to the Unix {@code statfs.f_bfree} field. Most applications
     * will want to use {@link #getAvailableBlocks()} instead.
     */
    public native int getFreeBlocks();
    public int getFreeBlocks() {
        return (int) mStat.f_bfree;
    }

    /**
     * The number of blocks that are free on the file system and available to
     * applications.  This corresponds to the Unix statfs.f_bavail field.
     * applications. This corresponds to the Unix {@code statfs.f_bavail} field.
     */
    public native int getAvailableBlocks();    
    
    private int mNativeContext;
    private native void native_restat(String path);
    private native void native_setup(String path);
    private native void native_finalize();
    public int getAvailableBlocks() {
        return (int) mStat.f_bavail;
    }
}
+0 −1
Original line number Diff line number Diff line
@@ -67,7 +67,6 @@ LOCAL_SRC_FILES:= \
	android_os_ParcelFileDescriptor.cpp \
	android_os_Parcel.cpp \
	android_os_SELinux.cpp \
	android_os_StatFs.cpp \
	android_os_SystemClock.cpp \
	android_os_SystemProperties.cpp \
	android_os_Trace.cpp \

core/jni/android_os_StatFs.cpp

deleted100644 → 0
+0 −163
Original line number Diff line number Diff line
/*
 * Copyright 2007, The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#if INCLUDE_SYS_MOUNT_FOR_STATFS
#include <sys/mount.h>
#else
#include <sys/statfs.h>
#endif

#include <errno.h>

#include "jni.h"
#include "JNIHelp.h"
#include "android_runtime/AndroidRuntime.h"


namespace android
{

// ----------------------------------------------------------------------------

struct fields_t {
    jfieldID    context;
};
static fields_t fields;

// ----------------------------------------------------------------------------

static jint
android_os_StatFs_getBlockSize(JNIEnv *env, jobject thiz)
{
    struct statfs *stat = (struct statfs *)env->GetIntField(thiz, fields.context);
    return stat->f_bsize;
}

static jint
android_os_StatFs_getBlockCount(JNIEnv *env, jobject thiz)
{
    struct statfs *stat = (struct statfs *)env->GetIntField(thiz, fields.context);
    return stat->f_blocks;
}

static jint
android_os_StatFs_getFreeBlocks(JNIEnv *env, jobject thiz)
{
    struct statfs *stat = (struct statfs *)env->GetIntField(thiz, fields.context);
    return stat->f_bfree;
}

static jint
android_os_StatFs_getAvailableBlocks(JNIEnv *env, jobject thiz)
{
    struct statfs *stat = (struct statfs *)env->GetIntField(thiz, fields.context);
    return stat->f_bavail;
}

static void
android_os_StatFs_native_restat(JNIEnv *env, jobject thiz, jstring path)
{
    if (path == NULL) {
        jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
        return;
    }

    // get the object handle
    struct statfs *stat = (struct statfs *)env->GetIntField(thiz, fields.context);
    if (stat == NULL) {
        jniThrowException(env, "java/lang/NoSuchFieldException", NULL);
        return;
    }

    const char* pathstr = env->GetStringUTFChars(path, NULL);
    if (pathstr == NULL) {
        jniThrowException(env, "java/lang/RuntimeException", "Out of memory");
        return;
    }

    // note that stat will contain the new file data corresponding to
    // pathstr
    if (statfs(pathstr, stat) != 0) {
        ALOGE("statfs %s failed, errno: %d", pathstr, errno);
        delete stat;
        env->SetIntField(thiz, fields.context, 0);
        jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
    }
    // Release pathstr
    env->ReleaseStringUTFChars(path, pathstr);
}

static void
android_os_StatFs_native_setup(JNIEnv *env, jobject thiz, jstring path)
{
    if (path == NULL) {
        jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
        return;
    }

    struct statfs* stat = new struct statfs;
    if (stat == NULL) {
        jniThrowException(env, "java/lang/RuntimeException", "Out of memory");
        return;
    }
    env->SetIntField(thiz, fields.context, (int)stat);
    android_os_StatFs_native_restat(env, thiz, path);
}

static void
android_os_StatFs_native_finalize(JNIEnv *env, jobject thiz)
{
    struct statfs *stat = (struct statfs *)env->GetIntField(thiz, fields.context);
    if (stat != NULL) {
        delete stat;
        env->SetIntField(thiz, fields.context, 0);
    }
}

// ----------------------------------------------------------------------------

static JNINativeMethod gMethods[] = {
    {"getBlockSize",       "()I",                       (void *)android_os_StatFs_getBlockSize},
    {"getBlockCount",      "()I",                       (void *)android_os_StatFs_getBlockCount},
    {"getFreeBlocks",      "()I",                       (void *)android_os_StatFs_getFreeBlocks},
    {"getAvailableBlocks", "()I",                       (void *)android_os_StatFs_getAvailableBlocks},
    {"native_setup",       "(Ljava/lang/String;)V",     (void *)android_os_StatFs_native_setup},
    {"native_finalize",    "()V",                       (void *)android_os_StatFs_native_finalize},
    {"native_restat",      "(Ljava/lang/String;)V",     (void *)android_os_StatFs_native_restat},
};


int register_android_os_StatFs(JNIEnv *env)
{
    jclass clazz;

    clazz = env->FindClass("android/os/StatFs");
    if (clazz == NULL) {
        ALOGE("Can't find android/os/StatFs");
        return -1;
    }

    fields.context = env->GetFieldID(clazz, "mNativeContext", "I");
    if (fields.context == NULL) {
        ALOGE("Can't find StatFs.mNativeContext");
        return -1;
    }

    return AndroidRuntime::registerNativeMethods(env,
            "android/os/StatFs", gMethods, NELEM(gMethods));
}

}   // namespace android