xref: /aosp_15_r20/system/libvintf/include/vintf/FileSystem.h (revision 70a7ec852fcefd15a4fb57f8f183a8b1c3aacb08)
1*70a7ec85SAndroid Build Coastguard Worker /*
2*70a7ec85SAndroid Build Coastguard Worker  * Copyright (C) 2018 The Android Open Source Project
3*70a7ec85SAndroid Build Coastguard Worker  *
4*70a7ec85SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*70a7ec85SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*70a7ec85SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*70a7ec85SAndroid Build Coastguard Worker  *
8*70a7ec85SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*70a7ec85SAndroid Build Coastguard Worker  *
10*70a7ec85SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*70a7ec85SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*70a7ec85SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*70a7ec85SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*70a7ec85SAndroid Build Coastguard Worker  * limitations under the License.
15*70a7ec85SAndroid Build Coastguard Worker  */
16*70a7ec85SAndroid Build Coastguard Worker 
17*70a7ec85SAndroid Build Coastguard Worker #ifndef ANDROID_VINTF_FILE_SYSTEM_H
18*70a7ec85SAndroid Build Coastguard Worker #define ANDROID_VINTF_FILE_SYSTEM_H
19*70a7ec85SAndroid Build Coastguard Worker 
20*70a7ec85SAndroid Build Coastguard Worker #include <map>
21*70a7ec85SAndroid Build Coastguard Worker #include <memory>
22*70a7ec85SAndroid Build Coastguard Worker #include <mutex>
23*70a7ec85SAndroid Build Coastguard Worker #include <string>
24*70a7ec85SAndroid Build Coastguard Worker #include <vector>
25*70a7ec85SAndroid Build Coastguard Worker 
26*70a7ec85SAndroid Build Coastguard Worker #include <sys/stat.h>  // for timespec
27*70a7ec85SAndroid Build Coastguard Worker 
28*70a7ec85SAndroid Build Coastguard Worker #include <utils/Errors.h>
29*70a7ec85SAndroid Build Coastguard Worker 
30*70a7ec85SAndroid Build Coastguard Worker namespace android {
31*70a7ec85SAndroid Build Coastguard Worker namespace vintf {
32*70a7ec85SAndroid Build Coastguard Worker 
33*70a7ec85SAndroid Build Coastguard Worker // Queries the file system in the correct way. Files can come from
34*70a7ec85SAndroid Build Coastguard Worker // an actual file system, a sub-directory, or from ADB, depending on the
35*70a7ec85SAndroid Build Coastguard Worker // implementation.
36*70a7ec85SAndroid Build Coastguard Worker //
37*70a7ec85SAndroid Build Coastguard Worker // This class can be used to create a mock for overriding.
38*70a7ec85SAndroid Build Coastguard Worker class FileSystem {
39*70a7ec85SAndroid Build Coastguard Worker    public:
~FileSystem()40*70a7ec85SAndroid Build Coastguard Worker     virtual ~FileSystem() {}
41*70a7ec85SAndroid Build Coastguard Worker     // Return NAME_NOT_FOUND if file is not found,
42*70a7ec85SAndroid Build Coastguard Worker     //        OK if file is retrieved and written to "fetched".
43*70a7ec85SAndroid Build Coastguard Worker     virtual status_t fetch(const std::string& path, std::string* fetched,
44*70a7ec85SAndroid Build Coastguard Worker                            std::string* error) const = 0;
45*70a7ec85SAndroid Build Coastguard Worker     // Return NAME_NOT_FOUND if directory is not found,
46*70a7ec85SAndroid Build Coastguard Worker     //        OK if file names are retrieved and written to out.
47*70a7ec85SAndroid Build Coastguard Worker     virtual status_t listFiles(const std::string& path, std::vector<std::string>* out,
48*70a7ec85SAndroid Build Coastguard Worker                                std::string* error) const = 0;
49*70a7ec85SAndroid Build Coastguard Worker     // Return NAME_NOT_FOUND if file is not found,
50*70a7ec85SAndroid Build Coastguard Worker     //        OK if "mtime" is set with modified time of the file.
51*70a7ec85SAndroid Build Coastguard Worker     virtual status_t modifiedTime(const std::string& path, timespec* mtime,
52*70a7ec85SAndroid Build Coastguard Worker                                   std::string* error) const = 0;
53*70a7ec85SAndroid Build Coastguard Worker };
54*70a7ec85SAndroid Build Coastguard Worker 
55*70a7ec85SAndroid Build Coastguard Worker // Interface to a writable filesystem.
56*70a7ec85SAndroid Build Coastguard Worker class WritableFileSystem : public FileSystem {
57*70a7ec85SAndroid Build Coastguard Worker    public:
58*70a7ec85SAndroid Build Coastguard Worker     // Return OK if successful. On error, return -errno, or UNKNOWN_ERROR if unknown.
59*70a7ec85SAndroid Build Coastguard Worker     virtual status_t write(const std::string& path, const std::string& content,
60*70a7ec85SAndroid Build Coastguard Worker                            std::string* error) const = 0;
61*70a7ec85SAndroid Build Coastguard Worker     // Return OK if successful. On error, return -errno, or UNKNOWN_ERROR if unknown.
62*70a7ec85SAndroid Build Coastguard Worker     virtual status_t deleteFile(const std::string& path, std::string* error) const = 0;
63*70a7ec85SAndroid Build Coastguard Worker };
64*70a7ec85SAndroid Build Coastguard Worker 
65*70a7ec85SAndroid Build Coastguard Worker namespace details {
66*70a7ec85SAndroid Build Coastguard Worker 
67*70a7ec85SAndroid Build Coastguard Worker // Class that actually queries the file system.
68*70a7ec85SAndroid Build Coastguard Worker class FileSystemImpl : public FileSystem {
69*70a7ec85SAndroid Build Coastguard Worker    public:
70*70a7ec85SAndroid Build Coastguard Worker     status_t fetch(const std::string&, std::string*, std::string*) const override;
71*70a7ec85SAndroid Build Coastguard Worker     status_t listFiles(const std::string&, std::vector<std::string>*, std::string*) const override;
72*70a7ec85SAndroid Build Coastguard Worker     status_t modifiedTime(const std::string& path, timespec* mtime, std::string* error) const;
73*70a7ec85SAndroid Build Coastguard Worker };
74*70a7ec85SAndroid Build Coastguard Worker 
75*70a7ec85SAndroid Build Coastguard Worker // Class that does nothing.
76*70a7ec85SAndroid Build Coastguard Worker class FileSystemNoOp : public FileSystem {
77*70a7ec85SAndroid Build Coastguard Worker    public:
78*70a7ec85SAndroid Build Coastguard Worker     status_t fetch(const std::string&, std::string*, std::string*) const override;
79*70a7ec85SAndroid Build Coastguard Worker     status_t listFiles(const std::string&, std::vector<std::string>*, std::string*) const override;
80*70a7ec85SAndroid Build Coastguard Worker     status_t modifiedTime(const std::string& path, timespec* mtime,
81*70a7ec85SAndroid Build Coastguard Worker                           std::string* error) const override;
82*70a7ec85SAndroid Build Coastguard Worker };
83*70a7ec85SAndroid Build Coastguard Worker 
84*70a7ec85SAndroid Build Coastguard Worker // The root is mounted to a given path.
85*70a7ec85SAndroid Build Coastguard Worker class FileSystemUnderPath : public FileSystem {
86*70a7ec85SAndroid Build Coastguard Worker    public:
87*70a7ec85SAndroid Build Coastguard Worker     FileSystemUnderPath(const std::string& rootdir);
88*70a7ec85SAndroid Build Coastguard Worker     status_t fetch(const std::string& path, std::string* fetched,
89*70a7ec85SAndroid Build Coastguard Worker                    std::string* error) const override;
90*70a7ec85SAndroid Build Coastguard Worker     status_t listFiles(const std::string& path, std::vector<std::string>* out,
91*70a7ec85SAndroid Build Coastguard Worker                        std::string* error) const override;
92*70a7ec85SAndroid Build Coastguard Worker     status_t modifiedTime(const std::string& path, timespec* mtime,
93*70a7ec85SAndroid Build Coastguard Worker                           std::string* error) const override;
94*70a7ec85SAndroid Build Coastguard Worker 
95*70a7ec85SAndroid Build Coastguard Worker    protected:
96*70a7ec85SAndroid Build Coastguard Worker     const std::string& getRootDir() const;
97*70a7ec85SAndroid Build Coastguard Worker 
98*70a7ec85SAndroid Build Coastguard Worker    private:
99*70a7ec85SAndroid Build Coastguard Worker     std::string mRootDir;
100*70a7ec85SAndroid Build Coastguard Worker     FileSystemImpl mImpl;
101*70a7ec85SAndroid Build Coastguard Worker };
102*70a7ec85SAndroid Build Coastguard Worker 
103*70a7ec85SAndroid Build Coastguard Worker // A FileSystem object that can redirect access for one path
104*70a7ec85SAndroid Build Coastguard Worker // FileSystem is read via the internal impl.
105*70a7ec85SAndroid Build Coastguard Worker class PathReplacingFileSystem : public FileSystem {
106*70a7ec85SAndroid Build Coastguard Worker    public:
107*70a7ec85SAndroid Build Coastguard Worker     // Use |impl| for any actual reads. Owns impl.
108*70a7ec85SAndroid Build Coastguard Worker     PathReplacingFileSystem(std::unique_ptr<FileSystem> impl,
109*70a7ec85SAndroid Build Coastguard Worker                             const std::map<std::string, std::string>& path_replacements);
110*70a7ec85SAndroid Build Coastguard Worker 
111*70a7ec85SAndroid Build Coastguard Worker     status_t fetch(const std::string& path, std::string* fetched,
112*70a7ec85SAndroid Build Coastguard Worker                    std::string* error) const override;
113*70a7ec85SAndroid Build Coastguard Worker     status_t listFiles(const std::string& path, std::vector<std::string>* out,
114*70a7ec85SAndroid Build Coastguard Worker                        std::string* error) const override;
115*70a7ec85SAndroid Build Coastguard Worker     status_t modifiedTime(const std::string& path, timespec* mtime,
116*70a7ec85SAndroid Build Coastguard Worker                           std::string* error) const override;
117*70a7ec85SAndroid Build Coastguard Worker 
118*70a7ec85SAndroid Build Coastguard Worker    private:
119*70a7ec85SAndroid Build Coastguard Worker     std::string path_replace(std::string_view path) const;
120*70a7ec85SAndroid Build Coastguard Worker 
121*70a7ec85SAndroid Build Coastguard Worker     std::unique_ptr<FileSystem> impl_;
122*70a7ec85SAndroid Build Coastguard Worker     std::map<std::string, std::string> path_replacements_;
123*70a7ec85SAndroid Build Coastguard Worker };
124*70a7ec85SAndroid Build Coastguard Worker }  // namespace details
125*70a7ec85SAndroid Build Coastguard Worker }  // namespace vintf
126*70a7ec85SAndroid Build Coastguard Worker }  // namespace android
127*70a7ec85SAndroid Build Coastguard Worker 
128*70a7ec85SAndroid Build Coastguard Worker #endif
129