VolumeManager.h revision cbacf78eff70bd43bb899e164ec2ab409bc0904c
18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (C) 2008 The Android Open Source Project 38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Licensed under the Apache License, Version 2.0 (the "License"); 58d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * you may not use this file except in compliance with the License. 68d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * You may obtain a copy of the License at 78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * http://www.apache.org/licenses/LICENSE-2.0 98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Unless required by applicable law or agreed to in writing, software 118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * distributed under the License is distributed on an "AS IS" BASIS, 128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * See the License for the specific language governing permissions and 14c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * limitations under the License. 15c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt */ 168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef _VOLUMEMANAGER_H 188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define _VOLUMEMANAGER_H 198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <pthread.h> 218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <utils/List.h> 238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <sysutils/SocketListener.h> 241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "Volume.h" 268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* The length of an MD5 hash when encoded into ASCII hex characters */ 288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define MD5_ASCII_LENGTH_PLUS_NULL ((MD5_DIGEST_LENGTH*2)+1) 298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidttypedef enum { ASEC, OBB } container_type_t; 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtclass ContainerData { 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpublic: 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ContainerData(char* _id, container_type_t _type) 358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt : id(_id) 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt , type(_type) 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt {} 388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ~ContainerData() { 408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (id != NULL) { 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt free(id); 428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt id = NULL; 438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *id; 478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt container_type_t type; 488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidttypedef android::List<ContainerData*> AsecIdCollection; 518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtclass VolumeManager { 538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtprivate: 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static VolumeManager *sInstance; 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtprivate: 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SocketListener *mBroadcaster; 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt VolumeCollection *mVolumes; 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt AsecIdCollection *mActiveContainers; 618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool mUsbMassStorageEnabled; 628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool mUsbConnected; 638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool mDebug; 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpublic: 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual ~VolumeManager(); 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int start(); 698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int stop(); 708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void handleBlockEvent(NetlinkEvent *evt); 728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void handleSwitchEvent(NetlinkEvent *evt); 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void handleUsbCompositeEvent(NetlinkEvent *evt); 748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int addVolume(Volume *v); 768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int listVolumes(SocketClient *cli); 788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int mountVolume(const char *label); 798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int unmountVolume(const char *label, bool force); 808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int shareVolume(const char *label, const char *method); 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int unshareVolume(const char *label, const char *method); 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int shareAvailable(const char *method, bool *avail); 838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int shareEnabled(const char *path, const char *method, bool *enabled); 848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int simulate(const char *cmd, const char *arg); 858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int formatVolume(const char *label); 868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* ASEC */ 888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int createAsec(const char *id, unsigned numSectors, const char *fstype, 898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *key, int ownerUid); 908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int finalizeAsec(const char *id); 918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int destroyAsec(const char *id, bool force); 928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int mountAsec(const char *id, const char *key, int ownerUid); 938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int unmountAsec(const char *id, bool force); 948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int renameAsec(const char *id1, const char *id2); 958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int getAsecMountPath(const char *id, char *buffer, int maxlen); 968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Loopback images */ 988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int listMountedObbs(SocketClient* cli); 998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int mountObb(const char *fileName, const char *key, int ownerUid); 1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int unmountObb(const char *fileName, bool force); 1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int getObbMountPath(const char *id, char *buffer, int maxlen); 1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Shared between ASEC and Loopback images */ 1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int unmountLoopImage(const char *containerId, const char *loopId, 1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *fileName, const char *mountPoint, bool force); 1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setDebug(bool enable); 1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // XXX: Post froyo this should be moved and cleaned up 1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int cleanupAsec(Volume *v, bool force); 1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setBroadcaster(SocketListener *sl) { mBroadcaster = sl; } 1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SocketListener *getBroadcaster() { return mBroadcaster; } 1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static VolumeManager *Instance(); 116 117 static char *asecHash(const char *id, char *buffer, size_t len); 118 119private: 120 VolumeManager(); 121 void readInitialState(); 122 Volume *lookupVolume(const char *label); 123 bool isMountpointMounted(const char *mp); 124 125 inline bool massStorageAvailable() const { return mUsbMassStorageEnabled && mUsbConnected; } 126 void notifyUmsAvailable(bool available); 127}; 128#endif 129