diff options
Diffstat (limited to 'tools/aapt2/Files.h')
| -rw-r--r-- | tools/aapt2/Files.h | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/tools/aapt2/Files.h b/tools/aapt2/Files.h new file mode 100644 index 0000000..37e6f8c --- /dev/null +++ b/tools/aapt2/Files.h @@ -0,0 +1,123 @@ +/* + * Copyright (C) 2015 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. + */ + +#ifndef AAPT_FILES_H +#define AAPT_FILES_H + +#include "Logger.h" +#include "Source.h" +#include "StringPiece.h" + +#include <cassert> +#include <string> +#include <vector> + +namespace aapt { + +#ifdef _WIN32 +constexpr const char sDirSep = '\\'; +#else +constexpr const char sDirSep = '/'; +#endif + +enum class FileType { + kUnknown = 0, + kNonexistant, + kRegular, + kDirectory, + kCharDev, + kBlockDev, + kFifo, + kSymlink, + kSocket, +}; + +FileType getFileType(const StringPiece& path); + +/* + * Lists files under the directory `root`. Files are listed + * with just their leaf (filename) names. + */ +std::vector<std::string> listFiles(const StringPiece& root); + +/* + * Appends a path to `base`, separated by the directory separator. + */ +void appendPath(std::string* base, const StringPiece& part); + +/* + * Appends a series of paths to `base`, separated by the + * system directory separator. + */ +template <typename... Ts > +void appendPath(std::string* base, const StringPiece& part, const Ts&... parts); + +/* + * Makes all the directories in `path`. The last element in the path + * is interpreted as a directory. + */ +bool mkdirs(const StringPiece& path); + +/* + * Filter that determines which resource files/directories are + * processed by AAPT. Takes a pattern string supplied by the user. + * Pattern format is specified in the + * FileFilter::setPattern(const std::string&) method. + */ +class FileFilter { +public: + /* + * Patterns syntax: + * - Delimiter is : + * - Entry can start with the flag ! to avoid printing a warning + * about the file being ignored. + * - Entry can have the flag "<dir>" to match only directories + * or <file> to match only files. Default is to match both. + * - Entry can be a simplified glob "<prefix>*" or "*<suffix>" + * where prefix/suffix must have at least 1 character (so that + * we don't match a '*' catch-all pattern.) + * - The special filenames "." and ".." are always ignored. + * - Otherwise the full string is matched. + * - match is not case-sensitive. + */ + bool setPattern(const StringPiece& pattern); + + /** + * Applies the filter, returning true for pass, false for fail. + */ + bool operator()(const std::string& filename, FileType type) const; + +private: + std::vector<std::string> mPatternTokens; +}; + +inline void appendPath(std::string* base, const StringPiece& part) { + assert(base); + *base += sDirSep; + base->append(part.data(), part.size()); +} + +template <typename... Ts > +void appendPath(std::string* base, const StringPiece& part, const Ts&... parts) { + assert(base); + *base += sDirSep; + base->append(part.data(), part.size()); + appendPath(base, parts...); +} + +} // namespace aapt + +#endif // AAPT_FILES_H |
