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