1f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org/* 2f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org * Copyright 2004 The WebRTC Project Authors. All rights reserved. 3f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org * 4f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org * Use of this source code is governed by a BSD-style license 5f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org * that can be found in the LICENSE file in the root of the source 6f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org * tree. An additional intellectual property rights grant can be found 7f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org * in the file PATENTS. All contributing project authors may 8f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org */ 10f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 11f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org#ifndef WEBRTC_BASE_FILEUTILS_H_ 12f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org#define WEBRTC_BASE_FILEUTILS_H_ 13f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 14f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org#include <string> 15f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 1626a0c4c9568f9e616e9e9fa8652911ddd1f1f70atnakamura@webrtc.org#if !defined(WEBRTC_WIN) 17f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org#include <dirent.h> 18f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org#include <stdio.h> 19f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org#include <sys/stat.h> 20f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org#include <sys/types.h> 21f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org#include <unistd.h> 22f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org#endif 23f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 24f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org#include "webrtc/base/basictypes.h" 25f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org#include "webrtc/base/common.h" 2626a0c4c9568f9e616e9e9fa8652911ddd1f1f70atnakamura@webrtc.org#include "webrtc/base/platform_file.h" 27f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org#include "webrtc/base/scoped_ptr.h" 28f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 29f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.orgnamespace rtc { 30f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 31f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.orgclass FileStream; 32f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.orgclass Pathname; 33f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 34f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org////////////////////////// 35f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org// Directory Iterator // 36f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org////////////////////////// 37f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 38f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org// A DirectoryIterator is created with a given directory. It originally points 39f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org// to the first file in the directory, and can be advanecd with Next(). This 40f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org// allows you to get information about each file. 41f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 42f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.orgclass DirectoryIterator { 43f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org friend class Filesystem; 44f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org public: 45f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // Constructor 46f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org DirectoryIterator(); 47f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // Destructor 48f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org virtual ~DirectoryIterator(); 49f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 50f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // Starts traversing a directory 51f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // dir is the directory to traverse 52f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // returns true if the directory exists and is valid 53f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // The iterator will point to the first entry in the directory 54f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org virtual bool Iterate(const Pathname &path); 55f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 56f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // Advances to the next file 57f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // returns true if there were more files in the directory. 58f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org virtual bool Next(); 59f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 60f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // returns true if the file currently pointed to is a directory 61f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org virtual bool IsDirectory() const; 62f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 63f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // returns the name of the file currently pointed to 64f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org virtual std::string Name() const; 65f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 66f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // returns the size of the file currently pointed to 67f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org virtual size_t FileSize() const; 68f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 69a8738214524c1aafc4dedd2651c55f90786aa56bhenrike@webrtc.org // returns true if the file is older than seconds 70a8738214524c1aafc4dedd2651c55f90786aa56bhenrike@webrtc.org virtual bool OlderThan(int seconds) const; 71f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 72f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // checks whether current file is a special directory file "." or ".." 73f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org bool IsDots() const { 74f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org std::string filename(Name()); 75f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org return (filename.compare(".") == 0) || (filename.compare("..") == 0); 76f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 77f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 78f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org private: 79f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org std::string directory_; 80f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org#if defined(WEBRTC_WIN) 81f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org WIN32_FIND_DATA data_; 82f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org HANDLE handle_; 83f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org#else 84f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org DIR *dir_; 85f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org struct dirent *dirent_; 86f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org struct stat stat_; 87f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org#endif 88f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org}; 89f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 90f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.orgenum FileTimeType { FTT_CREATED, FTT_MODIFIED, FTT_ACCESSED }; 91f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 92f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.orgclass FilesystemInterface { 93f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org public: 94f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org virtual ~FilesystemInterface() {} 95f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 96f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // Returns a DirectoryIterator for a given pathname. 97f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // TODO: Do fancy abstracted stuff 98f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org virtual DirectoryIterator *IterateDirectory() { 99f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org return new DirectoryIterator(); 100f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 101f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 102f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // Opens a file. Returns an open StreamInterface if function succeeds. 103f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // Otherwise, returns NULL. 104f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // TODO: Add an error param to indicate failure reason, similar to 105f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // FileStream::Open 106f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org virtual FileStream *OpenFile(const Pathname &filename, 107f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org const std::string &mode) = 0; 108f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 109f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // Atomically creates an empty file accessible only to the current user if one 110f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // does not already exist at the given path, otherwise fails. This is the only 111f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // secure way to create a file in a shared temp directory (e.g., C:\Temp on 112f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // Windows or /tmp on Linux). 113f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // Note that if it is essential that a file be successfully created then the 114f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // app must generate random names and retry on failure, or else it will be 115f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // vulnerable to a trivial DoS. 116f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org virtual bool CreatePrivateFile(const Pathname &filename) = 0; 117f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 118f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // This will attempt to delete the path located at filename. 119f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // It ASSERTS and returns false if the path points to a folder or a 120f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // non-existent file. 121f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org virtual bool DeleteFile(const Pathname &filename) = 0; 122f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 123f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // This will attempt to delete the empty folder located at 'folder' 124f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // It ASSERTS and returns false if the path points to a file or a non-existent 125f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // folder. It fails normally if the folder is not empty or can otherwise 126f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // not be deleted. 127f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org virtual bool DeleteEmptyFolder(const Pathname &folder) = 0; 128f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 129f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // This will call IterateDirectory, to get a directory iterator, and then 130f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // call DeleteFolderAndContents and DeleteFile on every path contained in this 131f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // folder. If the folder is empty, this returns true. 132f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org virtual bool DeleteFolderContents(const Pathname &folder); 133f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 134f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // This deletes the contents of a folder, recursively, and then deletes 135f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // the folder itself. 136f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org virtual bool DeleteFolderAndContents(const Pathname &folder) { 137f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org return DeleteFolderContents(folder) && DeleteEmptyFolder(folder); 138f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 139f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 140f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // This will delete whatever is located at path, be it a file or a folder. 141f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // If it is a folder, it will delete it recursively by calling 142f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // DeleteFolderAndContents 143f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org bool DeleteFileOrFolder(const Pathname &path) { 144f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org if (IsFolder(path)) 145f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org return DeleteFolderAndContents(path); 146f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org else 147f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org return DeleteFile(path); 148f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 149f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 150f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // Creates a directory. This will call itself recursively to create /foo/bar 151f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // even if /foo does not exist. Returns true if the function succeeds. 152f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org virtual bool CreateFolder(const Pathname &pathname) = 0; 153f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 154f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // This moves a file from old_path to new_path, where "old_path" is a 155f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // plain file. This ASSERTs and returns false if old_path points to a 156f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // directory, and returns true if the function succeeds. 157f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // If the new path is on a different volume than the old path, this function 158f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // will attempt to copy and, if that succeeds, delete the old path. 159f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org virtual bool MoveFolder(const Pathname &old_path, 160f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org const Pathname &new_path) = 0; 161f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 162f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // This moves a directory from old_path to new_path, where "old_path" is a 163f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // directory. This ASSERTs and returns false if old_path points to a plain 164f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // file, and returns true if the function succeeds. 165f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // If the new path is on a different volume, this function will attempt to 166f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // copy and if that succeeds, delete the old path. 167f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org virtual bool MoveFile(const Pathname &old_path, const Pathname &new_path) = 0; 168f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 169f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // This attempts to move whatever is located at old_path to new_path, 170f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // be it a file or folder. 171f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org bool MoveFileOrFolder(const Pathname &old_path, const Pathname &new_path) { 172f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org if (IsFile(old_path)) { 173f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org return MoveFile(old_path, new_path); 174f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } else { 175f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org return MoveFolder(old_path, new_path); 176f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 177f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 178f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 179f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // This copies a file from old_path to new_path. This method ASSERTs and 180f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // returns false if old_path is a folder, and returns true if the copy 181f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // succeeds. 182f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org virtual bool CopyFile(const Pathname &old_path, const Pathname &new_path) = 0; 183f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 184f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // This copies a folder from old_path to new_path. 185f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org bool CopyFolder(const Pathname &old_path, const Pathname &new_path); 186f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 187f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org bool CopyFileOrFolder(const Pathname &old_path, const Pathname &new_path) { 188f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org if (IsFile(old_path)) 189f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org return CopyFile(old_path, new_path); 190f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org else 191f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org return CopyFolder(old_path, new_path); 192f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 193f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 194f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // Returns true if pathname refers to a directory 195f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org virtual bool IsFolder(const Pathname& pathname) = 0; 196f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 197f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // Returns true if pathname refers to a file 198f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org virtual bool IsFile(const Pathname& pathname) = 0; 199f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 200f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // Returns true if pathname refers to no filesystem object, every parent 201f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // directory either exists, or is also absent. 202f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org virtual bool IsAbsent(const Pathname& pathname) = 0; 203f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 204f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // Returns true if pathname represents a temporary location on the system. 205f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org virtual bool IsTemporaryPath(const Pathname& pathname) = 0; 206f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 207f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // A folder appropriate for storing temporary files (Contents are 208f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // automatically deleted when the program exits) 209f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org virtual bool GetTemporaryFolder(Pathname &path, bool create, 210f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org const std::string *append) = 0; 211f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 212f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org virtual std::string TempFilename(const Pathname &dir, 213f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org const std::string &prefix) = 0; 214f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 215f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // Determines the size of the file indicated by path. 216f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org virtual bool GetFileSize(const Pathname& path, size_t* size) = 0; 217f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 218f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // Determines a timestamp associated with the file indicated by path. 219f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org virtual bool GetFileTime(const Pathname& path, FileTimeType which, 220f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org time_t* time) = 0; 221f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 222f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // Returns the path to the running application. 223f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // Note: This is not guaranteed to work on all platforms. Be aware of the 224f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // limitations before using it, and robustly handle failure. 225f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org virtual bool GetAppPathname(Pathname* path) = 0; 226f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 227f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // Get a folder that is unique to the current application, which is suitable 228f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // for sharing data between executions of the app. If the per_user arg is 229f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // true, the folder is also specific to the current user. 230f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org virtual bool GetAppDataFolder(Pathname* path, bool per_user) = 0; 231f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 232f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // Get a temporary folder that is unique to the current user and application. 233f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // TODO: Re-evaluate the goals of this function. We probably just need any 234f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // directory that won't collide with another existing directory, and which 235f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // will be cleaned up when the program exits. 236f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org virtual bool GetAppTempFolder(Pathname* path) = 0; 237f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 238f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // Delete the contents of the folder returned by GetAppTempFolder 239f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org bool CleanAppTempFolder(); 240f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 241f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org virtual bool GetDiskFreeSpace(const Pathname& path, int64 *freebytes) = 0; 242f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 243f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // Returns the absolute path of the current directory. 244f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org virtual Pathname GetCurrentDirectory() = 0; 245f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 246f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // Note: These might go into some shared config section later, but they're 247f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // used by some methods in this interface, so we're leaving them here for now. 248f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org void SetOrganizationName(const std::string& organization) { 249f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org organization_name_ = organization; 250f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 251f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org void GetOrganizationName(std::string* organization) { 252f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org ASSERT(NULL != organization); 253f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org *organization = organization_name_; 254f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 255f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org void SetApplicationName(const std::string& application) { 256f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org application_name_ = application; 257f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 258f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org void GetApplicationName(std::string* application) { 259f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org ASSERT(NULL != application); 260f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org *application = application_name_; 261f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 262f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 263f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org protected: 264f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org std::string organization_name_; 265f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org std::string application_name_; 266f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org}; 267f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 268f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.orgclass Filesystem { 269f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org public: 270f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org static FilesystemInterface *default_filesystem() { 271f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org ASSERT(default_filesystem_ != NULL); 272f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org return default_filesystem_; 273f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 274f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 275f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org static void set_default_filesystem(FilesystemInterface *filesystem) { 276f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org default_filesystem_ = filesystem; 277f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 278f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 279f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org static FilesystemInterface *swap_default_filesystem( 280f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org FilesystemInterface *filesystem) { 281f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org FilesystemInterface *cur = default_filesystem_; 282f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org default_filesystem_ = filesystem; 283f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org return cur; 284f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 285f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 286f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org static DirectoryIterator *IterateDirectory() { 287f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org return EnsureDefaultFilesystem()->IterateDirectory(); 288f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 289f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 290f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org static bool CreateFolder(const Pathname &pathname) { 291f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org return EnsureDefaultFilesystem()->CreateFolder(pathname); 292f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 293f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 294f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org static FileStream *OpenFile(const Pathname &filename, 295f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org const std::string &mode) { 296f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org return EnsureDefaultFilesystem()->OpenFile(filename, mode); 297f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 298f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 299f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org static bool CreatePrivateFile(const Pathname &filename) { 300f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org return EnsureDefaultFilesystem()->CreatePrivateFile(filename); 301f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 302f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 303f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org static bool DeleteFile(const Pathname &filename) { 304f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org return EnsureDefaultFilesystem()->DeleteFile(filename); 305f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 306f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 307f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org static bool DeleteEmptyFolder(const Pathname &folder) { 308f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org return EnsureDefaultFilesystem()->DeleteEmptyFolder(folder); 309f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 310f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 311f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org static bool DeleteFolderContents(const Pathname &folder) { 312f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org return EnsureDefaultFilesystem()->DeleteFolderContents(folder); 313f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 314f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 315f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org static bool DeleteFolderAndContents(const Pathname &folder) { 316f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org return EnsureDefaultFilesystem()->DeleteFolderAndContents(folder); 317f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 318f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 319f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org static bool MoveFolder(const Pathname &old_path, const Pathname &new_path) { 320f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org return EnsureDefaultFilesystem()->MoveFolder(old_path, new_path); 321f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 322f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 323f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org static bool MoveFile(const Pathname &old_path, const Pathname &new_path) { 324f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org return EnsureDefaultFilesystem()->MoveFile(old_path, new_path); 325f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 326f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 327f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org static bool CopyFolder(const Pathname &old_path, const Pathname &new_path) { 328f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org return EnsureDefaultFilesystem()->CopyFolder(old_path, new_path); 329f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 330f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 331f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org static bool CopyFile(const Pathname &old_path, const Pathname &new_path) { 332f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org return EnsureDefaultFilesystem()->CopyFile(old_path, new_path); 333f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 334f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 335f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org static bool IsFolder(const Pathname& pathname) { 336f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org return EnsureDefaultFilesystem()->IsFolder(pathname); 337f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 338f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 339f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org static bool IsFile(const Pathname &pathname) { 340f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org return EnsureDefaultFilesystem()->IsFile(pathname); 341f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 342f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 343f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org static bool IsAbsent(const Pathname &pathname) { 344f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org return EnsureDefaultFilesystem()->IsAbsent(pathname); 345f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 346f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 347f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org static bool IsTemporaryPath(const Pathname& pathname) { 348f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org return EnsureDefaultFilesystem()->IsTemporaryPath(pathname); 349f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 350f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 351f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org static bool GetTemporaryFolder(Pathname &path, bool create, 352f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org const std::string *append) { 353f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org return EnsureDefaultFilesystem()->GetTemporaryFolder(path, create, append); 354f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 355f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 356f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org static std::string TempFilename(const Pathname &dir, 357f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org const std::string &prefix) { 358f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org return EnsureDefaultFilesystem()->TempFilename(dir, prefix); 359f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 360f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 361f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org static bool GetFileSize(const Pathname& path, size_t* size) { 362f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org return EnsureDefaultFilesystem()->GetFileSize(path, size); 363f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 364f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 365f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org static bool GetFileTime(const Pathname& path, FileTimeType which, 366f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org time_t* time) { 367f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org return EnsureDefaultFilesystem()->GetFileTime(path, which, time); 368f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 369f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 370f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org static bool GetAppPathname(Pathname* path) { 371f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org return EnsureDefaultFilesystem()->GetAppPathname(path); 372f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 373f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 374f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org static bool GetAppDataFolder(Pathname* path, bool per_user) { 375f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org return EnsureDefaultFilesystem()->GetAppDataFolder(path, per_user); 376f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 377f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 378f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org static bool GetAppTempFolder(Pathname* path) { 379f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org return EnsureDefaultFilesystem()->GetAppTempFolder(path); 380f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 381f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 382f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org static bool CleanAppTempFolder() { 383f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org return EnsureDefaultFilesystem()->CleanAppTempFolder(); 384f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 385f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 386f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org static bool GetDiskFreeSpace(const Pathname& path, int64 *freebytes) { 387f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org return EnsureDefaultFilesystem()->GetDiskFreeSpace(path, freebytes); 388f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 389f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 390f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // Definition has to be in the .cc file due to returning forward-declared 391f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org // Pathname by value. 392f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org static Pathname GetCurrentDirectory(); 393f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 394f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org static void SetOrganizationName(const std::string& organization) { 395f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org EnsureDefaultFilesystem()->SetOrganizationName(organization); 396f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 397f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 398f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org static void GetOrganizationName(std::string* organization) { 399f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org EnsureDefaultFilesystem()->GetOrganizationName(organization); 400f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 401f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 402f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org static void SetApplicationName(const std::string& application) { 403f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org EnsureDefaultFilesystem()->SetApplicationName(application); 404f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 405f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 406f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org static void GetApplicationName(std::string* application) { 407f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org EnsureDefaultFilesystem()->GetApplicationName(application); 408f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 409f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 410f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org private: 411f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org static FilesystemInterface* default_filesystem_; 412f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 413f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org static FilesystemInterface *EnsureDefaultFilesystem(); 414f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org DISALLOW_IMPLICIT_CONSTRUCTORS(Filesystem); 415f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org}; 416f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 417f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.orgclass FilesystemScope{ 418f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org public: 419f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org explicit FilesystemScope(FilesystemInterface *new_fs) { 420f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org old_fs_ = Filesystem::swap_default_filesystem(new_fs); 421f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 422f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org ~FilesystemScope() { 423f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org Filesystem::set_default_filesystem(old_fs_); 424f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org } 425f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org private: 426f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org FilesystemInterface* old_fs_; 427f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org DISALLOW_IMPLICIT_CONSTRUCTORS(FilesystemScope); 428f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org}; 429f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 430f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org// Generates a unique filename based on the input path. If no path component 431f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org// is specified, it uses the temporary directory. If a filename is provided, 432f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org// up to 100 variations of form basename-N.extension are tried. When 433f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org// create_empty is true, an empty file of this name is created (which 434f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org// decreases the chance of a temporary filename collision with another 435f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org// process). 436f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.orgbool CreateUniqueFile(Pathname& path, bool create_empty); 437f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 438f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org} // namespace rtc 439f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org 440f7795df4261877af9eaf982cccfafc3fc52aeb4ahenrike@webrtc.org#endif // WEBRTC_BASE_FILEUTILS_H_ 441