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