15976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org/* 25976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * libjingle 35976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Copyright 2004--2006, Google Inc. 45976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 55976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Redistribution and use in source and binary forms, with or without 65976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * modification, are permitted provided that the following conditions are met: 75976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 85976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 95976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * this list of conditions and the following disclaimer. 105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * this list of conditions and the following disclaimer in the documentation 125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * and/or other materials provided with the distribution. 135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 3. The name of the author may not be used to endorse or promote products 145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * derived from this software without specific prior written permission. 155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org */ 275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <cassert> 295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#ifdef WIN32 315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/win32.h" 325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif 335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/pathutils.h" 355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/fileutils.h" 365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/stringutils.h" 375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/stream.h" 385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#ifdef WIN32 405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/win32filesystem.h" 415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#else 425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/unixfilesystem.h" 435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif 445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#ifndef WIN32 465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#define MAX_PATH 260 475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif 485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgnamespace talk_base { 505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org////////////////////////// 525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Directory Iterator // 535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org////////////////////////// 545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// A DirectoryIterator is created with a given directory. It originally points 565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// to the first file in the directory, and can be advanecd with Next(). This 575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// allows you to get information about each file. 585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Constructor 605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgDirectoryIterator::DirectoryIterator() 615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#ifdef _WIN32 625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org : handle_(INVALID_HANDLE_VALUE) { 635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#else 645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org : dir_(NULL), dirent_(NULL) { 655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif 665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Destructor 695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgDirectoryIterator::~DirectoryIterator() { 705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#ifdef WIN32 715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (handle_ != INVALID_HANDLE_VALUE) 725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::FindClose(handle_); 735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#else 745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (dir_) 755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org closedir(dir_); 765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif 775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Starts traversing a directory. 805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // dir is the directory to traverse 815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // returns true if the directory exists and is valid 825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool DirectoryIterator::Iterate(const Pathname &dir) { 835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org directory_ = dir.pathname(); 845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#ifdef WIN32 855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (handle_ != INVALID_HANDLE_VALUE) 865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::FindClose(handle_); 875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string d = dir.pathname() + '*'; 885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org handle_ = ::FindFirstFile(ToUtf16(d).c_str(), &data_); 895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (handle_ == INVALID_HANDLE_VALUE) 905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return false; 915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#else 925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (dir_ != NULL) 935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org closedir(dir_); 945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org dir_ = ::opendir(directory_.c_str()); 955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (dir_ == NULL) 965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return false; 975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org dirent_ = readdir(dir_); 985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (dirent_ == NULL) 995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return false; 1005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (::stat(std::string(directory_ + Name()).c_str(), &stat_) != 0) 1025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return false; 1035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif 1045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return true; 1055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 1065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Advances to the next file 1085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // returns true if there were more files in the directory. 1095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool DirectoryIterator::Next() { 1105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#ifdef WIN32 1115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return ::FindNextFile(handle_, &data_) == TRUE; 1125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#else 1135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org dirent_ = ::readdir(dir_); 1145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (dirent_ == NULL) 1155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return false; 1165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return ::stat(std::string(directory_ + Name()).c_str(), &stat_) == 0; 1185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif 1195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 1205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // returns true if the file currently pointed to is a directory 1225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool DirectoryIterator::IsDirectory() const { 1235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#ifdef WIN32 1245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return (data_.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != FALSE; 1255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#else 1265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return S_ISDIR(stat_.st_mode); 1275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif 1285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 1295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // returns the name of the file currently pointed to 1315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstd::string DirectoryIterator::Name() const { 1325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#ifdef WIN32 1335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return ToUtf8(data_.cFileName); 1345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#else 1355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org assert(dirent_ != NULL); 1365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return dirent_->d_name; 1375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif 1385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 1395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // returns the size of the file currently pointed to 1415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgsize_t DirectoryIterator::FileSize() const { 1425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#ifndef WIN32 1435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return stat_.st_size; 1445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#else 1455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return data_.nFileSizeLow; 1465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif 1475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 1485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // returns the last modified time of this file 1505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgtime_t DirectoryIterator::FileModifyTime() const { 1515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#ifdef WIN32 1525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org time_t val; 1535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org FileTimeToUnixTime(data_.ftLastWriteTime, &val); 1545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return val; 1555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#else 1565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return stat_.st_mtime; 1575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif 1585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 1595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgFilesystemInterface* Filesystem::default_filesystem_ = NULL; 1615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgFilesystemInterface *Filesystem::EnsureDefaultFilesystem() { 1635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (!default_filesystem_) { 1645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#ifdef WIN32 1655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org default_filesystem_ = new Win32Filesystem(); 1665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#else 1675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org default_filesystem_ = new UnixFilesystem(); 1685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif 1695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return default_filesystem_; 1715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 1725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool FilesystemInterface::CopyFolder(const Pathname &old_path, 1745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const Pathname &new_path) { 1755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool success = true; 1765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org VERIFY(IsFolder(old_path)); 1775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org Pathname new_dir; 1785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org new_dir.SetFolder(new_path.pathname()); 1795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org Pathname old_dir; 1805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org old_dir.SetFolder(old_path.pathname()); 1815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (!CreateFolder(new_dir)) 1825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return false; 1835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org DirectoryIterator *di = IterateDirectory(); 1845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (!di) 1855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return false; 1865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (di->Iterate(old_dir.pathname())) { 1875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org do { 1885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (di->Name() == "." || di->Name() == "..") 1895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org continue; 1905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org Pathname source; 1915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org Pathname dest; 1925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org source.SetFolder(old_dir.pathname()); 1935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org dest.SetFolder(new_path.pathname()); 1945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org source.SetFilename(di->Name()); 1955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org dest.SetFilename(di->Name()); 1965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (!CopyFileOrFolder(source, dest)) 1975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org success = false; 1985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } while (di->Next()); 1995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org delete di; 2015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return success; 2025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 2035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool FilesystemInterface::DeleteFolderContents(const Pathname &folder) { 2055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool success = true; 2065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org VERIFY(IsFolder(folder)); 2075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org DirectoryIterator *di = IterateDirectory(); 2085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (!di) 2095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return false; 2105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (di->Iterate(folder)) { 2115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org do { 2125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (di->Name() == "." || di->Name() == "..") 2135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org continue; 2145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org Pathname subdir; 2155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org subdir.SetFolder(folder.pathname()); 2165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (di->IsDirectory()) { 2175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org subdir.AppendFolder(di->Name()); 2185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (!DeleteFolderAndContents(subdir)) { 2195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org success = false; 2205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } else { 2225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org subdir.SetFilename(di->Name()); 2235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (!DeleteFile(subdir)) { 2245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org success = false; 2255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } while (di->Next()); 2285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org delete di; 2305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return success; 2315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 2325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool FilesystemInterface::CleanAppTempFolder() { 2345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org Pathname path; 2355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (!GetAppTempFolder(&path)) 2365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return false; 2375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (IsAbsent(path)) 2385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return true; 2395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (!IsTemporaryPath(path)) { 2405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT(false); 2415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return false; 2425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return DeleteFolderContents(path); 2445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 2455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgPathname Filesystem::GetCurrentDirectory() { 2475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return EnsureDefaultFilesystem()->GetCurrentDirectory(); 2485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 2495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool CreateUniqueFile(Pathname& path, bool create_empty) { 2515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org LOG(LS_INFO) << "Path " << path.pathname() << std::endl; 2525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // If no folder is supplied, use the temporary folder 2535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (path.folder().empty()) { 2545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org Pathname temporary_path; 2555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (!Filesystem::GetTemporaryFolder(temporary_path, true, NULL)) { 2565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org printf("Get temp failed\n"); 2575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return false; 2585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org path.SetFolder(temporary_path.pathname()); 2605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // If no filename is supplied, use a temporary name 2635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (path.filename().empty()) { 2645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string folder(path.folder()); 2655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string filename = Filesystem::TempFilename(folder, "gt"); 2665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org path.SetPathname(filename); 2675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (!create_empty) { 2685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org Filesystem::DeleteFile(path.pathname()); 2695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return true; 2715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Otherwise, create a unique name based on the given filename 2745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // foo.txt -> foo-N.txt 2755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string basename = path.basename(); 2765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const size_t MAX_VERSION = 100; 2775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org size_t version = 0; 2785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org while (version < MAX_VERSION) { 2795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string pathname = path.pathname(); 2805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (!Filesystem::IsFile(pathname)) { 2825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (create_empty) { 2835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org FileStream* fs = Filesystem::OpenFile(pathname, "w"); 2845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org delete fs; 2855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return true; 2875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org version += 1; 2895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org char version_base[MAX_PATH]; 2905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org sprintfn(version_base, ARRAY_SIZE(version_base), "%s-%u", 2915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org basename.c_str(), version); 2925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org path.SetBasename(version_base); 2935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return true; 2955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 2965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} // namespace talk_base 298