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