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 = '\\'; 376f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#else 386f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiconstexpr const char sDirSep = '/'; 396f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#endif 406f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 416f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskienum class FileType { 42cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski kUnknown = 0, 43cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski kNonexistant, 44cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski kRegular, 45cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski kDirectory, 46cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski kCharDev, 47cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski kBlockDev, 48cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski kFifo, 49cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski kSymlink, 50cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski kSocket, 516f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}; 526f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 53d5083f6f6b9bc76bbe64052bcec639eee752a321Adam LesinskiFileType GetFileType(const android::StringPiece& path); 546f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 556f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/* 566f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Appends a path to `base`, separated by the directory separator. 576f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 58d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinskivoid AppendPath(std::string* base, android::StringPiece part); 596f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 606f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/* 616f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Makes all the directories in `path`. The last element in the path 626f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * is interpreted as a directory. 636f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 64d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinskibool mkdirs(const android::StringPiece& path); 656f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 664d3a987694f6f6b95d8a0f1542618223ce253e6dAdam Lesinski/** 674d3a987694f6f6b95d8a0f1542618223ce253e6dAdam Lesinski * Returns all but the last part of the path. 684d3a987694f6f6b95d8a0f1542618223ce253e6dAdam Lesinski */ 69d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinskiandroid::StringPiece GetStem(const android::StringPiece& path); 701ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 711ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski/** 721ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * Returns the last part of the path with extension. 731ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski */ 74d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinskiandroid::StringPiece GetFilename(const android::StringPiece& path); 751ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 761ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski/** 771ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * Returns the extension of the path. This is the entire string after 781ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * the first '.' of the last part of the path. 791ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski */ 80d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinskiandroid::StringPiece GetExtension(const android::StringPiece& path); 811ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 821ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski/** 831ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * Converts a package name (com.android.app) to a path: com/android/app 841ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski */ 85d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinskistd::string PackageToPath(const android::StringPiece& package); 861ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 871ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski/** 881ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * Creates a FileMap for the file at path. 891ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski */ 90d5083f6f6b9bc76bbe64052bcec639eee752a321Adam LesinskiMaybe<android::FileMap> MmapPath(const android::StringPiece& path, std::string* out_error); 914d3a987694f6f6b95d8a0f1542618223ce253e6dAdam Lesinski 92c51562cf5acda7849a34c4ae2a88077c068859c0Adam Lesinski/** 93c51562cf5acda7849a34c4ae2a88077c068859c0Adam Lesinski * Reads the file at path and appends each line to the outArgList vector. 94c51562cf5acda7849a34c4ae2a88077c068859c0Adam Lesinski */ 95d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinskibool AppendArgsFromFile(const android::StringPiece& path, std::vector<std::string>* out_arglist, 96ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::string* out_error); 97c51562cf5acda7849a34c4ae2a88077c068859c0Adam Lesinski 986f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/* 996f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Filter that determines which resource files/directories are 1006f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * processed by AAPT. Takes a pattern string supplied by the user. 101ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski * Pattern format is specified in the FileFilter::SetPattern() method. 1026f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 1036f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiclass FileFilter { 104cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski public: 105ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski explicit FileFilter(IDiagnostics* diag) : diag_(diag) {} 106cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 107cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski /* 108cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski * Patterns syntax: 109cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski * - Delimiter is : 110cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski * - Entry can start with the flag ! to avoid printing a warning 111cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski * about the file being ignored. 112cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski * - Entry can have the flag "<dir>" to match only directories 113cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski * or <file> to match only files. Default is to match both. 114cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski * - Entry can be a simplified glob "<prefix>*" or "*<suffix>" 115cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski * where prefix/suffix must have at least 1 character (so that 116cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski * we don't match a '*' catch-all pattern.) 117cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski * - The special filenames "." and ".." are always ignored. 118cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski * - Otherwise the full string is matched. 119cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski * - match is not case-sensitive. 120cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski */ 121d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski bool SetPattern(const android::StringPiece& pattern); 122cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 123cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski /** 124cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski * Applies the filter, returning true for pass, false for fail. 125cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski */ 126cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski bool operator()(const std::string& filename, FileType type) const; 127cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 128cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski private: 129ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski DISALLOW_COPY_AND_ASSIGN(FileFilter); 130ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski 131ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski IDiagnostics* diag_; 132ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::vector<std::string> pattern_tokens_; 1336f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}; 1346f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 135b39ad7c9f66877f92ea8583aa8b7b5a8daa6031eAdam Lesinski// Returns a list of files relative to the directory identified by `path`. 136b39ad7c9f66877f92ea8583aa8b7b5a8daa6031eAdam Lesinski// An optional FileFilter filters out any files that don't pass. 137b39ad7c9f66877f92ea8583aa8b7b5a8daa6031eAdam LesinskiMaybe<std::vector<std::string>> FindFiles(const android::StringPiece& path, IDiagnostics* diag, 138b39ad7c9f66877f92ea8583aa8b7b5a8daa6031eAdam Lesinski const FileFilter* filter = nullptr); 139b39ad7c9f66877f92ea8583aa8b7b5a8daa6031eAdam Lesinski 140cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski} // namespace file 141cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski} // namespace aapt 1426f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 143cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski#endif // AAPT_FILES_H 144