blob: bd89d7d34b977178e79d49a16df94008f2b7d594 [file] [log] [blame]
Adam Lesinski16c4d152014-01-24 13:27:13 -08001/*
2 * Copyright (C) 2006 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17//
18// Access a chunk of the asset hierarchy as if it were a single directory.
19//
20#ifndef __LIBS_ASSETDIR_H
21#define __LIBS_ASSETDIR_H
22
23#include <androidfw/misc.h>
24#include <utils/String8.h>
25#include <utils/Vector.h>
26#include <utils/SortedVector.h>
27#include <sys/types.h>
28
29namespace android {
30
31/*
32 * This provides vector-style access to a directory. We do this rather
33 * than modeling opendir/readdir access because it's simpler and the
34 * nature of the operation requires us to have all data on hand anyway.
35 *
36 * The list of files will be sorted in ascending order by ASCII value.
37 *
38 * The contents are populated by our friend, the AssetManager.
39 */
40class AssetDir {
41public:
42 AssetDir(void)
43 : mFileInfo(NULL)
44 {}
45 virtual ~AssetDir(void) {
46 delete mFileInfo;
47 }
48
49 /*
50 * Vector-style access.
51 */
52 size_t getFileCount(void) { return mFileInfo->size(); }
53 const String8& getFileName(int idx) {
54 return mFileInfo->itemAt(idx).getFileName();
55 }
56 const String8& getSourceName(int idx) {
57 return mFileInfo->itemAt(idx).getSourceName();
58 }
59
60 /*
61 * Get the type of a file (usually regular or directory).
62 */
63 FileType getFileType(int idx) {
64 return mFileInfo->itemAt(idx).getFileType();
65 }
66
67private:
68 /* these operations are not implemented */
69 AssetDir(const AssetDir& src);
70 const AssetDir& operator=(const AssetDir& src);
71
72 friend class AssetManager;
73
74 /*
75 * This holds information about files in the asset hierarchy.
76 */
77 class FileInfo {
78 public:
79 FileInfo(void) {}
80 FileInfo(const String8& path) // useful for e.g. svect.indexOf
81 : mFileName(path), mFileType(kFileTypeUnknown)
82 {}
83 ~FileInfo(void) {}
84 FileInfo(const FileInfo& src) {
85 copyMembers(src);
86 }
87 const FileInfo& operator= (const FileInfo& src) {
88 if (this != &src)
89 copyMembers(src);
90 return *this;
91 }
92
93 void copyMembers(const FileInfo& src) {
94 mFileName = src.mFileName;
95 mFileType = src.mFileType;
96 mSourceName = src.mSourceName;
97 }
98
99 /* need this for SortedVector; must compare only on file name */
100 bool operator< (const FileInfo& rhs) const {
101 return mFileName < rhs.mFileName;
102 }
103
104 /* used by AssetManager */
105 bool operator== (const FileInfo& rhs) const {
106 return mFileName == rhs.mFileName;
107 }
108
109 void set(const String8& path, FileType type) {
110 mFileName = path;
111 mFileType = type;
112 }
113
114 const String8& getFileName(void) const { return mFileName; }
115 void setFileName(const String8& path) { mFileName = path; }
116
117 FileType getFileType(void) const { return mFileType; }
118 void setFileType(FileType type) { mFileType = type; }
119
120 const String8& getSourceName(void) const { return mSourceName; }
121 void setSourceName(const String8& path) { mSourceName = path; }
122
123 /*
124 * Handy utility for finding an entry in a sorted vector of FileInfo.
125 * Returns the index of the matching entry, or -1 if none found.
126 */
127 static int findEntry(const SortedVector<FileInfo>* pVector,
128 const String8& fileName);
129
130 private:
131 String8 mFileName; // filename only
132 FileType mFileType; // regular, directory, etc
133
134 String8 mSourceName; // currently debug-only
135 };
136
137 /* AssetManager uses this to initialize us */
138 void setFileList(SortedVector<FileInfo>* list) { mFileInfo = list; }
139
140 SortedVector<FileInfo>* mFileInfo;
141};
142
143}; // namespace android
144
145#endif // __LIBS_ASSETDIR_H