15976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org/* 25976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * libjingle 35976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Copyright 2004--2006, Google Inc. 45976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 55976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Redistribution and use in source and binary forms, with or without 65976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * modification, are permitted provided that the following conditions are met: 75976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 85976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 95976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * this list of conditions and the following disclaimer. 105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * this list of conditions and the following disclaimer in the documentation 125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * and/or other materials provided with the distribution. 135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 3. The name of the author may not be used to endorse or promote products 145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * derived from this software without specific prior written permission. 155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org */ 275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#ifndef TALK_BASE_FILEUTILS_H_ 295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#define TALK_BASE_FILEUTILS_H_ 305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <string> 325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#ifdef WIN32 345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/win32.h" 355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#else 365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <sys/types.h> 375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <dirent.h> 385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <sys/stat.h> 395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <unistd.h> 405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif 415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/basictypes.h" 435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/common.h" 445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/scoped_ptr.h" 455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgnamespace talk_base { 475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass FileStream; 495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass Pathname; 505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org////////////////////////// 525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Directory Iterator // 535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org////////////////////////// 545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// A DirectoryIterator is created with a given directory. It originally points 565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// to the first file in the directory, and can be advanecd with Next(). This 575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// allows you to get information about each file. 585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass DirectoryIterator { 605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org friend class Filesystem; 615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public: 625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Constructor 635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org DirectoryIterator(); 645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Destructor 655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual ~DirectoryIterator(); 665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Starts traversing a directory 685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // dir is the directory to traverse 695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // returns true if the directory exists and is valid 705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // The iterator will point to the first entry in the directory 715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual bool Iterate(const Pathname &path); 725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Advances to the next file 745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // returns true if there were more files in the directory. 755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual bool Next(); 765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // returns true if the file currently pointed to is a directory 785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual bool IsDirectory() const; 795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // returns the name of the file currently pointed to 815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual std::string Name() const; 825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // returns the size of the file currently pointed to 845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual size_t FileSize() const; 855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // returns the last modified time of the file currently pointed to 875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual time_t FileModifyTime() const; 885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // checks whether current file is a special directory file "." or ".." 905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool IsDots() const { 915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string filename(Name()); 925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return (filename.compare(".") == 0) || (filename.compare("..") == 0); 935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org private: 965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string directory_; 975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#ifdef WIN32 985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org WIN32_FIND_DATA data_; 995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org HANDLE handle_; 1005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#else 1015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org DIR *dir_; 1025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org struct dirent *dirent_; 1035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org struct stat stat_; 1045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif 1055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}; 1065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgenum FileTimeType { FTT_CREATED, FTT_MODIFIED, FTT_ACCESSED }; 1085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass FilesystemInterface { 1105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public: 1115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual ~FilesystemInterface() {} 1125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Returns a DirectoryIterator for a given pathname. 1145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // TODO: Do fancy abstracted stuff 1155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual DirectoryIterator *IterateDirectory() { 1165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return new DirectoryIterator(); 1175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Opens a file. Returns an open StreamInterface if function succeeds. 1205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Otherwise, returns NULL. 1215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // TODO: Add an error param to indicate failure reason, similar to 1225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // FileStream::Open 1235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual FileStream *OpenFile(const Pathname &filename, 1245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string &mode) = 0; 1255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Atomically creates an empty file accessible only to the current user if one 1275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // does not already exist at the given path, otherwise fails. This is the only 1285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // secure way to create a file in a shared temp directory (e.g., C:\Temp on 1295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Windows or /tmp on Linux). 1305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Note that if it is essential that a file be successfully created then the 1315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // app must generate random names and retry on failure, or else it will be 1325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // vulnerable to a trivial DoS. 1335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual bool CreatePrivateFile(const Pathname &filename) = 0; 1345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // This will attempt to delete the path located at filename. 1365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // It ASSERTS and returns false if the path points to a folder or a 1375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // non-existent file. 1385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual bool DeleteFile(const Pathname &filename) = 0; 1395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // This will attempt to delete the empty folder located at 'folder' 1415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // It ASSERTS and returns false if the path points to a file or a non-existent 1425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // folder. It fails normally if the folder is not empty or can otherwise 1435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // not be deleted. 1445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual bool DeleteEmptyFolder(const Pathname &folder) = 0; 1455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // This will call IterateDirectory, to get a directory iterator, and then 1475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // call DeleteFolderAndContents and DeleteFile on every path contained in this 1485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // folder. If the folder is empty, this returns true. 1495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual bool DeleteFolderContents(const Pathname &folder); 1505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // This deletes the contents of a folder, recursively, and then deletes 1525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // the folder itself. 1535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual bool DeleteFolderAndContents(const Pathname &folder) { 1545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return DeleteFolderContents(folder) && DeleteEmptyFolder(folder); 1555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // This will delete whatever is located at path, be it a file or a folder. 1585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // If it is a folder, it will delete it recursively by calling 1595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // DeleteFolderAndContents 1605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool DeleteFileOrFolder(const Pathname &path) { 1615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (IsFolder(path)) 1625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return DeleteFolderAndContents(path); 1635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org else 1645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return DeleteFile(path); 1655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Creates a directory. This will call itself recursively to create /foo/bar 1685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // even if /foo does not exist. Returns true if the function succeeds. 1695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual bool CreateFolder(const Pathname &pathname) = 0; 1705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // This moves a file from old_path to new_path, where "old_path" is a 1725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // plain file. This ASSERTs and returns false if old_path points to a 1735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // directory, and returns true if the function succeeds. 1745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // If the new path is on a different volume than the old path, this function 1755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // will attempt to copy and, if that succeeds, delete the old path. 1765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual bool MoveFolder(const Pathname &old_path, 1775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const Pathname &new_path) = 0; 1785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // This moves a directory from old_path to new_path, where "old_path" is a 1805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // directory. This ASSERTs and returns false if old_path points to a plain 1815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // file, and returns true if the function succeeds. 1825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // If the new path is on a different volume, this function will attempt to 1835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // copy and if that succeeds, delete the old path. 1845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual bool MoveFile(const Pathname &old_path, const Pathname &new_path) = 0; 1855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // This attempts to move whatever is located at old_path to new_path, 1875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // be it a file or folder. 1885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool MoveFileOrFolder(const Pathname &old_path, const Pathname &new_path) { 1895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (IsFile(old_path)) { 1905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return MoveFile(old_path, new_path); 1915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } else { 1925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return MoveFolder(old_path, new_path); 1935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // This copies a file from old_path to new_path. This method ASSERTs and 1975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // returns false if old_path is a folder, and returns true if the copy 1985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // succeeds. 1995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual bool CopyFile(const Pathname &old_path, const Pathname &new_path) = 0; 2005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // This copies a folder from old_path to new_path. 2025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool CopyFolder(const Pathname &old_path, const Pathname &new_path); 2035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool CopyFileOrFolder(const Pathname &old_path, const Pathname &new_path) { 2055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (IsFile(old_path)) 2065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return CopyFile(old_path, new_path); 2075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org else 2085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return CopyFolder(old_path, new_path); 2095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Returns true if pathname refers to a directory 2125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual bool IsFolder(const Pathname& pathname) = 0; 2135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Returns true if pathname refers to a file 2155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual bool IsFile(const Pathname& pathname) = 0; 2165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Returns true if pathname refers to no filesystem object, every parent 2185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // directory either exists, or is also absent. 2195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual bool IsAbsent(const Pathname& pathname) = 0; 2205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Returns true if pathname represents a temporary location on the system. 2225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual bool IsTemporaryPath(const Pathname& pathname) = 0; 2235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // A folder appropriate for storing temporary files (Contents are 2255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // automatically deleted when the program exits) 2265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual bool GetTemporaryFolder(Pathname &path, bool create, 2275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string *append) = 0; 2285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual std::string TempFilename(const Pathname &dir, 2305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string &prefix) = 0; 2315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Determines the size of the file indicated by path. 2335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual bool GetFileSize(const Pathname& path, size_t* size) = 0; 2345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Determines a timestamp associated with the file indicated by path. 2365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual bool GetFileTime(const Pathname& path, FileTimeType which, 2375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org time_t* time) = 0; 2385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Returns the path to the running application. 2405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Note: This is not guaranteed to work on all platforms. Be aware of the 2415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // limitations before using it, and robustly handle failure. 2425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual bool GetAppPathname(Pathname* path) = 0; 2435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Get a folder that is unique to the current application, which is suitable 2455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // for sharing data between executions of the app. If the per_user arg is 2465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // true, the folder is also specific to the current user. 2475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual bool GetAppDataFolder(Pathname* path, bool per_user) = 0; 2485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Get a temporary folder that is unique to the current user and application. 2505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // TODO: Re-evaluate the goals of this function. We probably just need any 2515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // directory that won't collide with another existing directory, and which 2525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // will be cleaned up when the program exits. 2535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual bool GetAppTempFolder(Pathname* path) = 0; 2545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Delete the contents of the folder returned by GetAppTempFolder 2565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool CleanAppTempFolder(); 2575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual bool GetDiskFreeSpace(const Pathname& path, int64 *freebytes) = 0; 2595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Returns the absolute path of the current directory. 2615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual Pathname GetCurrentDirectory() = 0; 2625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Note: These might go into some shared config section later, but they're 2645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // used by some methods in this interface, so we're leaving them here for now. 2655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void SetOrganizationName(const std::string& organization) { 2665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org organization_name_ = organization; 2675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void GetOrganizationName(std::string* organization) { 2695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT(NULL != organization); 2705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *organization = organization_name_; 2715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void SetApplicationName(const std::string& application) { 2735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org application_name_ = application; 2745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void GetApplicationName(std::string* application) { 2765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT(NULL != application); 2775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *application = application_name_; 2785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org protected: 2815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string organization_name_; 2825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string application_name_; 2835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}; 2845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass Filesystem { 2865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public: 2875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static FilesystemInterface *default_filesystem() { 2885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT(default_filesystem_ != NULL); 2895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return default_filesystem_; 2905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static void set_default_filesystem(FilesystemInterface *filesystem) { 2935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org default_filesystem_ = filesystem; 2945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static FilesystemInterface *swap_default_filesystem( 2975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org FilesystemInterface *filesystem) { 2985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org FilesystemInterface *cur = default_filesystem_; 2995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org default_filesystem_ = filesystem; 3005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return cur; 3015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 3025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static DirectoryIterator *IterateDirectory() { 3045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return EnsureDefaultFilesystem()->IterateDirectory(); 3055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 3065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static bool CreateFolder(const Pathname &pathname) { 3085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return EnsureDefaultFilesystem()->CreateFolder(pathname); 3095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 3105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static FileStream *OpenFile(const Pathname &filename, 3125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string &mode) { 3135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return EnsureDefaultFilesystem()->OpenFile(filename, mode); 3145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 3155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static bool CreatePrivateFile(const Pathname &filename) { 3175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return EnsureDefaultFilesystem()->CreatePrivateFile(filename); 3185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 3195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static bool DeleteFile(const Pathname &filename) { 3215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return EnsureDefaultFilesystem()->DeleteFile(filename); 3225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 3235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static bool DeleteEmptyFolder(const Pathname &folder) { 3255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return EnsureDefaultFilesystem()->DeleteEmptyFolder(folder); 3265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 3275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static bool DeleteFolderContents(const Pathname &folder) { 3295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return EnsureDefaultFilesystem()->DeleteFolderContents(folder); 3305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 3315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static bool DeleteFolderAndContents(const Pathname &folder) { 3335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return EnsureDefaultFilesystem()->DeleteFolderAndContents(folder); 3345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 3355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static bool MoveFolder(const Pathname &old_path, const Pathname &new_path) { 3375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return EnsureDefaultFilesystem()->MoveFolder(old_path, new_path); 3385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 3395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static bool MoveFile(const Pathname &old_path, const Pathname &new_path) { 3415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return EnsureDefaultFilesystem()->MoveFile(old_path, new_path); 3425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 3435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static bool CopyFolder(const Pathname &old_path, const Pathname &new_path) { 3455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return EnsureDefaultFilesystem()->CopyFolder(old_path, new_path); 3465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 3475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static bool CopyFile(const Pathname &old_path, const Pathname &new_path) { 3495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return EnsureDefaultFilesystem()->CopyFile(old_path, new_path); 3505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 3515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static bool IsFolder(const Pathname& pathname) { 3535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return EnsureDefaultFilesystem()->IsFolder(pathname); 3545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 3555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static bool IsFile(const Pathname &pathname) { 3575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return EnsureDefaultFilesystem()->IsFile(pathname); 3585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 3595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static bool IsAbsent(const Pathname &pathname) { 3615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return EnsureDefaultFilesystem()->IsAbsent(pathname); 3625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 3635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static bool IsTemporaryPath(const Pathname& pathname) { 3655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return EnsureDefaultFilesystem()->IsTemporaryPath(pathname); 3665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 3675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static bool GetTemporaryFolder(Pathname &path, bool create, 3695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string *append) { 3705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return EnsureDefaultFilesystem()->GetTemporaryFolder(path, create, append); 3715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 3725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static std::string TempFilename(const Pathname &dir, 3745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string &prefix) { 3755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return EnsureDefaultFilesystem()->TempFilename(dir, prefix); 3765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 3775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static bool GetFileSize(const Pathname& path, size_t* size) { 3795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return EnsureDefaultFilesystem()->GetFileSize(path, size); 3805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 3815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static bool GetFileTime(const Pathname& path, FileTimeType which, 3835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org time_t* time) { 3845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return EnsureDefaultFilesystem()->GetFileTime(path, which, time); 3855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 3865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static bool GetAppPathname(Pathname* path) { 3885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return EnsureDefaultFilesystem()->GetAppPathname(path); 3895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 3905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static bool GetAppDataFolder(Pathname* path, bool per_user) { 3925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return EnsureDefaultFilesystem()->GetAppDataFolder(path, per_user); 3935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 3945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static bool GetAppTempFolder(Pathname* path) { 3965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return EnsureDefaultFilesystem()->GetAppTempFolder(path); 3975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 3985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static bool CleanAppTempFolder() { 4005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return EnsureDefaultFilesystem()->CleanAppTempFolder(); 4015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 4025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static bool GetDiskFreeSpace(const Pathname& path, int64 *freebytes) { 4045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return EnsureDefaultFilesystem()->GetDiskFreeSpace(path, freebytes); 4055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 4065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Definition has to be in the .cc file due to returning forward-declared 4085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Pathname by value. 4095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static Pathname GetCurrentDirectory(); 4105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static void SetOrganizationName(const std::string& organization) { 4125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EnsureDefaultFilesystem()->SetOrganizationName(organization); 4135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 4145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static void GetOrganizationName(std::string* organization) { 4165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EnsureDefaultFilesystem()->GetOrganizationName(organization); 4175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 4185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static void SetApplicationName(const std::string& application) { 4205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EnsureDefaultFilesystem()->SetApplicationName(application); 4215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 4225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static void GetApplicationName(std::string* application) { 4245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EnsureDefaultFilesystem()->GetApplicationName(application); 4255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 4265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org private: 4285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static FilesystemInterface* default_filesystem_; 4295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static FilesystemInterface *EnsureDefaultFilesystem(); 4315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org DISALLOW_IMPLICIT_CONSTRUCTORS(Filesystem); 4325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}; 4335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass FilesystemScope{ 4355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public: 4365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org explicit FilesystemScope(FilesystemInterface *new_fs) { 4375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org old_fs_ = Filesystem::swap_default_filesystem(new_fs); 4385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 4395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ~FilesystemScope() { 4405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org Filesystem::set_default_filesystem(old_fs_); 4415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 4425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org private: 4435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org FilesystemInterface* old_fs_; 4445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org DISALLOW_IMPLICIT_CONSTRUCTORS(FilesystemScope); 4455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}; 4465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Generates a unique filename based on the input path. If no path component 4485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// is specified, it uses the temporary directory. If a filename is provided, 4495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// up to 100 variations of form basename-N.extension are tried. When 4505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// create_empty is true, an empty file of this name is created (which 4515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// decreases the chance of a temporary filename collision with another 4525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// process). 4535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool CreateUniqueFile(Pathname& path, bool create_empty); 4545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} // namespace talk_base 4565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif // TALK_BASE_FILEUTILS_H_ 458