19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Access a chunk of the asset hierarchy as if it were a single directory. 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef __LIBS_ASSETDIR_H 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define __LIBS_ASSETDIR_H 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/String8.h> 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Vector.h> 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/SortedVector.h> 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/misc.h> 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/types.h> 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This provides vector-style access to a directory. We do this rather 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * than modeling opendir/readdir access because it's simpler and the 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * nature of the operation requires us to have all data on hand anyway. 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The list of files will be sorted in ascending order by ASCII value. 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The contents are populated by our friend, the AssetManager. 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass AssetDir { 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetDir(void) 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : mFileInfo(NULL) 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {} 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual ~AssetDir(void) { 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete mFileInfo; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Vector-style access. 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t getFileCount(void) { return mFileInfo->size(); } 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String8& getFileName(int idx) { 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFileInfo->itemAt(idx).getFileName(); 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String8& getSourceName(int idx) { 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFileInfo->itemAt(idx).getSourceName(); 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get the type of a file (usually regular or directory). 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileType getFileType(int idx) { 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFileInfo->itemAt(idx).getFileType(); 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* these operations are not implemented */ 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetDir(const AssetDir& src); 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const AssetDir& operator=(const AssetDir& src); 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project friend class AssetManager; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This holds information about files in the asset hierarchy. 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class FileInfo { 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileInfo(void) {} 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileInfo(const String8& path) // useful for e.g. svect.indexOf 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : mFileName(path), mFileType(kFileTypeUnknown) 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {} 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~FileInfo(void) {} 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileInfo(const FileInfo& src) { 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project copyMembers(src); 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const FileInfo& operator= (const FileInfo& src) { 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (this != &src) 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project copyMembers(src); 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return *this; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void copyMembers(const FileInfo& src) { 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFileName = src.mFileName; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFileType = src.mFileType; 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSourceName = src.mSourceName; 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* need this for SortedVector; must compare only on file name */ 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool operator< (const FileInfo& rhs) const { 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFileName < rhs.mFileName; 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* used by AssetManager */ 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool operator== (const FileInfo& rhs) const { 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFileName == rhs.mFileName; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void set(const String8& path, FileType type) { 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFileName = path; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFileType = type; 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String8& getFileName(void) const { return mFileName; } 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setFileName(const String8& path) { mFileName = path; } 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileType getFileType(void) const { return mFileType; } 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setFileType(FileType type) { mFileType = type; } 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String8& getSourceName(void) const { return mSourceName; } 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setSourceName(const String8& path) { mSourceName = path; } 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Handy utility for finding an entry in a sorted vector of FileInfo. 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the index of the matching entry, or -1 if none found. 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static int findEntry(const SortedVector<FileInfo>* pVector, 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String8& fileName); 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private: 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 mFileName; // filename only 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileType mFileType; // regular, directory, etc 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 mSourceName; // currently debug-only 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* AssetManager uses this to initialize us */ 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setFileList(SortedVector<FileInfo>* list) { mFileInfo = list; } 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SortedVector<FileInfo>* mFileInfo; 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif // __LIBS_ASSETDIR_H 146