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 206f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include "Logger.h" 216f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include "Source.h" 226f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include "StringPiece.h" 236f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 24ca2fc353c2b07e24e297fdc8426c7abd601d908bAdam Lesinski#include <cassert> 256f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include <string> 266f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include <vector> 276f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 286f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskinamespace aapt { 296f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 306f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#ifdef _WIN32 316f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiconstexpr const char sDirSep = '\\'; 326f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#else 336f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiconstexpr const char sDirSep = '/'; 346f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#endif 356f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 366f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskienum class FileType { 376f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski kUnknown = 0, 386f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski kNonexistant, 396f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski kRegular, 406f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski kDirectory, 416f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski kCharDev, 426f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski kBlockDev, 436f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski kFifo, 446f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski kSymlink, 456f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski kSocket, 466f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}; 476f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 486f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam LesinskiFileType getFileType(const StringPiece& path); 496f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 506f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/* 516f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Lists files under the directory `root`. Files are listed 526f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * with just their leaf (filename) names. 536f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 546f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistd::vector<std::string> listFiles(const StringPiece& root); 556f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 566f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/* 576f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Appends a path to `base`, separated by the directory separator. 586f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 596f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskivoid appendPath(std::string* base, const StringPiece& part); 606f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 616f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/* 626f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Appends a series of paths to `base`, separated by the 636f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * system directory separator. 646f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 656f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskitemplate <typename... Ts > 666f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskivoid appendPath(std::string* base, const StringPiece& part, const Ts&... parts); 676f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 686f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/* 696f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Makes all the directories in `path`. The last element in the path 706f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * is interpreted as a directory. 716f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 726f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskibool mkdirs(const StringPiece& path); 736f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 744d3a987694f6f6b95d8a0f1542618223ce253e6dAdam Lesinski/** 754d3a987694f6f6b95d8a0f1542618223ce253e6dAdam Lesinski * Returns all but the last part of the path. 764d3a987694f6f6b95d8a0f1542618223ce253e6dAdam Lesinski */ 774d3a987694f6f6b95d8a0f1542618223ce253e6dAdam Lesinskistd::string getStem(const StringPiece& path); 784d3a987694f6f6b95d8a0f1542618223ce253e6dAdam Lesinski 796f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/* 806f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Filter that determines which resource files/directories are 816f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * processed by AAPT. Takes a pattern string supplied by the user. 826f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Pattern format is specified in the 836f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * FileFilter::setPattern(const std::string&) method. 846f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 856f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiclass FileFilter { 866f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskipublic: 876f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski /* 886f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Patterns syntax: 896f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * - Delimiter is : 906f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * - Entry can start with the flag ! to avoid printing a warning 916f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * about the file being ignored. 926f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * - Entry can have the flag "<dir>" to match only directories 936f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * or <file> to match only files. Default is to match both. 946f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * - Entry can be a simplified glob "<prefix>*" or "*<suffix>" 956f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * where prefix/suffix must have at least 1 character (so that 966f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * we don't match a '*' catch-all pattern.) 976f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * - The special filenames "." and ".." are always ignored. 986f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * - Otherwise the full string is matched. 996f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * - match is not case-sensitive. 1006f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 1016f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski bool setPattern(const StringPiece& pattern); 1026f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1036f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski /** 1046f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Applies the filter, returning true for pass, false for fail. 1056f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 1066f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski bool operator()(const std::string& filename, FileType type) const; 1076f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1086f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiprivate: 1096f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski std::vector<std::string> mPatternTokens; 1106f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}; 1116f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1126f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline void appendPath(std::string* base, const StringPiece& part) { 1136f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski assert(base); 1146f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski *base += sDirSep; 1156f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski base->append(part.data(), part.size()); 1166f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 1176f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1186f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskitemplate <typename... Ts > 1196f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskivoid appendPath(std::string* base, const StringPiece& part, const Ts&... parts) { 1206f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski assert(base); 1216f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski *base += sDirSep; 1226f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski base->append(part.data(), part.size()); 1236f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski appendPath(base, parts...); 1246f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 1256f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1266f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} // namespace aapt 1276f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1286f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#endif // AAPT_FILES_H 129