/* * Copyright (C) 2006 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. */ // // Access a chunk of the asset hierarchy as if it were a single directory. // #ifndef __LIBS_ASSETDIR_H #define __LIBS_ASSETDIR_H #include <utils/String8.h> #include <utils/Vector.h> #include <utils/SortedVector.h> #include <utils/misc.h> #include <sys/types.h> namespace android { /* * This provides vector-style access to a directory. We do this rather * than modeling opendir/readdir access because it's simpler and the * nature of the operation requires us to have all data on hand anyway. * * The list of files will be sorted in ascending order by ASCII value. * * The contents are populated by our friend, the AssetManager. */ class AssetDir { public: AssetDir(void) : mFileInfo(NULL) {} virtual ~AssetDir(void) { delete mFileInfo; } /* * Vector-style access. */ size_t getFileCount(void) { return mFileInfo->size(); } const String8& getFileName(int idx) { return mFileInfo->itemAt(idx).getFileName(); } const String8& getSourceName(int idx) { return mFileInfo->itemAt(idx).getSourceName(); } /* * Get the type of a file (usually regular or directory). */ FileType getFileType(int idx) { return mFileInfo->itemAt(idx).getFileType(); } private: /* these operations are not implemented */ AssetDir(const AssetDir& src); const AssetDir& operator=(const AssetDir& src); friend class AssetManager; /* * This holds information about files in the asset hierarchy. */ class FileInfo { public: FileInfo(void) {} FileInfo(const String8& path) // useful for e.g. svect.indexOf : mFileName(path), mFileType(kFileTypeUnknown) {} ~FileInfo(void) {} FileInfo(const FileInfo& src) { copyMembers(src); } const FileInfo& operator= (const FileInfo& src) { if (this != &src) copyMembers(src); return *this; } void copyMembers(const FileInfo& src) { mFileName = src.mFileName; mFileType = src.mFileType; mSourceName = src.mSourceName; } /* need this for SortedVector; must compare only on file name */ bool operator< (const FileInfo& rhs) const { return mFileName < rhs.mFileName; } /* used by AssetManager */ bool operator== (const FileInfo& rhs) const { return mFileName == rhs.mFileName; } void set(const String8& path, FileType type) { mFileName = path; mFileType = type; } const String8& getFileName(void) const { return mFileName; } void setFileName(const String8& path) { mFileName = path; } FileType getFileType(void) const { return mFileType; } void setFileType(FileType type) { mFileType = type; } const String8& getSourceName(void) const { return mSourceName; } void setSourceName(const String8& path) { mSourceName = path; } /* * Handy utility for finding an entry in a sorted vector of FileInfo. * Returns the index of the matching entry, or -1 if none found. */ static int findEntry(const SortedVector<FileInfo>* pVector, const String8& fileName); private: String8 mFileName; // filename only FileType mFileType; // regular, directory, etc String8 mSourceName; // currently debug-only }; /* AssetManager uses this to initialize us */ void setFileList(SortedVector<FileInfo>* list) { mFileInfo = list; } SortedVector<FileInfo>* mFileInfo; }; }; // namespace android #endif // __LIBS_ASSETDIR_H