VolumeBase.h revision f1b996df6f8283aac6953b22bd9e2496d8c30c86
1deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey/*
2deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * Copyright (C) 2008 The Android Open Source Project
3deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey *
4deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License");
5deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * you may not use this file except in compliance with the License.
6deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * You may obtain a copy of the License at
7deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey *
8deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey *      http://www.apache.org/licenses/LICENSE-2.0
9deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey *
10deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * Unless required by applicable law or agreed to in writing, software
11deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS,
12deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * See the License for the specific language governing permissions and
14deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * limitations under the License.
15deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey */
16deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey
17deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey#ifndef ANDROID_VOLD_VOLUME_BASE_H
18deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey#define ANDROID_VOLD_VOLUME_BASE_H
19deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey
20deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey#include "Utils.h"
21deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey
2236801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey#include <cutils/multiuser.h>
23deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey#include <utils/Errors.h>
24deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey
25deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey#include <sys/types.h>
26deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey#include <list>
27deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey#include <string>
28deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey
29deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkeynamespace android {
30deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkeynamespace vold {
31deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey
32deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey/*
33deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * Representation of a mounted volume ready for presentation.
34deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey *
35deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * Various subclasses handle the different mounting prerequisites, such as
36deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * encryption details, etc.  Volumes can also be "stacked" above other
37deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * volumes to help communicate dependencies.  For example, an ASEC volume
38deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * can be stacked on a vfat volume.
39deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey *
40deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * Mounted volumes can be asked to manage bind mounts to present themselves
41deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * to specific users on the device.
42deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey *
43deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * When an unmount is requested, the volume recursively unmounts any stacked
44deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * volumes and removes any bind mounts before finally unmounting itself.
45deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey */
46deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkeyclass VolumeBase {
47deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkeypublic:
48deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey    virtual ~VolumeBase();
49deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey
5036801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    enum class Type {
5136801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey        kPublic = 0,
5236801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey        kPrivate,
5336801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey        kEmulated,
5436801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey        kAsec,
5536801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey        kObb,
5636801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    };
5736801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey
58f1b996df6f8283aac6953b22bd9e2496d8c30c86Jeff Sharkey    enum MountFlags {
5936801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey        /* Flag that volume is primary external storage */
6036801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey        kPrimary = 1 << 0,
6136801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey        /* Flag that volume is visible to normal apps */
6236801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey        kVisible = 1 << 1,
6336801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    };
6436801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey
6536801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    enum class State {
6636801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey        kUnmounted = 0,
67f1b996df6f8283aac6953b22bd9e2496d8c30c86Jeff Sharkey        kChecking,
6836801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey        kMounted,
69f1b996df6f8283aac6953b22bd9e2496d8c30c86Jeff Sharkey        kMountedReadOnly,
7036801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey        kFormatting,
71f1b996df6f8283aac6953b22bd9e2496d8c30c86Jeff Sharkey        kEjecting,
720fd9535474baf9224bc75ad6e9a63dfbfac3aaf7Jeff Sharkey        kUnmountable,
733161fb3702830b586b2e36fa9ca4519f59f951b4Jeff Sharkey        kRemoved,
74f1b996df6f8283aac6953b22bd9e2496d8c30c86Jeff Sharkey        kBadRemoval,
7536801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    };
7636801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey
77deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey    const std::string& getId() { return mId; }
78f1b996df6f8283aac6953b22bd9e2496d8c30c86Jeff Sharkey    const std::string& getDiskId() { return mDiskId; }
7936801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    Type getType() { return mType; }
80f1b996df6f8283aac6953b22bd9e2496d8c30c86Jeff Sharkey    int getMountFlags() { return mMountFlags; }
81f1b996df6f8283aac6953b22bd9e2496d8c30c86Jeff Sharkey    userid_t getMountUserId() { return mMountUserId; }
8236801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    State getState() { return mState; }
8336801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    const std::string& getPath() { return mPath; }
8436801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey
85f1b996df6f8283aac6953b22bd9e2496d8c30c86Jeff Sharkey    status_t setDiskId(const std::string& diskId);
86f1b996df6f8283aac6953b22bd9e2496d8c30c86Jeff Sharkey    status_t setMountFlags(int mountFlags);
87f1b996df6f8283aac6953b22bd9e2496d8c30c86Jeff Sharkey    status_t setMountUserId(userid_t mountUserId);
88ce6a913aeac7db94a41362c63bab74092767bb3eJeff Sharkey    status_t setSilent(bool silent);
89deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey
9036801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    void addVolume(const std::shared_ptr<VolumeBase>& volume);
9136801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    void removeVolume(const std::shared_ptr<VolumeBase>& volume);
9236801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey
9336801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    std::shared_ptr<VolumeBase> findVolume(const std::string& id);
9436801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey
9536801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    status_t create();
9636801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    status_t destroy();
97deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey    status_t mount();
98deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey    status_t unmount();
99deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey    status_t format();
100deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey
101deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkeyprotected:
10236801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    explicit VolumeBase(Type type);
103deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey
1049c48498f4529f623650c56d03e63324c8d813032Jeff Sharkey    virtual status_t doCreate();
1059c48498f4529f623650c56d03e63324c8d813032Jeff Sharkey    virtual status_t doDestroy();
106deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey    virtual status_t doMount() = 0;
107deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey    virtual status_t doUnmount() = 0;
108deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey    virtual status_t doFormat();
109deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey
11036801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    status_t setId(const std::string& id);
11136801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    status_t setPath(const std::string& path);
11236801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey
113ce6a913aeac7db94a41362c63bab74092767bb3eJeff Sharkey    void notifyEvent(int msg);
114ce6a913aeac7db94a41362c63bab74092767bb3eJeff Sharkey    void notifyEvent(int msg, const std::string& value);
115ce6a913aeac7db94a41362c63bab74092767bb3eJeff Sharkey
116deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkeyprivate:
11736801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    /* ID that uniquely references volume while alive */
11836801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    std::string mId;
119f1b996df6f8283aac6953b22bd9e2496d8c30c86Jeff Sharkey    /* ID that uniquely references parent disk while alive */
120f1b996df6f8283aac6953b22bd9e2496d8c30c86Jeff Sharkey    std::string mDiskId;
121deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey    /* Volume type */
12236801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    Type mType;
123f1b996df6f8283aac6953b22bd9e2496d8c30c86Jeff Sharkey    /* Flags used when mounting this volume */
124f1b996df6f8283aac6953b22bd9e2496d8c30c86Jeff Sharkey    int mMountFlags;
12536801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    /* User that owns this volume, otherwise -1 */
126f1b996df6f8283aac6953b22bd9e2496d8c30c86Jeff Sharkey    userid_t mMountUserId;
12736801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    /* Flag indicating object is created */
12836801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    bool mCreated;
129deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey    /* Current state of volume */
13036801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    State mState;
13136801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    /* Path to mounted volume */
13236801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    std::string mPath;
133ce6a913aeac7db94a41362c63bab74092767bb3eJeff Sharkey    /* Flag indicating that volume should emit no events */
134ce6a913aeac7db94a41362c63bab74092767bb3eJeff Sharkey    bool mSilent;
135deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey
136deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey    /* Volumes stacked on top of this volume */
13736801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    std::list<std::shared_ptr<VolumeBase>> mVolumes;
138deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey
13936801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    void setState(State state);
140deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey
141deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey    DISALLOW_COPY_AND_ASSIGN(VolumeBase);
142deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey};
143deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey
144deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey}  // namespace vold
145deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey}  // namespace android
146deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey
147deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey#endif
148