16f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/* 26f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Copyright (C) 2015 The Android Open Source Project 36f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * 46f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 56f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * you may not use this file except in compliance with the License. 66f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * You may obtain a copy of the License at 76f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * 86f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 96f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * 106f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Unless required by applicable law or agreed to in writing, software 116f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 126f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * See the License for the specific language governing permissions and 146f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * limitations under the License. 156f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 166f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 176f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#ifndef AAPT_FILES_H 186f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#define AAPT_FILES_H 196f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 20ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski#include <memory> 21ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski#include <string> 22ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski#include <vector> 23ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski 24ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski#include "android-base/macros.h" 25d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski#include "androidfw/StringPiece.h" 26ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski#include "utils/FileMap.h" 27ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski 281ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski#include "Diagnostics.h" 291ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski#include "Maybe.h" 306f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include "Source.h" 311ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 326f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskinamespace aapt { 331ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskinamespace file { 346f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 356f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#ifdef _WIN32 366f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiconstexpr const char sDirSep = '\\'; 3744ec315e06560a5fc0e2cc462ef67c2a47e894b1Adam Lesinskiconstexpr const char sPathSep = ';'; 386f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#else 396f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiconstexpr const char sDirSep = '/'; 4044ec315e06560a5fc0e2cc462ef67c2a47e894b1Adam Lesinskiconstexpr const char sPathSep = ':'; 416f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#endif 426f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 436f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskienum class FileType { 44cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski kUnknown = 0, 45cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski kNonexistant, 46cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski kRegular, 47cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski kDirectory, 48cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski kCharDev, 49cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski kBlockDev, 50cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski kFifo, 51cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski kSymlink, 52cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski kSocket, 536f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}; 546f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 555b54ca2d72c410aa34363b0f3bb0fe1666954aeaAdam LesinskiFileType GetFileType(const std::string& path); 566f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 575b54ca2d72c410aa34363b0f3bb0fe1666954aeaAdam Lesinski// Appends a path to `base`, separated by the directory separator. 58d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinskivoid AppendPath(std::string* base, android::StringPiece part); 596f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 605b54ca2d72c410aa34363b0f3bb0fe1666954aeaAdam Lesinski// Makes all the directories in `path`. The last element in the path is interpreted as a directory. 615b54ca2d72c410aa34363b0f3bb0fe1666954aeaAdam Lesinskibool mkdirs(const std::string& path); 626f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 635b54ca2d72c410aa34363b0f3bb0fe1666954aeaAdam Lesinski// Returns all but the last part of the path. 64d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinskiandroid::StringPiece GetStem(const android::StringPiece& path); 651ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 665b54ca2d72c410aa34363b0f3bb0fe1666954aeaAdam Lesinski// Returns the last part of the path with extension. 67d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinskiandroid::StringPiece GetFilename(const android::StringPiece& path); 681ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 695b54ca2d72c410aa34363b0f3bb0fe1666954aeaAdam Lesinski// Returns the extension of the path. This is the entire string after the first '.' of the last part 705b54ca2d72c410aa34363b0f3bb0fe1666954aeaAdam Lesinski// of the path. 71d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinskiandroid::StringPiece GetExtension(const android::StringPiece& path); 721ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 735b54ca2d72c410aa34363b0f3bb0fe1666954aeaAdam Lesinski// Converts a package name (com.android.app) to a path: com/android/app 74d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinskistd::string PackageToPath(const android::StringPiece& package); 751ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 765b54ca2d72c410aa34363b0f3bb0fe1666954aeaAdam Lesinski// Creates a FileMap for the file at path. 775b54ca2d72c410aa34363b0f3bb0fe1666954aeaAdam LesinskiMaybe<android::FileMap> MmapPath(const std::string& path, std::string* out_error); 784d3a987694f6f6b95d8a0f1542618223ce253e6dAdam Lesinski 795b54ca2d72c410aa34363b0f3bb0fe1666954aeaAdam Lesinski// Reads the file at path and appends each line to the outArgList vector. 80d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinskibool AppendArgsFromFile(const android::StringPiece& path, std::vector<std::string>* out_arglist, 81ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::string* out_error); 82c51562cf5acda7849a34c4ae2a88077c068859c0Adam Lesinski 835b54ca2d72c410aa34363b0f3bb0fe1666954aeaAdam Lesinski// Filter that determines which resource files/directories are 845b54ca2d72c410aa34363b0f3bb0fe1666954aeaAdam Lesinski// processed by AAPT. Takes a pattern string supplied by the user. 855b54ca2d72c410aa34363b0f3bb0fe1666954aeaAdam Lesinski// Pattern format is specified in the FileFilter::SetPattern() method. 866f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiclass FileFilter { 87cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski public: 88ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski explicit FileFilter(IDiagnostics* diag) : diag_(diag) {} 89cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 905b54ca2d72c410aa34363b0f3bb0fe1666954aeaAdam Lesinski // Patterns syntax: 915b54ca2d72c410aa34363b0f3bb0fe1666954aeaAdam Lesinski // - Delimiter is : 925b54ca2d72c410aa34363b0f3bb0fe1666954aeaAdam Lesinski // - Entry can start with the flag ! to avoid printing a warning 935b54ca2d72c410aa34363b0f3bb0fe1666954aeaAdam Lesinski // about the file being ignored. 945b54ca2d72c410aa34363b0f3bb0fe1666954aeaAdam Lesinski // - Entry can have the flag "<dir>" to match only directories 955b54ca2d72c410aa34363b0f3bb0fe1666954aeaAdam Lesinski // or <file> to match only files. Default is to match both. 965b54ca2d72c410aa34363b0f3bb0fe1666954aeaAdam Lesinski // - Entry can be a simplified glob "<prefix>*" or "*<suffix>" 975b54ca2d72c410aa34363b0f3bb0fe1666954aeaAdam Lesinski // where prefix/suffix must have at least 1 character (so that 985b54ca2d72c410aa34363b0f3bb0fe1666954aeaAdam Lesinski // we don't match a '*' catch-all pattern.) 995b54ca2d72c410aa34363b0f3bb0fe1666954aeaAdam Lesinski // - The special filenames "." and ".." are always ignored. 1005b54ca2d72c410aa34363b0f3bb0fe1666954aeaAdam Lesinski // - Otherwise the full string is matched. 1015b54ca2d72c410aa34363b0f3bb0fe1666954aeaAdam Lesinski // - match is not case-sensitive. 102d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski bool SetPattern(const android::StringPiece& pattern); 103cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 1045b54ca2d72c410aa34363b0f3bb0fe1666954aeaAdam Lesinski // Applies the filter, returning true for pass, false for fail. 105cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski bool operator()(const std::string& filename, FileType type) const; 106cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 107cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski private: 108ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski DISALLOW_COPY_AND_ASSIGN(FileFilter); 109ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski 110ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski IDiagnostics* diag_; 111ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::vector<std::string> pattern_tokens_; 1126f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}; 1136f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 114b39ad7c9f66877f92ea8583aa8b7b5a8daa6031eAdam Lesinski// Returns a list of files relative to the directory identified by `path`. 115b39ad7c9f66877f92ea8583aa8b7b5a8daa6031eAdam Lesinski// An optional FileFilter filters out any files that don't pass. 116b39ad7c9f66877f92ea8583aa8b7b5a8daa6031eAdam LesinskiMaybe<std::vector<std::string>> FindFiles(const android::StringPiece& path, IDiagnostics* diag, 117b39ad7c9f66877f92ea8583aa8b7b5a8daa6031eAdam Lesinski const FileFilter* filter = nullptr); 118b39ad7c9f66877f92ea8583aa8b7b5a8daa6031eAdam Lesinski 119cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski} // namespace file 120cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski} // namespace aapt 1216f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 122cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski#endif // AAPT_FILES_H 123