AssetDir.h revision 16c4d154dca43c662571129af31b27433b919a32
116c4d154dca43c662571129af31b27433b919a32Adam Lesinski/*
216c4d154dca43c662571129af31b27433b919a32Adam Lesinski * Copyright (C) 2006 The Android Open Source Project
316c4d154dca43c662571129af31b27433b919a32Adam Lesinski *
416c4d154dca43c662571129af31b27433b919a32Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
516c4d154dca43c662571129af31b27433b919a32Adam Lesinski * you may not use this file except in compliance with the License.
616c4d154dca43c662571129af31b27433b919a32Adam Lesinski * You may obtain a copy of the License at
716c4d154dca43c662571129af31b27433b919a32Adam Lesinski *
816c4d154dca43c662571129af31b27433b919a32Adam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
916c4d154dca43c662571129af31b27433b919a32Adam Lesinski *
1016c4d154dca43c662571129af31b27433b919a32Adam Lesinski * Unless required by applicable law or agreed to in writing, software
1116c4d154dca43c662571129af31b27433b919a32Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
1216c4d154dca43c662571129af31b27433b919a32Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1316c4d154dca43c662571129af31b27433b919a32Adam Lesinski * See the License for the specific language governing permissions and
1416c4d154dca43c662571129af31b27433b919a32Adam Lesinski * limitations under the License.
1516c4d154dca43c662571129af31b27433b919a32Adam Lesinski */
1616c4d154dca43c662571129af31b27433b919a32Adam Lesinski
1716c4d154dca43c662571129af31b27433b919a32Adam Lesinski//
1816c4d154dca43c662571129af31b27433b919a32Adam Lesinski// Access a chunk of the asset hierarchy as if it were a single directory.
1916c4d154dca43c662571129af31b27433b919a32Adam Lesinski//
2016c4d154dca43c662571129af31b27433b919a32Adam Lesinski#ifndef __LIBS_ASSETDIR_H
2116c4d154dca43c662571129af31b27433b919a32Adam Lesinski#define __LIBS_ASSETDIR_H
2216c4d154dca43c662571129af31b27433b919a32Adam Lesinski
2316c4d154dca43c662571129af31b27433b919a32Adam Lesinski#include <androidfw/misc.h>
2416c4d154dca43c662571129af31b27433b919a32Adam Lesinski#include <utils/String8.h>
2516c4d154dca43c662571129af31b27433b919a32Adam Lesinski#include <utils/Vector.h>
2616c4d154dca43c662571129af31b27433b919a32Adam Lesinski#include <utils/SortedVector.h>
2716c4d154dca43c662571129af31b27433b919a32Adam Lesinski#include <sys/types.h>
2816c4d154dca43c662571129af31b27433b919a32Adam Lesinski
2916c4d154dca43c662571129af31b27433b919a32Adam Lesinskinamespace android {
3016c4d154dca43c662571129af31b27433b919a32Adam Lesinski
3116c4d154dca43c662571129af31b27433b919a32Adam Lesinski/*
3216c4d154dca43c662571129af31b27433b919a32Adam Lesinski * This provides vector-style access to a directory.  We do this rather
3316c4d154dca43c662571129af31b27433b919a32Adam Lesinski * than modeling opendir/readdir access because it's simpler and the
3416c4d154dca43c662571129af31b27433b919a32Adam Lesinski * nature of the operation requires us to have all data on hand anyway.
3516c4d154dca43c662571129af31b27433b919a32Adam Lesinski *
3616c4d154dca43c662571129af31b27433b919a32Adam Lesinski * The list of files will be sorted in ascending order by ASCII value.
3716c4d154dca43c662571129af31b27433b919a32Adam Lesinski *
3816c4d154dca43c662571129af31b27433b919a32Adam Lesinski * The contents are populated by our friend, the AssetManager.
3916c4d154dca43c662571129af31b27433b919a32Adam Lesinski */
4016c4d154dca43c662571129af31b27433b919a32Adam Lesinskiclass AssetDir {
4116c4d154dca43c662571129af31b27433b919a32Adam Lesinskipublic:
4216c4d154dca43c662571129af31b27433b919a32Adam Lesinski    AssetDir(void)
4316c4d154dca43c662571129af31b27433b919a32Adam Lesinski        : mFileInfo(NULL)
4416c4d154dca43c662571129af31b27433b919a32Adam Lesinski        {}
4516c4d154dca43c662571129af31b27433b919a32Adam Lesinski    virtual ~AssetDir(void) {
4616c4d154dca43c662571129af31b27433b919a32Adam Lesinski        delete mFileInfo;
4716c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
4816c4d154dca43c662571129af31b27433b919a32Adam Lesinski
4916c4d154dca43c662571129af31b27433b919a32Adam Lesinski    /*
5016c4d154dca43c662571129af31b27433b919a32Adam Lesinski     * Vector-style access.
5116c4d154dca43c662571129af31b27433b919a32Adam Lesinski     */
5216c4d154dca43c662571129af31b27433b919a32Adam Lesinski    size_t getFileCount(void) { return mFileInfo->size(); }
5316c4d154dca43c662571129af31b27433b919a32Adam Lesinski    const String8& getFileName(int idx) {
5416c4d154dca43c662571129af31b27433b919a32Adam Lesinski        return mFileInfo->itemAt(idx).getFileName();
5516c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
5616c4d154dca43c662571129af31b27433b919a32Adam Lesinski    const String8& getSourceName(int idx) {
5716c4d154dca43c662571129af31b27433b919a32Adam Lesinski        return mFileInfo->itemAt(idx).getSourceName();
5816c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
5916c4d154dca43c662571129af31b27433b919a32Adam Lesinski
6016c4d154dca43c662571129af31b27433b919a32Adam Lesinski    /*
6116c4d154dca43c662571129af31b27433b919a32Adam Lesinski     * Get the type of a file (usually regular or directory).
6216c4d154dca43c662571129af31b27433b919a32Adam Lesinski     */
6316c4d154dca43c662571129af31b27433b919a32Adam Lesinski    FileType getFileType(int idx) {
6416c4d154dca43c662571129af31b27433b919a32Adam Lesinski        return mFileInfo->itemAt(idx).getFileType();
6516c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
6616c4d154dca43c662571129af31b27433b919a32Adam Lesinski
6716c4d154dca43c662571129af31b27433b919a32Adam Lesinskiprivate:
6816c4d154dca43c662571129af31b27433b919a32Adam Lesinski    /* these operations are not implemented */
6916c4d154dca43c662571129af31b27433b919a32Adam Lesinski    AssetDir(const AssetDir& src);
7016c4d154dca43c662571129af31b27433b919a32Adam Lesinski    const AssetDir& operator=(const AssetDir& src);
7116c4d154dca43c662571129af31b27433b919a32Adam Lesinski
7216c4d154dca43c662571129af31b27433b919a32Adam Lesinski    friend class AssetManager;
7316c4d154dca43c662571129af31b27433b919a32Adam Lesinski
7416c4d154dca43c662571129af31b27433b919a32Adam Lesinski    /*
7516c4d154dca43c662571129af31b27433b919a32Adam Lesinski     * This holds information about files in the asset hierarchy.
7616c4d154dca43c662571129af31b27433b919a32Adam Lesinski     */
7716c4d154dca43c662571129af31b27433b919a32Adam Lesinski    class FileInfo {
7816c4d154dca43c662571129af31b27433b919a32Adam Lesinski    public:
7916c4d154dca43c662571129af31b27433b919a32Adam Lesinski        FileInfo(void) {}
8016c4d154dca43c662571129af31b27433b919a32Adam Lesinski        FileInfo(const String8& path)      // useful for e.g. svect.indexOf
8116c4d154dca43c662571129af31b27433b919a32Adam Lesinski            : mFileName(path), mFileType(kFileTypeUnknown)
8216c4d154dca43c662571129af31b27433b919a32Adam Lesinski            {}
8316c4d154dca43c662571129af31b27433b919a32Adam Lesinski        ~FileInfo(void) {}
8416c4d154dca43c662571129af31b27433b919a32Adam Lesinski        FileInfo(const FileInfo& src) {
8516c4d154dca43c662571129af31b27433b919a32Adam Lesinski            copyMembers(src);
8616c4d154dca43c662571129af31b27433b919a32Adam Lesinski        }
8716c4d154dca43c662571129af31b27433b919a32Adam Lesinski        const FileInfo& operator= (const FileInfo& src) {
8816c4d154dca43c662571129af31b27433b919a32Adam Lesinski            if (this != &src)
8916c4d154dca43c662571129af31b27433b919a32Adam Lesinski                copyMembers(src);
9016c4d154dca43c662571129af31b27433b919a32Adam Lesinski            return *this;
9116c4d154dca43c662571129af31b27433b919a32Adam Lesinski        }
9216c4d154dca43c662571129af31b27433b919a32Adam Lesinski
9316c4d154dca43c662571129af31b27433b919a32Adam Lesinski        void copyMembers(const FileInfo& src) {
9416c4d154dca43c662571129af31b27433b919a32Adam Lesinski            mFileName = src.mFileName;
9516c4d154dca43c662571129af31b27433b919a32Adam Lesinski            mFileType = src.mFileType;
9616c4d154dca43c662571129af31b27433b919a32Adam Lesinski            mSourceName = src.mSourceName;
9716c4d154dca43c662571129af31b27433b919a32Adam Lesinski        }
9816c4d154dca43c662571129af31b27433b919a32Adam Lesinski
9916c4d154dca43c662571129af31b27433b919a32Adam Lesinski        /* need this for SortedVector; must compare only on file name */
10016c4d154dca43c662571129af31b27433b919a32Adam Lesinski        bool operator< (const FileInfo& rhs) const {
10116c4d154dca43c662571129af31b27433b919a32Adam Lesinski            return mFileName < rhs.mFileName;
10216c4d154dca43c662571129af31b27433b919a32Adam Lesinski        }
10316c4d154dca43c662571129af31b27433b919a32Adam Lesinski
10416c4d154dca43c662571129af31b27433b919a32Adam Lesinski        /* used by AssetManager */
10516c4d154dca43c662571129af31b27433b919a32Adam Lesinski        bool operator== (const FileInfo& rhs) const {
10616c4d154dca43c662571129af31b27433b919a32Adam Lesinski            return mFileName == rhs.mFileName;
10716c4d154dca43c662571129af31b27433b919a32Adam Lesinski        }
10816c4d154dca43c662571129af31b27433b919a32Adam Lesinski
10916c4d154dca43c662571129af31b27433b919a32Adam Lesinski        void set(const String8& path, FileType type) {
11016c4d154dca43c662571129af31b27433b919a32Adam Lesinski            mFileName = path;
11116c4d154dca43c662571129af31b27433b919a32Adam Lesinski            mFileType = type;
11216c4d154dca43c662571129af31b27433b919a32Adam Lesinski        }
11316c4d154dca43c662571129af31b27433b919a32Adam Lesinski
11416c4d154dca43c662571129af31b27433b919a32Adam Lesinski        const String8& getFileName(void) const { return mFileName; }
11516c4d154dca43c662571129af31b27433b919a32Adam Lesinski        void setFileName(const String8& path) { mFileName = path; }
11616c4d154dca43c662571129af31b27433b919a32Adam Lesinski
11716c4d154dca43c662571129af31b27433b919a32Adam Lesinski        FileType getFileType(void) const { return mFileType; }
11816c4d154dca43c662571129af31b27433b919a32Adam Lesinski        void setFileType(FileType type) { mFileType = type; }
11916c4d154dca43c662571129af31b27433b919a32Adam Lesinski
12016c4d154dca43c662571129af31b27433b919a32Adam Lesinski        const String8& getSourceName(void) const { return mSourceName; }
12116c4d154dca43c662571129af31b27433b919a32Adam Lesinski        void setSourceName(const String8& path) { mSourceName = path; }
12216c4d154dca43c662571129af31b27433b919a32Adam Lesinski
12316c4d154dca43c662571129af31b27433b919a32Adam Lesinski        /*
12416c4d154dca43c662571129af31b27433b919a32Adam Lesinski         * Handy utility for finding an entry in a sorted vector of FileInfo.
12516c4d154dca43c662571129af31b27433b919a32Adam Lesinski         * Returns the index of the matching entry, or -1 if none found.
12616c4d154dca43c662571129af31b27433b919a32Adam Lesinski         */
12716c4d154dca43c662571129af31b27433b919a32Adam Lesinski        static int findEntry(const SortedVector<FileInfo>* pVector,
12816c4d154dca43c662571129af31b27433b919a32Adam Lesinski            const String8& fileName);
12916c4d154dca43c662571129af31b27433b919a32Adam Lesinski
13016c4d154dca43c662571129af31b27433b919a32Adam Lesinski    private:
13116c4d154dca43c662571129af31b27433b919a32Adam Lesinski        String8    mFileName;      // filename only
13216c4d154dca43c662571129af31b27433b919a32Adam Lesinski        FileType    mFileType;      // regular, directory, etc
13316c4d154dca43c662571129af31b27433b919a32Adam Lesinski
13416c4d154dca43c662571129af31b27433b919a32Adam Lesinski        String8    mSourceName;    // currently debug-only
13516c4d154dca43c662571129af31b27433b919a32Adam Lesinski    };
13616c4d154dca43c662571129af31b27433b919a32Adam Lesinski
13716c4d154dca43c662571129af31b27433b919a32Adam Lesinski    /* AssetManager uses this to initialize us */
13816c4d154dca43c662571129af31b27433b919a32Adam Lesinski    void setFileList(SortedVector<FileInfo>* list) { mFileInfo = list; }
13916c4d154dca43c662571129af31b27433b919a32Adam Lesinski
14016c4d154dca43c662571129af31b27433b919a32Adam Lesinski    SortedVector<FileInfo>* mFileInfo;
14116c4d154dca43c662571129af31b27433b919a32Adam Lesinski};
14216c4d154dca43c662571129af31b27433b919a32Adam Lesinski
14316c4d154dca43c662571129af31b27433b919a32Adam Lesinski}; // namespace android
14416c4d154dca43c662571129af31b27433b919a32Adam Lesinski
14516c4d154dca43c662571129af31b27433b919a32Adam Lesinski#endif // __LIBS_ASSETDIR_H
146