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