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#include <cassert> 29f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 30f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#ifdef WIN32 31f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/base/win32.h" 32f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#endif 33f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 34f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/base/pathutils.h" 35f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/base/fileutils.h" 36f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/base/stringutils.h" 37f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/base/stream.h" 38f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 39f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/base/unixfilesystem.h" 40f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/base/win32filesystem.h" 41f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 42f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#ifndef WIN32 43f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define MAX_PATH 260 44f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#endif 45f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 46f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochnamespace talk_base { 47f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 48f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch////////////////////////// 49f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// Directory Iterator // 50f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch////////////////////////// 51f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 52f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// A DirectoryIterator is created with a given directory. It originally points 53f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// to the first file in the directory, and can be advanecd with Next(). This 54f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// allows you to get information about each file. 55f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 56f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Constructor 57f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen MurdochDirectoryIterator::DirectoryIterator() 58f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#ifdef _WIN32 59f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch : handle_(INVALID_HANDLE_VALUE) { 60f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#else 61f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch : dir_(NULL), dirent_(NULL) { 62f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#endif 63f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 64f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 65f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Destructor 66f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen MurdochDirectoryIterator::~DirectoryIterator() { 67f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#ifdef WIN32 68f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (handle_ != INVALID_HANDLE_VALUE) 69f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch ::FindClose(handle_); 70f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#else 71f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (dir_) 72f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch closedir(dir_); 73f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#endif 74f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 75f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 76f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Starts traversing a directory. 77f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // dir is the directory to traverse 78f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // returns true if the directory exists and is valid 79f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochbool DirectoryIterator::Iterate(const Pathname &dir) { 80f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch directory_ = dir.pathname(); 81f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#ifdef WIN32 82f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (handle_ != INVALID_HANDLE_VALUE) 83f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch ::FindClose(handle_); 84f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::string d = dir.pathname() + '*'; 85f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch handle_ = ::FindFirstFile(ToUtf16(d).c_str(), &data_); 86f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (handle_ == INVALID_HANDLE_VALUE) 87f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return false; 88f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#else 89f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (dir_ != NULL) 90f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch closedir(dir_); 91f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch dir_ = ::opendir(directory_.c_str()); 92f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (dir_ == NULL) 93f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return false; 94f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch dirent_ = readdir(dir_); 95f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (dirent_ == NULL) 96f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return false; 97f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 98f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (::stat(std::string(directory_ + Name()).c_str(), &stat_) != 0) 99f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return false; 100f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#endif 101f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return true; 102f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 103f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 104f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Advances to the next file 105f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // returns true if there were more files in the directory. 106f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochbool DirectoryIterator::Next() { 107f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#ifdef WIN32 108f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return ::FindNextFile(handle_, &data_) == TRUE; 109f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#else 110f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch dirent_ = ::readdir(dir_); 111f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (dirent_ == NULL) 112f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return false; 113f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 114f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return ::stat(std::string(directory_ + Name()).c_str(), &stat_) == 0; 115f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#endif 116f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 117f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 118f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // returns true if the file currently pointed to is a directory 119f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochbool DirectoryIterator::IsDirectory() const { 120f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#ifdef WIN32 121f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return (data_.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != FALSE; 122f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#else 123f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return S_ISDIR(stat_.st_mode); 124f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#endif 125f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 126f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 127f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // returns the name of the file currently pointed to 128f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochstd::string DirectoryIterator::Name() const { 129f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#ifdef WIN32 130f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return ToUtf8(data_.cFileName); 131f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#else 132f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch assert(dirent_ != NULL); 133f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return dirent_->d_name; 134f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#endif 135f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 136f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 137f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // returns the size of the file currently pointed to 138f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochsize_t DirectoryIterator::FileSize() const { 139f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#ifndef WIN32 140f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return stat_.st_size; 141f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#else 142f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return data_.nFileSizeLow; 143f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#endif 144f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 145f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 146f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // returns the last modified time of this file 147f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochtime_t DirectoryIterator::FileModifyTime() const { 148f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#ifdef WIN32 149f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch time_t val; 150f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch FileTimeToUnixTime(data_.ftLastWriteTime, &val); 151f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return val; 152f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#else 153f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return stat_.st_mtime; 154f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#endif 155f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 156f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 157f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochscoped_ptr<FilesystemInterface> Filesystem::default_filesystem_; 158f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen MurdochFilesystemInterface *Filesystem::EnsureDefaultFilesystem() { 159f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (!default_filesystem_.get()) 160f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#ifdef WIN32 161f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch default_filesystem_.reset(new Win32Filesystem()); 162f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#else 163f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch default_filesystem_.reset(new UnixFilesystem()); 164f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#endif 165f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return default_filesystem_.get(); 166f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 167f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 168f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochbool FilesystemInterface::CopyFolder(const Pathname &old_path, 169f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const Pathname &new_path) { 170f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch VERIFY(IsFolder(old_path)); 171f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch Pathname new_dir; 172f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch new_dir.SetFolder(new_path.pathname()); 173f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch Pathname old_dir; 174f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch old_dir.SetFolder(old_path.pathname()); 175f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (!CreateFolder(new_dir)) 176f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return false; 177f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch DirectoryIterator di; 178f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch di.Iterate(old_dir.pathname()); 179f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch while (di.Next()) { 180f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (di.Name() == "." || di.Name() == "..") 181f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch continue; 182f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch Pathname source; 183f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch Pathname dest; 184f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch source.SetFolder(old_dir.pathname()); 185f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch dest.SetFolder(new_path.pathname()); 186f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch source.SetFilename(di.Name()); 187f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch dest.SetFilename(di.Name()); 188f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (!CopyFileOrFolder(source, dest)) 189f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return false; 190f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 191f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return true; 192f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 193f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 194f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochbool FilesystemInterface::DeleteFolderContents(const Pathname &folder) { 195f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool success = true; 196f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch VERIFY(IsFolder(folder)); 197f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch DirectoryIterator *di = IterateDirectory(); 198f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch di->Iterate(folder); 199f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch while (di->Next()) { 200f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (di->Name() == "." || di->Name() == "..") 201f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch continue; 202f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch Pathname subdir; 203f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch subdir.SetFolder(folder.pathname()); 204f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (di->IsDirectory()) { 205f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch subdir.AppendFolder(di->Name()); 206f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (!DeleteFolderAndContents(subdir)) { 207f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch success = false; 208f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 209f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } else { 210f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch subdir.SetFilename(di->Name()); 211f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (!DeleteFile(subdir)) { 212f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch success = false; 213f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 214f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 215f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 216f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch delete di; 217f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return success; 218f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 219f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 220f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochbool FilesystemInterface::CleanAppTempFolder() { 221f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch Pathname path; 222f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (!GetAppTempFolder(&path)) 223f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return false; 224f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (IsAbsent(path)) 225f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return true; 226f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (!IsTemporaryPath(path)) { 227f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch ASSERT(false); 228f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return false; 229f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 230f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return DeleteFolderContents(path); 231f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 232f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 233f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen MurdochPathname Filesystem::GetCurrentDirectory() { 234f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return EnsureDefaultFilesystem()->GetCurrentDirectory(); 235f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 236f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 237f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochbool CreateUniqueFile(Pathname& path, bool create_empty) { 238f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch LOG(LS_INFO) << "Path " << path.pathname() << std::endl; 239f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // If no folder is supplied, use the temporary folder 240f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (path.folder().empty()) { 241f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch Pathname temporary_path; 242f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (!Filesystem::GetTemporaryFolder(temporary_path, true, NULL)) { 243f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch printf("Get temp failed\n"); 244f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return false; 245f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 246f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch path.SetFolder(temporary_path.pathname()); 247f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 248f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 249f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // If no filename is supplied, use a temporary name 250f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (path.filename().empty()) { 251f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::string folder(path.folder()); 252f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::string filename = Filesystem::TempFilename(folder, "gt"); 253f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch path.SetPathname(filename); 254f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (!create_empty) { 255f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch Filesystem::DeleteFile(path.pathname()); 256f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 257f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return true; 258f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 259f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 260f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Otherwise, create a unique name based on the given filename 261f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // foo.txt -> foo-N.txt 262f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const std::string basename = path.basename(); 263f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const size_t MAX_VERSION = 100; 264f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch size_t version = 0; 265f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch while (version < MAX_VERSION) { 266f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::string pathname = path.pathname(); 267f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 268f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (!Filesystem::IsFile(pathname)) { 269f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (create_empty) { 270f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch FileStream* fs = Filesystem::OpenFile(pathname, "w"); 271f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch delete fs; 272f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 273f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return true; 274f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 275f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch version += 1; 276f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch char version_base[MAX_PATH]; 277f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch sprintfn(version_base, ARRAY_SIZE(version_base), "%s-%u", 278f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch basename.c_str(), version); 279f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch path.SetBasename(version_base); 280f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 281f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return true; 282f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 283f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 284f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} // namespace talk_base 285