1 /* 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #ifndef WEBRTC_BASE_UNIXFILESYSTEM_H_ 12 #define WEBRTC_BASE_UNIXFILESYSTEM_H_ 13 14 #include <sys/types.h> 15 16 #include "webrtc/base/fileutils.h" 17 18 namespace rtc { 19 20 class UnixFilesystem : public FilesystemInterface { 21 public: 22 UnixFilesystem(); 23 ~UnixFilesystem() override; 24 25 #if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS) 26 // Android does not have a native code API to fetch the app data or temp 27 // folders. That needs to be passed into this class from Java. Similarly, iOS 28 // only supports an Objective-C API for fetching the folder locations, so that 29 // needs to be passed in here from Objective-C. Or at least that used to be 30 // the case; now the ctor will do the work if necessary and possible. 31 // TODO(fischman): add an Android version that uses JNI and drop the 32 // SetApp*Folder() APIs once external users stop using them. 33 static void SetAppDataFolder(const std::string& folder); 34 static void SetAppTempFolder(const std::string& folder); 35 #endif 36 37 // Opens a file. Returns an open StreamInterface if function succeeds. 38 // Otherwise, returns NULL. 39 FileStream* OpenFile(const Pathname& filename, 40 const std::string& mode) override; 41 42 // Atomically creates an empty file accessible only to the current user if one 43 // does not already exist at the given path, otherwise fails. 44 bool CreatePrivateFile(const Pathname& filename) override; 45 46 // This will attempt to delete the file located at filename. 47 // It will fail with VERIY if you pass it a non-existant file, or a directory. 48 bool DeleteFile(const Pathname& filename) override; 49 50 // This will attempt to delete the folder located at 'folder' 51 // It ASSERTs and returns false if you pass it a non-existant folder or a 52 // plain file. 53 bool DeleteEmptyFolder(const Pathname& folder) override; 54 55 // Creates a directory. This will call itself recursively to create /foo/bar 56 // even if /foo does not exist. All created directories are created with the 57 // given mode. 58 // Returns TRUE if function succeeds 59 virtual bool CreateFolder(const Pathname &pathname, mode_t mode); 60 61 // As above, with mode = 0755. 62 bool CreateFolder(const Pathname& pathname) override; 63 64 // This moves a file from old_path to new_path, where "file" can be a plain 65 // file or directory, which will be moved recursively. 66 // Returns true if function succeeds. 67 bool MoveFile(const Pathname& old_path, const Pathname& new_path) override; 68 bool MoveFolder(const Pathname& old_path, const Pathname& new_path) override; 69 70 // This copies a file from old_path to _new_path where "file" can be a plain 71 // file or directory, which will be copied recursively. 72 // Returns true if function succeeds 73 bool CopyFile(const Pathname& old_path, const Pathname& new_path) override; 74 75 // Returns true if a pathname is a directory 76 bool IsFolder(const Pathname& pathname) override; 77 78 // Returns true if pathname represents a temporary location on the system. 79 bool IsTemporaryPath(const Pathname& pathname) override; 80 81 // Returns true of pathname represents an existing file 82 bool IsFile(const Pathname& pathname) override; 83 84 // Returns true if pathname refers to no filesystem object, every parent 85 // directory either exists, or is also absent. 86 bool IsAbsent(const Pathname& pathname) override; 87 88 std::string TempFilename(const Pathname& dir, 89 const std::string& prefix) override; 90 91 // A folder appropriate for storing temporary files (Contents are 92 // automatically deleted when the program exists) 93 bool GetTemporaryFolder(Pathname& path, 94 bool create, 95 const std::string* append) override; 96 97 bool GetFileSize(const Pathname& path, size_t* size) override; 98 bool GetFileTime(const Pathname& path, 99 FileTimeType which, 100 time_t* time) override; 101 102 // Returns the path to the running application. 103 bool GetAppPathname(Pathname* path) override; 104 105 bool GetAppDataFolder(Pathname* path, bool per_user) override; 106 107 // Get a temporary folder that is unique to the current user and application. 108 bool GetAppTempFolder(Pathname* path) override; 109 110 bool GetDiskFreeSpace(const Pathname& path, int64_t* freebytes) override; 111 112 // Returns the absolute path of the current directory. 113 Pathname GetCurrentDirectory() override; 114 115 private: 116 #if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS) 117 static char* provided_app_data_folder_; 118 static char* provided_app_temp_folder_; 119 #else 120 static char* app_temp_path_; 121 #endif 122 123 static char* CopyString(const std::string& str); 124 }; 125 126 } // namespace rtc 127 128 #endif // WEBRTC_BASE_UNIXFILESYSTEM_H_ 129