1f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch/* 2f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * libjingle 3f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * Copyright 2004--2006, Google Inc. 4f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 5f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * Redistribution and use in source and binary forms, with or without 6f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * modification, are permitted provided that the following conditions are met: 7f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 8f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 1. Redistributions of source code must retain the above copyright notice, 9f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * this list of conditions and the following disclaimer. 10f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 2. Redistributions in binary form must reproduce the above copyright notice, 11f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * this list of conditions and the following disclaimer in the documentation 12f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * and/or other materials provided with the distribution. 13f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 3. The name of the author may not be used to endorse or promote products 14f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * derived from this software without specific prior written permission. 15f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 16f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 17f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 19f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 21f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 22f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 23f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 24f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 25f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch */ 27f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 28f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#ifndef TALK_BASE_FILEUTILS_H_ 29f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define TALK_BASE_FILEUTILS_H_ 30f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 31f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <string> 32f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 33f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#ifdef WIN32 34f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/base/win32.h" 35f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#else 36f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <sys/types.h> 37f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <dirent.h> 38f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <sys/stat.h> 39f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <unistd.h> 40f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#endif 41f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 42f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/base/basictypes.h" 43f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/base/common.h" 44f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/base/scoped_ptr.h" 45f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 46f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochnamespace talk_base { 47f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 48f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass FileStream; 49f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass Pathname; 50f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 51f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch////////////////////////// 52f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// Directory Iterator // 53f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch////////////////////////// 54f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 55f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// A DirectoryIterator is created with a given directory. It originally points 56f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// to the first file in the directory, and can be advanecd with Next(). This 57f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// allows you to get information about each file. 58f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 59f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass DirectoryIterator { 60f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch friend class Filesystem; 61f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch public: 62f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Constructor 63f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch DirectoryIterator(); 64f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Destructor 65f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual ~DirectoryIterator(); 66f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 67f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Starts traversing a directory 68f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // dir is the directory to traverse 69f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // returns true if the directory exists and is valid 70f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // The iterator will point to the first entry in the directory 71f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool Iterate(const Pathname &path); 72f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 73f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Advances to the next file 74f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // returns true if there were more files in the directory. 75f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool Next(); 76f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 77f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // returns true if the file currently pointed to is a directory 78f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool IsDirectory() const; 79f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 80f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // returns the name of the file currently pointed to 81f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual std::string Name() const; 82f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 83f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // returns the size of the file currently pointed to 84f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual size_t FileSize() const; 85f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 86f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // returns the last modified time of the file currently pointed to 87f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual time_t FileModifyTime() const; 88f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 89f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // checks whether current file is a special directory file "." or ".." 90f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool IsDots() const { 91f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::string filename(Name()); 92f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return (filename.compare(".") == 0) || (filename.compare("..") == 0); 93f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 94f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 95f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch private: 96f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::string directory_; 97f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#ifdef WIN32 98f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch WIN32_FIND_DATA data_; 99f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch HANDLE handle_; 100f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#else 101f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch DIR *dir_; 102f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch struct dirent *dirent_; 103f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch struct stat stat_; 104f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#endif 105f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}; 106f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 107f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochenum FileTimeType { FTT_CREATED, FTT_MODIFIED, FTT_ACCESSED }; 108f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 109f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass FilesystemInterface { 110f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch public: 111f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual ~FilesystemInterface() {} 112f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 113f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Returns a DirectoryIterator for a given pathname. 114f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // TODO: Do fancy abstracted stuff 115f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual DirectoryIterator *IterateDirectory() { 116f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return new DirectoryIterator(); 117f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 118f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 119f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Opens a file. Returns an open StreamInterface if function succeeds. 120f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Otherwise, returns NULL. 121f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual FileStream *OpenFile(const Pathname &filename, 122f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const std::string &mode) = 0; 123f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 1243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Atomically creates an empty file accessible only to the current user if one 1253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // does not already exist at the given path, otherwise fails. This is the only 1263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // secure way to create a file in a shared temp directory (e.g., C:\Temp on 1273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Windows or /tmp on Linux). 1283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Note that if it is essential that a file be successfully created then the 1293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // app must generate random names and retry on failure, or else it will be 1303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // vulnerable to a trivial DoS. 1313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual bool CreatePrivateFile(const Pathname &filename) = 0; 1323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 133f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // This will attempt to delete the path located at filename. 134f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // It ASSERTS and returns false if the path points to a folder or a 135f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // non-existent file. 136f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool DeleteFile(const Pathname &filename) = 0; 137f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 138f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // This will attempt to delete the empty folder located at 'folder' 139f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // It ASSERTS and returns false if the path points to a file or a non-existent 140f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // folder. It fails normally if the folder is not empty or can otherwise 141f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // not be deleted. 142f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool DeleteEmptyFolder(const Pathname &folder) = 0; 143f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 144f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // This will call IterateDirectory, to get a directory iterator, and then 145f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // call DeleteFolderAndContents and DeleteFile on every path contained in this 146f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // folder. If the folder is empty, this returns true. 147f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool DeleteFolderContents(const Pathname &folder); 148f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 149f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // This deletes the contents of a folder, recursively, and then deletes 150f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // the folder itself. 151f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool DeleteFolderAndContents(const Pathname &folder) { 152f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return DeleteFolderContents(folder) && DeleteEmptyFolder(folder); 153f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 154f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 155f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // This will delete whatever is located at path, be it a file or a folder. 156f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // If it is a folder, it will delete it recursively by calling 157f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // DeleteFolderAndContents 158f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool DeleteFileOrFolder(const Pathname &path) { 159f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (IsFolder(path)) 160f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return DeleteFolderAndContents(path); 161f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch else 162f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return DeleteFile(path); 163f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 164f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 165f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Creates a directory. This will call itself recursively to create /foo/bar 166f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // even if /foo does not exist. Returns true if the function succeeds. 167f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool CreateFolder(const Pathname &pathname) = 0; 168f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 169f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // This moves a file from old_path to new_path, where "old_path" is a 170f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // plain file. This ASSERTs and returns false if old_path points to a 171f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // directory, and returns true if the function succeeds. 172f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // If the new path is on a different volume than the old path, this function 173f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // will attempt to copy and, if that succeeds, delete the old path. 174f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool MoveFolder(const Pathname &old_path, 175f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const Pathname &new_path) = 0; 176f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 177f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // This moves a directory from old_path to new_path, where "old_path" is a 178f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // directory. This ASSERTs and returns false if old_path points to a plain 179f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // file, and returns true if the function succeeds. 180f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // If the new path is on a different volume, this function will attempt to 181f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // copy and if that succeeds, delete the old path. 182f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool MoveFile(const Pathname &old_path, const Pathname &new_path) = 0; 183f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 184f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // This attempts to move whatever is located at old_path to new_path, 185f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // be it a file or folder. 186f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool MoveFileOrFolder(const Pathname &old_path, const Pathname &new_path) { 187f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (IsFile(old_path)) { 188f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return MoveFile(old_path, new_path); 189f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } else { 190f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return MoveFolder(old_path, new_path); 191f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 192f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 193f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 194f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // This copies a file from old_path to new_path. This method ASSERTs and 195f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // returns false if old_path is a folder, and returns true if the copy 196f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // succeeds. 197f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool CopyFile(const Pathname &old_path, const Pathname &new_path) = 0; 198f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 199f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // This copies a folder from old_path to new_path. 200f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool CopyFolder(const Pathname &old_path, const Pathname &new_path); 201f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 202f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool CopyFileOrFolder(const Pathname &old_path, const Pathname &new_path) { 203f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (IsFile(old_path)) 204f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return CopyFile(old_path, new_path); 205f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch else 206f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return CopyFolder(old_path, new_path); 207f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 208f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 209f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Returns true if pathname refers to a directory 210f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool IsFolder(const Pathname& pathname) = 0; 211f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 212f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Returns true if pathname refers to a file 213f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool IsFile(const Pathname& pathname) = 0; 214f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 215f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Returns true if pathname refers to no filesystem object, every parent 216f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // directory either exists, or is also absent. 217f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool IsAbsent(const Pathname& pathname) = 0; 218f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 219f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Returns true if pathname represents a temporary location on the system. 220f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool IsTemporaryPath(const Pathname& pathname) = 0; 221f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 222f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // A folder appropriate for storing temporary files (Contents are 223f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // automatically deleted when the program exits) 224f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool GetTemporaryFolder(Pathname &path, bool create, 225f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const std::string *append) = 0; 226f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 227f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual std::string TempFilename(const Pathname &dir, 228f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const std::string &prefix) = 0; 229f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 230f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Determines the size of the file indicated by path. 231f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool GetFileSize(const Pathname& path, size_t* size) = 0; 232f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 233f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Determines a timestamp associated with the file indicated by path. 234f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool GetFileTime(const Pathname& path, FileTimeType which, 235f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch time_t* time) = 0; 236f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 237f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Returns the path to the running application. 238f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Note: This is not guaranteed to work on all platforms. Be aware of the 239f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // limitations before using it, and robustly handle failure. 240f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool GetAppPathname(Pathname* path) = 0; 241f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 242f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Get a folder that is unique to the current application, which is suitable 243f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // for sharing data between executions of the app. If the per_user arg is 244f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // true, the folder is also specific to the current user. 245f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool GetAppDataFolder(Pathname* path, bool per_user) = 0; 246f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 247f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Get a temporary folder that is unique to the current user and application. 248f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // TODO: Re-evaluate the goals of this function. We probably just need any 249f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // directory that won't collide with another existing directory, and which 250f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // will be cleaned up when the program exits. 251f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool GetAppTempFolder(Pathname* path) = 0; 252f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 253f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Delete the contents of the folder returned by GetAppTempFolder 254f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool CleanAppTempFolder(); 255f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 256f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool GetDiskFreeSpace(const Pathname& path, int64 *freebytes) = 0; 257f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 258f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Returns the absolute path of the current directory. 259f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual Pathname GetCurrentDirectory() = 0; 260f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 261f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Note: These might go into some shared config section later, but they're 262f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // used by some methods in this interface, so we're leaving them here for now. 263f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void SetOrganizationName(const std::string& organization) { 264f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch organization_name_ = organization; 265f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 266f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void GetOrganizationName(std::string* organization) { 267f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch ASSERT(NULL != organization); 268f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *organization = organization_name_; 269f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 270f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void SetApplicationName(const std::string& application) { 271f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch application_name_ = application; 272f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 273f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void GetApplicationName(std::string* application) { 274f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch ASSERT(NULL != application); 275f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *application = application_name_; 276f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 277f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 278f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch protected: 279f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::string organization_name_; 280f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::string application_name_; 281f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}; 282f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 283f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass Filesystem { 284f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch public: 285f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static FilesystemInterface *default_filesystem() { 286f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch ASSERT(default_filesystem_.get() != NULL); 287f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return default_filesystem_.get(); 288f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 289f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 290f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static void set_default_filesystem(FilesystemInterface *filesystem) { 291f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch default_filesystem_.reset(filesystem); 292f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 293f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 294f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static FilesystemInterface *swap_default_filesystem( 295f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch FilesystemInterface *filesystem) { 296f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch FilesystemInterface *cur = default_filesystem_.release(); 297f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch default_filesystem_.reset(filesystem); 298f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return cur; 299f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 300f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 301f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static DirectoryIterator *IterateDirectory() { 302f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return EnsureDefaultFilesystem()->IterateDirectory(); 303f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 304f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 305f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static bool CreateFolder(const Pathname &pathname) { 306f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return EnsureDefaultFilesystem()->CreateFolder(pathname); 307f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 308f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 309f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static FileStream *OpenFile(const Pathname &filename, 310f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const std::string &mode) { 311f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return EnsureDefaultFilesystem()->OpenFile(filename, mode); 312f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 313f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 3143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick static bool CreatePrivateFile(const Pathname &filename) { 3153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return EnsureDefaultFilesystem()->CreatePrivateFile(filename); 3163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 3173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 318f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static bool DeleteFile(const Pathname &filename) { 319f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return EnsureDefaultFilesystem()->DeleteFile(filename); 320f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 321f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 322f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static bool DeleteEmptyFolder(const Pathname &folder) { 323f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return EnsureDefaultFilesystem()->DeleteEmptyFolder(folder); 324f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 325f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 326f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static bool DeleteFolderContents(const Pathname &folder) { 327f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return EnsureDefaultFilesystem()->DeleteFolderContents(folder); 328f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 329f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 330f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static bool DeleteFolderAndContents(const Pathname &folder) { 331f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return EnsureDefaultFilesystem()->DeleteFolderAndContents(folder); 332f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 333f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 334f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static bool MoveFolder(const Pathname &old_path, const Pathname &new_path) { 335f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return EnsureDefaultFilesystem()->MoveFolder(old_path, new_path); 336f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 337f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 338f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static bool MoveFile(const Pathname &old_path, const Pathname &new_path) { 339f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return EnsureDefaultFilesystem()->MoveFile(old_path, new_path); 340f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 341f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 3424a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch static bool CopyFolder(const Pathname &old_path, const Pathname &new_path) { 3434a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch return EnsureDefaultFilesystem()->CopyFolder(old_path, new_path); 3444a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch } 3454a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 346f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static bool CopyFile(const Pathname &old_path, const Pathname &new_path) { 347f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return EnsureDefaultFilesystem()->CopyFile(old_path, new_path); 348f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 349f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 350f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static bool IsFolder(const Pathname& pathname) { 351f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return EnsureDefaultFilesystem()->IsFolder(pathname); 352f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 353f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 354f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static bool IsFile(const Pathname &pathname) { 355f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return EnsureDefaultFilesystem()->IsFile(pathname); 356f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 357f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 358f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static bool IsAbsent(const Pathname &pathname) { 359f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return EnsureDefaultFilesystem()->IsAbsent(pathname); 360f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 361f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 362f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static bool IsTemporaryPath(const Pathname& pathname) { 363f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return EnsureDefaultFilesystem()->IsTemporaryPath(pathname); 364f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 365f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 366f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static bool GetTemporaryFolder(Pathname &path, bool create, 367f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const std::string *append) { 368f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return EnsureDefaultFilesystem()->GetTemporaryFolder(path, create, append); 369f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 370f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 371f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static std::string TempFilename(const Pathname &dir, 372f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const std::string &prefix) { 373f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return EnsureDefaultFilesystem()->TempFilename(dir, prefix); 374f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 375f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 376f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static bool GetFileSize(const Pathname& path, size_t* size) { 377f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return EnsureDefaultFilesystem()->GetFileSize(path, size); 378f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 379f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 380f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static bool GetFileTime(const Pathname& path, FileTimeType which, 381f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch time_t* time) { 382f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return EnsureDefaultFilesystem()->GetFileTime(path, which, time); 383f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 384f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 385f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static bool GetAppPathname(Pathname* path) { 386f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return EnsureDefaultFilesystem()->GetAppPathname(path); 387f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 388f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 389f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static bool GetAppDataFolder(Pathname* path, bool per_user) { 390f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return EnsureDefaultFilesystem()->GetAppDataFolder(path, per_user); 391f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 392f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 393f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static bool GetAppTempFolder(Pathname* path) { 394f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return EnsureDefaultFilesystem()->GetAppTempFolder(path); 395f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 396f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 397f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static bool CleanAppTempFolder() { 398f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return EnsureDefaultFilesystem()->CleanAppTempFolder(); 399f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 400f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 401f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static bool GetDiskFreeSpace(const Pathname& path, int64 *freebytes) { 402f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return EnsureDefaultFilesystem()->GetDiskFreeSpace(path, freebytes); 403f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 404f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 405f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Definition has to be in the .cc file due to returning forward-declared 406f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Pathname by value. 407f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static Pathname GetCurrentDirectory(); 408f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 409f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static void SetOrganizationName(const std::string& organization) { 410f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch EnsureDefaultFilesystem()->SetOrganizationName(organization); 411f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 412f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 413f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static void GetOrganizationName(std::string* organization) { 414f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch EnsureDefaultFilesystem()->GetOrganizationName(organization); 415f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 416f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 417f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static void SetApplicationName(const std::string& application) { 418f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch EnsureDefaultFilesystem()->SetApplicationName(application); 419f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 420f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 421f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static void GetApplicationName(std::string* application) { 422f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch EnsureDefaultFilesystem()->GetApplicationName(application); 423f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 424f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 425f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch private: 426f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static scoped_ptr<FilesystemInterface> default_filesystem_; 427f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 428f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static FilesystemInterface *EnsureDefaultFilesystem(); 429f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(Filesystem); 430f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}; 431f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 432f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass FilesystemScope{ 433f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch public: 434f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch explicit FilesystemScope(FilesystemInterface *new_fs) { 435f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch old_fs_ = Filesystem::swap_default_filesystem(new_fs); 436f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 437f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch ~FilesystemScope() { 438f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch Filesystem::set_default_filesystem(old_fs_); 439f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 440f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch private: 441f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch FilesystemInterface* old_fs_; 442f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(FilesystemScope); 443f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}; 444f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 445f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// Generates a unique filename based on the input path. If no path component 446f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// is specified, it uses the temporary directory. If a filename is provided, 447f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// up to 100 variations of form basename-N.extension are tried. When 448f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// create_empty is true, an empty file of this name is created (which 449f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// decreases the chance of a temporary filename collision with another 450f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// process). 451f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochbool CreateUniqueFile(Pathname& path, bool create_empty); 452f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 453f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} // namespace talk_base 454f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 455f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#endif // TALK_BASE_FILEUTILS_H_ 456f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 457