File: Files.h

package info (click to toggle)
android-platform-frameworks-base 1%3A7.0.0%2Br33-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 137,116 kB
  • sloc: java: 704,370; cpp: 206,670; xml: 185,778; python: 2,626; ansic: 486; sh: 291; makefile: 48; sed: 19
file content (144 lines) | stat: -rw-r--r-- 3,837 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/*
 * Copyright (C) 2015 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef AAPT_FILES_H
#define AAPT_FILES_H

#include "Diagnostics.h"
#include "Maybe.h"
#include "Source.h"

#include "util/StringPiece.h"

#include <utils/FileMap.h>
#include <cassert>
#include <memory>
#include <string>
#include <vector>

namespace aapt {
namespace file {

#ifdef _WIN32
constexpr const char sDirSep = '\\';
#else
constexpr const char sDirSep = '/';
#endif

enum class FileType {
    kUnknown = 0,
    kNonexistant,
    kRegular,
    kDirectory,
    kCharDev,
    kBlockDev,
    kFifo,
    kSymlink,
    kSocket,
};

FileType getFileType(const StringPiece& path);

/*
 * Lists files under the directory `root`. Files are listed
 * with just their leaf (filename) names.
 */
std::vector<std::string> listFiles(const StringPiece& root);

/*
 * Appends a path to `base`, separated by the directory separator.
 */
void appendPath(std::string* base, StringPiece part);

/*
 * Makes all the directories in `path`. The last element in the path
 * is interpreted as a directory.
 */
bool mkdirs(const StringPiece& path);

/**
 * Returns all but the last part of the path.
 */
StringPiece getStem(const StringPiece& path);

/**
 * Returns the last part of the path with extension.
 */
StringPiece getFilename(const StringPiece& path);

/**
 * Returns the extension of the path. This is the entire string after
 * the first '.' of the last part of the path.
 */
StringPiece getExtension(const StringPiece& path);

/**
 * Converts a package name (com.android.app) to a path: com/android/app
 */
std::string packageToPath(const StringPiece& package);

/**
 * Creates a FileMap for the file at path.
 */
Maybe<android::FileMap> mmapPath(const StringPiece& path, std::string* outError);

/**
 * Reads the file at path and appends each line to the outArgList vector.
 */
bool appendArgsFromFile(const StringPiece& path, std::vector<std::string>* outArgList,
                        std::string* outError);

/*
 * Filter that determines which resource files/directories are
 * processed by AAPT. Takes a pattern string supplied by the user.
 * Pattern format is specified in the
 * FileFilter::setPattern(const std::string&) method.
 */
class FileFilter {
public:
    FileFilter(IDiagnostics* diag) : mDiag(diag) {
    }

    /*
     * Patterns syntax:
     * - Delimiter is :
     * - Entry can start with the flag ! to avoid printing a warning
     *   about the file being ignored.
     * - Entry can have the flag "<dir>" to match only directories
     *   or <file> to match only files. Default is to match both.
     * - Entry can be a simplified glob "<prefix>*" or "*<suffix>"
     *   where prefix/suffix must have at least 1 character (so that
     *   we don't match a '*' catch-all pattern.)
     * - The special filenames "." and ".." are always ignored.
     * - Otherwise the full string is matched.
     * - match is not case-sensitive.
     */
    bool setPattern(const StringPiece& pattern);

    /**
     * Applies the filter, returning true for pass, false for fail.
     */
    bool operator()(const std::string& filename, FileType type) const;

private:
    IDiagnostics* mDiag;
    std::vector<std::string> mPatternTokens;
};

} // namespace file
} // namespace aapt

#endif // AAPT_FILES_H