storage_manager.cpp revision 086d084dd9deab4350981da5e48c8bda5e88fb75
1/* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#define LOG_TAG "NStorage" 18 19#include <android/storage_manager.h> 20#include <storage/IMountService.h> 21 22#include <binder/Binder.h> 23#include <binder/IServiceManager.h> 24#include <utils/Log.h> 25#include <utils/RefBase.h> 26#include <utils/String8.h> 27#include <utils/String16.h> 28 29 30using namespace android; 31 32struct ObbActionListener : public BnObbActionListener { 33private: 34 sp<AStorageManager> mStorageManager; 35 36public: 37 ObbActionListener(AStorageManager* mgr) : 38 mStorageManager(mgr) 39 {} 40 41 virtual void onObbResult(const android::String16& filename, const android::String16& state) { 42 LOGD("Got obb result (%s, %s)\n", String8(filename).string(), String8(state).string()); 43 } 44}; 45 46struct AStorageManager : public RefBase { 47protected: 48 void* mObbCallback; 49 sp<ObbActionListener> mObbActionListener; 50 sp<IMountService> mMountService; 51 52public: 53 AStorageManager() : 54 mObbCallback(NULL) 55 { 56 } 57 58 bool initialize() { 59 sp<IServiceManager> sm = defaultServiceManager(); 60 if (sm == NULL) { 61 LOGE("Couldn't get default ServiceManager\n"); 62 return false; 63 } 64 65 mMountService = interface_cast<IMountService>(sm->getService(String16("mount"))); 66 if (mMountService == NULL) { 67 LOGE("Couldn't get connection to MountService\n"); 68 return false; 69 } 70 71 mObbActionListener = new ObbActionListener(this); 72 73 return true; 74 } 75 76 void setObbCallback(void* cb) { 77 mObbCallback = cb; 78 } 79 80 void mountObb(const char* filename, const char* key) { 81 String16 filename16(filename); 82 String16 key16(key); 83 mMountService->mountObb(filename16, key16, mObbActionListener); 84 } 85 86 void unmountObb(const char* filename, const bool force) { 87 String16 filename16(filename); 88 mMountService->unmountObb(filename16, force); 89 } 90 91 int isObbMounted(const char* filename) { 92 String16 filename16(filename); 93 return mMountService->isObbMounted(filename16); 94 } 95 96 const char* getMountedObbPath(const char* filename) { 97 String16 filename16(filename); 98 String16 path16; 99 if (mMountService->getMountedObbPath(filename16, path16)) { 100 return String8(path16).string(); 101 } else { 102 return NULL; 103 } 104 } 105}; 106 107 108AStorageManager* AStorageManager_new() { 109 sp<AStorageManager> mgr = new AStorageManager(); 110 if (mgr == NULL || !mgr->initialize()) { 111 return NULL; 112 } 113 mgr->incStrong((void*)AStorageManager_new); 114 return static_cast<AStorageManager*>(mgr.get()); 115} 116 117void AStorageManager_delete(AStorageManager* mgr) { 118 if (mgr) { 119 mgr->decStrong((void*)AStorageManager_new); 120 } 121} 122 123void AStorageManager_setObbCallback(AStorageManager* mgr, void* cb) { 124 mgr->setObbCallback(cb); 125} 126 127void AStorageManager_mountObb(AStorageManager* mgr, const char* filename, const char* key) { 128 mgr->mountObb(filename, key); 129} 130 131void AStorageManager_unmountObb(AStorageManager* mgr, const char* filename, const int force) { 132 mgr->unmountObb(filename, force != 0); 133} 134 135int AStorageManager_isObbMounted(AStorageManager* mgr, const char* filename) { 136 return mgr->isObbMounted(filename) != 0; 137} 138 139const char* AStorageManager_getMountedObbPath(AStorageManager* mgr, const char* filename) { 140 return mgr->getMountedObbPath(filename); 141} 142