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