/* * 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 #include #include 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 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 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); /** * Returns all but the last part of the path. */ std::string getStem(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 "" to match only directories * or to match only files. Default is to match both. * - Entry can be a simplified glob "*" or "*" * 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 mPatternTokens; }; inline void appendPath(std::string* base, const StringPiece& part) { assert(base); *base += sDirSep; base->append(part.data(), part.size()); } template 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