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

Commit 086d084d authored by Kenny Root's avatar Kenny Root
Browse files

Add AStorageManager API to NDK

AStorageManager allows users of the NDK to access OBBs for now.

Change-Id: I8a25757901a175aa90a9f3e8c2a5db7873e8615e
parent be857d42
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -12,7 +12,8 @@ LOCAL_SRC_FILES:= \
    looper.cpp \
    native_activity.cpp \
    native_window.cpp \
    sensor.cpp
    sensor.cpp \
    storage_manager.cpp

LOCAL_SHARED_LIBRARIES := \
    libcutils \
@@ -23,6 +24,9 @@ LOCAL_SHARED_LIBRARIES := \
    libsurfaceflinger_client \
    libandroid_runtime

LOCAL_STATIC_LIBRARIES := \
    libstorage

LOCAL_C_INCLUDES += \
    frameworks/base/native/include \
    frameworks/base/core/jni/android \
+141 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2010 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.
 */

#define LOG_TAG "NStorage"

#include <android/storage_manager.h>
#include <storage/IMountService.h>

#include <binder/Binder.h>
#include <binder/IServiceManager.h>
#include <utils/Log.h>
#include <utils/RefBase.h>
#include <utils/String8.h>
#include <utils/String16.h>


using namespace android;

struct ObbActionListener : public BnObbActionListener {
private:
    sp<AStorageManager> mStorageManager;

public:
    ObbActionListener(AStorageManager* mgr) :
            mStorageManager(mgr)
    {}

    virtual void onObbResult(const android::String16& filename, const android::String16& state) {
        LOGD("Got obb result (%s, %s)\n", String8(filename).string(), String8(state).string());
    }
};

struct AStorageManager : public RefBase {
protected:
    void* mObbCallback;
    sp<ObbActionListener> mObbActionListener;
    sp<IMountService> mMountService;

public:
    AStorageManager() :
            mObbCallback(NULL)
    {
    }

    bool initialize() {
        sp<IServiceManager> sm = defaultServiceManager();
        if (sm == NULL) {
            LOGE("Couldn't get default ServiceManager\n");
            return false;
        }

        mMountService = interface_cast<IMountService>(sm->getService(String16("mount")));
        if (mMountService == NULL) {
            LOGE("Couldn't get connection to MountService\n");
            return false;
        }

        mObbActionListener = new ObbActionListener(this);

        return true;
    }

    void setObbCallback(void* cb) {
        mObbCallback = cb;
    }

    void mountObb(const char* filename, const char* key) {
        String16 filename16(filename);
        String16 key16(key);
        mMountService->mountObb(filename16, key16, mObbActionListener);
    }

    void unmountObb(const char* filename, const bool force) {
        String16 filename16(filename);
        mMountService->unmountObb(filename16, force);
    }

    int isObbMounted(const char* filename) {
        String16 filename16(filename);
        return mMountService->isObbMounted(filename16);
    }

    const char* getMountedObbPath(const char* filename) {
        String16 filename16(filename);
        String16 path16;
        if (mMountService->getMountedObbPath(filename16, path16)) {
            return String8(path16).string();
        } else {
            return NULL;
        }
    }
};


AStorageManager* AStorageManager_new() {
    sp<AStorageManager> mgr = new AStorageManager();
    if (mgr == NULL || !mgr->initialize()) {
        return NULL;
    }
    mgr->incStrong((void*)AStorageManager_new);
    return static_cast<AStorageManager*>(mgr.get());
}

void AStorageManager_delete(AStorageManager* mgr) {
    if (mgr) {
        mgr->decStrong((void*)AStorageManager_new);
    }
}

void AStorageManager_setObbCallback(AStorageManager* mgr, void* cb) {
    mgr->setObbCallback(cb);
}

void AStorageManager_mountObb(AStorageManager* mgr, const char* filename, const char* key) {
    mgr->mountObb(filename, key);
}

void AStorageManager_unmountObb(AStorageManager* mgr, const char* filename, const int force) {
    mgr->unmountObb(filename, force != 0);
}

int AStorageManager_isObbMounted(AStorageManager* mgr, const char* filename) {
    return mgr->isObbMounted(filename) != 0;
}

const char* AStorageManager_getMountedObbPath(AStorageManager* mgr, const char* filename) {
    return mgr->getMountedObbPath(filename);
}
+69 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2010 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.
 */


#ifndef ANDROID_STORAGE_MANAGER_H
#define ANDROID_STORAGE_MANAGER_H

#ifdef __cplusplus
extern "C" {
#endif

struct AStorageManager;
typedef struct AStorageManager AStorageManager;


/**
 * Obtains a new instance of AStorageManager.
 */
AStorageManager* AStorageManager_new();

/**
 * Release AStorageManager instance.
 */
void AStorageManager_delete(AStorageManager* mgr);

/**
 * Callback to call when requested OBB is complete.
 */
void AStorageManager_setObbCallback(AStorageManager* mgr, void* cb);

/**
 * Attempts to mount an OBB file.
 */
void AStorageManager_mountObb(AStorageManager* mgr, const char* filename, const char* key);

/**
 * Attempts to unmount an OBB file.
 */
void AStorageManager_unmountObb(AStorageManager* mgr, const char* filename, const int force);

/**
 * Check whether an OBB is mounted.
 */
int AStorageManager_isObbMounted(AStorageManager* mgr, const char* filename);

/**
 * Get the mounted path for an OBB.
 */
const char* AStorageManager_getMountedObbPath(AStorageManager* mgr, const char* filename);


#ifdef __cplusplus
};
#endif

#endif      // ANDROID_PACKAGE_MANAGER_H