VolumeBase.h 4.46 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
/*
 * Copyright (C) 2008 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_VOLD_VOLUME_BASE_H
#define ANDROID_VOLD_VOLUME_BASE_H

#include "Utils.h"

22
#include <cutils/multiuser.h>
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
#include <utils/Errors.h>

#include <sys/types.h>
#include <list>
#include <string>

namespace android {
namespace vold {

/*
 * Representation of a mounted volume ready for presentation.
 *
 * Various subclasses handle the different mounting prerequisites, such as
 * encryption details, etc.  Volumes can also be "stacked" above other
 * volumes to help communicate dependencies.  For example, an ASEC volume
 * can be stacked on a vfat volume.
 *
 * Mounted volumes can be asked to manage bind mounts to present themselves
 * to specific users on the device.
 *
 * When an unmount is requested, the volume recursively unmounts any stacked
 * volumes and removes any bind mounts before finally unmounting itself.
 */
class VolumeBase {
public:
    virtual ~VolumeBase();

50 51 52 53 54 55 56 57
    enum class Type {
        kPublic = 0,
        kPrivate,
        kEmulated,
        kAsec,
        kObb,
    };

58
    enum MountFlags {
59 60 61 62 63 64 65 66
        /* Flag that volume is primary external storage */
        kPrimary = 1 << 0,
        /* Flag that volume is visible to normal apps */
        kVisible = 1 << 1,
    };

    enum class State {
        kUnmounted = 0,
67
        kChecking,
68
        kMounted,
69
        kMountedReadOnly,
70
        kFormatting,
71
        kEjecting,
72
        kUnmountable,
73
        kRemoved,
74
        kBadRemoval,
75 76
    };

77
    const std::string& getId() { return mId; }
78
    const std::string& getDiskId() { return mDiskId; }
79
    const std::string& getPartGuid() { return mPartGuid; }
80
    Type getType() { return mType; }
81 82
    int getMountFlags() { return mMountFlags; }
    userid_t getMountUserId() { return mMountUserId; }
83 84
    State getState() { return mState; }
    const std::string& getPath() { return mPath; }
85
    const std::string& getInternalPath() { return mInternalPath; }
86

87
    status_t setDiskId(const std::string& diskId);
88
    status_t setPartGuid(const std::string& partGuid);
89 90
    status_t setMountFlags(int mountFlags);
    status_t setMountUserId(userid_t mountUserId);
91
    status_t setSilent(bool silent);
92

93 94 95 96 97 98 99
    void addVolume(const std::shared_ptr<VolumeBase>& volume);
    void removeVolume(const std::shared_ptr<VolumeBase>& volume);

    std::shared_ptr<VolumeBase> findVolume(const std::string& id);

    status_t create();
    status_t destroy();
100 101
    status_t mount();
    status_t unmount();
102
    status_t format(const std::string& fsType);
103 104

protected:
105
    explicit VolumeBase(Type type);
106

107 108
    virtual status_t doCreate();
    virtual status_t doDestroy();
109 110
    virtual status_t doMount() = 0;
    virtual status_t doUnmount() = 0;
111
    virtual status_t doFormat(const std::string& fsType);
112

113 114
    status_t setId(const std::string& id);
    status_t setPath(const std::string& path);
115
    status_t setInternalPath(const std::string& internalPath);
116

117 118 119
    void notifyEvent(int msg);
    void notifyEvent(int msg, const std::string& value);

120
private:
121 122
    /* ID that uniquely references volume while alive */
    std::string mId;
123 124
    /* ID that uniquely references parent disk while alive */
    std::string mDiskId;
125 126
    /* Partition GUID of this volume */
    std::string mPartGuid;
127
    /* Volume type */
128
    Type mType;
129 130
    /* Flags used when mounting this volume */
    int mMountFlags;
131
    /* User that owns this volume, otherwise -1 */
132
    userid_t mMountUserId;
133 134
    /* Flag indicating object is created */
    bool mCreated;
135
    /* Current state of volume */
136 137 138
    State mState;
    /* Path to mounted volume */
    std::string mPath;
139 140
    /* Path to internal backing storage */
    std::string mInternalPath;
141 142
    /* Flag indicating that volume should emit no events */
    bool mSilent;
143 144

    /* Volumes stacked on top of this volume */
145
    std::list<std::shared_ptr<VolumeBase>> mVolumes;
146

147
    void setState(State state);
148 149 150 151 152 153 154 155

    DISALLOW_COPY_AND_ASSIGN(VolumeBase);
};

}  // namespace vold
}  // namespace android

#endif