|  | /* | 
|  | * 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 <memory> | 
|  | #include <optional> | 
|  | #include <string> | 
|  | #include <unordered_set> | 
|  | #include <vector> | 
|  |  | 
|  | #include "android-base/macros.h" | 
|  | #include "androidfw/IDiagnostics.h" | 
|  | #include "androidfw/Source.h" | 
|  | #include "androidfw/StringPiece.h" | 
|  | #include "utils/FileMap.h" | 
|  |  | 
|  | namespace aapt { | 
|  | namespace file { | 
|  |  | 
|  | #ifdef _WIN32 | 
|  | constexpr const char sDirSep = '\\'; | 
|  | constexpr const char sPathSep = ';'; | 
|  | #else | 
|  | constexpr const char sDirSep = '/'; | 
|  | constexpr const char sPathSep = ':'; | 
|  | #endif | 
|  |  | 
|  | constexpr const char sInvariantDirSep = '/'; | 
|  |  | 
|  | enum class FileType { | 
|  | kUnknown = 0, | 
|  | kNonExistant, | 
|  | kRegular, | 
|  | kDirectory, | 
|  | kCharDev, | 
|  | kBlockDev, | 
|  | kFifo, | 
|  | kSymlink, | 
|  | kSocket, | 
|  | }; | 
|  |  | 
|  | FileType GetFileType(const std::string& path); | 
|  |  | 
|  | // Appends a path to `base`, separated by the directory separator. | 
|  | void AppendPath(std::string* base, android::StringPiece part); | 
|  |  | 
|  | // Concatenates the list of paths and separates each part with the directory separator. | 
|  | std::string BuildPath(std::vector<const android::StringPiece>&& args); | 
|  |  | 
|  | // Makes all the directories in `path`. The last element in the path is interpreted as a directory. | 
|  | bool mkdirs(const std::string& path); | 
|  |  | 
|  | // Returns all but the last part of the path. | 
|  | android::StringPiece GetStem(android::StringPiece path); | 
|  |  | 
|  | // Returns the last part of the path with extension. | 
|  | android::StringPiece GetFilename(android::StringPiece path); | 
|  |  | 
|  | // Returns the extension of the path. This is the entire string after the first '.' of the last part | 
|  | // of the path. | 
|  | android::StringPiece GetExtension(android::StringPiece path); | 
|  |  | 
|  | // Returns whether or not the name of the file or directory is a hidden file name | 
|  | bool IsHidden(android::StringPiece path); | 
|  |  | 
|  | // Converts a package name (com.android.app) to a path: com/android/app | 
|  | std::string PackageToPath(android::StringPiece package); | 
|  |  | 
|  | // Creates a FileMap for the file at path. | 
|  | std::optional<android::FileMap> MmapPath(const std::string& path, std::string* out_error); | 
|  |  | 
|  | // Reads the file at path and appends each line to the outArgList vector. | 
|  | bool AppendArgsFromFile(android::StringPiece path, std::vector<std::string>* out_arglist, | 
|  | std::string* out_error); | 
|  |  | 
|  | // Reads the file at path and appends each line to the outargset set. | 
|  | bool AppendSetArgsFromFile(android::StringPiece path, std::unordered_set<std::string>* out_argset, | 
|  | std::string* out_error); | 
|  |  | 
|  | // 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() method. | 
|  | class FileFilter { | 
|  | public: | 
|  | explicit FileFilter(android::IDiagnostics* diag) : diag_(diag) { | 
|  | } | 
|  |  | 
|  | // 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(android::StringPiece pattern); | 
|  |  | 
|  | // Applies the filter, returning true for pass, false for fail. | 
|  | bool operator()(const std::string& filename, FileType type) const; | 
|  |  | 
|  | private: | 
|  | DISALLOW_COPY_AND_ASSIGN(FileFilter); | 
|  |  | 
|  | android::IDiagnostics* diag_; | 
|  | std::vector<std::string> pattern_tokens_; | 
|  | }; | 
|  |  | 
|  | // Returns a list of files relative to the directory identified by `path`. | 
|  | // An optional FileFilter filters out any files that don't pass. | 
|  | std::optional<std::vector<std::string>> FindFiles(android::StringPiece path, | 
|  | android::IDiagnostics* diag, | 
|  | const FileFilter* filter = nullptr); | 
|  |  | 
|  | }  // namespace file | 
|  | }  // namespace aapt | 
|  |  | 
|  | #endif  // AAPT_FILES_H |