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