1f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat/*
2f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * Copyright (C) 2008 The Android Open Source Project
3f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat *
4f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * Licensed under the Apache License, Version 2.0 (the "License");
5f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * you may not use this file except in compliance with the License.
6f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * You may obtain a copy of the License at
7f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat *
8f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat *      http://www.apache.org/licenses/LICENSE-2.0
9f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat *
10f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * Unless required by applicable law or agreed to in writing, software
11f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * distributed under the License is distributed on an "AS IS" BASIS,
12f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * See the License for the specific language governing permissions and
14f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * limitations under the License.
15f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat */
16f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat
17f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#ifndef _VOLUME_H
18f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#define _VOLUME_H
19f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat
20f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include <utils/List.h>
21f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat
22fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehatclass NetlinkEvent;
23a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehatclass VolumeManager;
24fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat
25f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehatclass Volume {
26f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehatprivate:
27f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat    int mState;
28f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat
29f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehatpublic:
30f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat    static const int State_Init       = -1;
31a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    static const int State_NoMedia    = 0;
32f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat    static const int State_Idle       = 1;
33f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat    static const int State_Pending    = 2;
34a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    static const int State_Checking   = 3;
35a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    static const int State_Mounted    = 4;
36a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    static const int State_Unmounting = 5;
37a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    static const int State_Formatting = 6;
38a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    static const int State_Shared     = 7;
39a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    static const int State_SharedMnt  = 8;
40f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat
413bb6020e461e8872e8df0775cba6eb32e06b93ecSan Mehat    static const char *SECDIR;
423bb6020e461e8872e8df0775cba6eb32e06b93ecSan Mehat    static const char *SEC_STGDIR;
433bb6020e461e8872e8df0775cba6eb32e06b93ecSan Mehat    static const char *SEC_STG_SECIMGDIR;
443bb6020e461e8872e8df0775cba6eb32e06b93ecSan Mehat    static const char *SEC_ASECDIR;
453bb6020e461e8872e8df0775cba6eb32e06b93ecSan Mehat    static const char *ASECDIR;
463bb6020e461e8872e8df0775cba6eb32e06b93ecSan Mehat
47fb7c4d5a8a1031cf0e493ff182dcf458e5fe8c77Kenny Root    static const char *LOOPDIR;
48fb7c4d5a8a1031cf0e493ff182dcf458e5fe8c77Kenny Root
49f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehatprotected:
50f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat    char *mLabel;
51f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat    char *mMountpoint;
52a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    VolumeManager *mVm;
53d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat    bool mDebug;
54a4886f1f8ed72e24a302a91a0ab18bc54b6f585eMike Lockwood    int mPartIdx;
550b8b59719357fb80c330442787f7d5b1e332263bKen Sumrall    int mOrigPartIdx;
56507d31b86b38dffe7c60ca5c54b5e631f5a7cab3Joseph Lehrer    bool mRetryMount;
57a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat
58a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    /*
59a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat     * The major/minor tuple of the currently mounted filesystem.
60a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat     */
61a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    dev_t mCurrentlyMountedKdev;
62f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat
63f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehatpublic:
64a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    Volume(VolumeManager *vm, const char *label, const char *mount_point);
65f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat    virtual ~Volume();
66f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat
67a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    int mountVol();
680b8b59719357fb80c330442787f7d5b1e332263bKen Sumrall    int unmountVol(bool force, bool revert);
69a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    int formatVol();
7049e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat
71f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat    const char *getLabel() { return mLabel; }
72f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat    const char *getMountpoint() { return mMountpoint; }
73f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat    int getState() { return mState; }
74f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat
75fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat    virtual int handleBlockEvent(NetlinkEvent *evt);
76a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    virtual dev_t getDiskDevice();
772dfe297ec47559dbe2297a72bea71cf515c03797Mike Lockwood    virtual dev_t getShareDevice();
78a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    virtual void handleVolumeShared();
79a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    virtual void handleVolumeUnshared();
80f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat
81d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat    void setDebug(bool enable);
8229d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall    virtual int getVolInfo(struct volume_info *v) = 0;
83d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat
84f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehatprotected:
85f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat    void setState(int state);
8649e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat
87a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    virtual int getDeviceNodes(dev_t *devs, int max) = 0;
8829d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall    virtual int updateDeviceInfo(char *new_path, int new_major, int new_minor) = 0;
890b8b59719357fb80c330442787f7d5b1e332263bKen Sumrall    virtual void revertDeviceInfo(void) = 0;
9029d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall    virtual int isDecrypted(void) = 0;
9129d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall    virtual int getFlags(void) = 0;
9249e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat
93dd9b8e92aaf330b48ddb40a7380588ef92b53de6San Mehat    int createDeviceNode(const char *path, int major, int minor);
94dd9b8e92aaf330b48ddb40a7380588ef92b53de6San Mehat
9549e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehatprivate:
96a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    int initializeMbr(const char *deviceNode);
97a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    bool isMountpointMounted(const char *path);
983bb6020e461e8872e8df0775cba6eb32e06b93ecSan Mehat    int createBindMounts();
993bb6020e461e8872e8df0775cba6eb32e06b93ecSan Mehat    int doUnmount(const char *path, bool force);
1003bb6020e461e8872e8df0775cba6eb32e06b93ecSan Mehat    int doMoveMount(const char *src, const char *dst, bool force);
101cb4dac8a5243f6673b0590019b5b28a01bd3e343San Mehat    void protectFromAutorunStupidity();
102f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat};
103f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat
104f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehattypedef android::List<Volume *> VolumeCollection;
105f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat
106f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#endif
107