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