1/* 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11#ifndef WEBRTC_BASE_PATHUTILS_H__ 12#define WEBRTC_BASE_PATHUTILS_H__ 13 14#include <string> 15// Temporary, until deprecated helpers are removed. 16#include "webrtc/base/fileutils.h" 17 18namespace rtc { 19 20/////////////////////////////////////////////////////////////////////////////// 21// Pathname - parsing of pathnames into components, and vice versa. 22// 23// To establish consistent terminology, a filename never contains a folder 24// component. A folder never contains a filename. A pathname may include 25// a folder and/or filename component. Here are some examples: 26// 27// pathname() /home/john/example.txt 28// folder() /home/john/ 29// filename() example.txt 30// parent_folder() /home/ 31// folder_name() john/ 32// basename() example 33// extension() .txt 34// 35// Basename may begin, end, and/or include periods, but no folder delimiters. 36// If extension exists, it consists of a period followed by zero or more 37// non-period/non-delimiter characters, and basename is non-empty. 38/////////////////////////////////////////////////////////////////////////////// 39 40class Pathname { 41public: 42 // Folder delimiters are slash and backslash 43 static bool IsFolderDelimiter(char ch); 44 static char DefaultFolderDelimiter(); 45 46 Pathname(); 47 Pathname(const std::string& pathname); 48 Pathname(const std::string& folder, const std::string& filename); 49 50 // Set's the default folder delimiter for this Pathname 51 char folder_delimiter() const { return folder_delimiter_; } 52 void SetFolderDelimiter(char delimiter); 53 54 // Normalize changes all folder delimiters to folder_delimiter() 55 void Normalize(); 56 57 // Reset to the empty pathname 58 void clear(); 59 60 // Returns true if the pathname is empty. Note: this->pathname().empty() 61 // is always false. 62 bool empty() const; 63 64 std::string url() const; 65 66 // Returns the folder and filename components. If the pathname is empty, 67 // returns a string representing the current directory (as a relative path, 68 // i.e., "."). 69 std::string pathname() const; 70 void SetPathname(const std::string& pathname); 71 void SetPathname(const std::string& folder, const std::string& filename); 72 73 // Append pathname to the current folder (if any). Any existing filename 74 // will be discarded. 75 void AppendPathname(const std::string& pathname); 76 77 std::string folder() const; 78 std::string folder_name() const; 79 std::string parent_folder() const; 80 // SetFolder and AppendFolder will append a folder delimiter, if needed. 81 void SetFolder(const std::string& folder); 82 void AppendFolder(const std::string& folder); 83 84 std::string basename() const; 85 bool SetBasename(const std::string& basename); 86 87 std::string extension() const; 88 // SetExtension will prefix a period, if needed. 89 bool SetExtension(const std::string& extension); 90 91 std::string filename() const; 92 bool SetFilename(const std::string& filename); 93 94#if defined(WEBRTC_WIN) 95 bool GetDrive(char *drive, uint32 bytes) const; 96 static bool GetDrive(char *drive, uint32 bytes,const std::string& pathname); 97#endif 98 99private: 100 std::string folder_, basename_, extension_; 101 char folder_delimiter_; 102}; 103 104/////////////////////////////////////////////////////////////////////////////// 105// Global Helpers (deprecated) 106/////////////////////////////////////////////////////////////////////////////// 107 108inline void SetOrganizationName(const std::string& organization) { 109 Filesystem::SetOrganizationName(organization); 110} 111inline void SetApplicationName(const std::string& application) { 112 Filesystem::SetApplicationName(application); 113} 114inline void GetOrganizationName(std::string* organization) { 115 Filesystem::GetOrganizationName(organization); 116} 117inline void GetApplicationName(std::string* application) { 118 Filesystem::GetApplicationName(application); 119} 120inline bool CreateFolder(const Pathname& path) { 121 return Filesystem::CreateFolder(path); 122} 123inline bool FinishPath(Pathname& path, bool create, const std::string& append) { 124 if (!append.empty()) 125 path.AppendFolder(append); 126 return !create || CreateFolder(path); 127} 128// Note: this method uses the convention of <temp>/<appname> for the temporary 129// folder. Filesystem uses <temp>/<exename>. We will be migrating exclusively 130// to <temp>/<orgname>/<appname> eventually. Since these are temp folders, 131// it's probably ok to orphan them during the transition. 132inline bool GetTemporaryFolder(Pathname& path, bool create, 133 const std::string& append) { 134 std::string application_name; 135 Filesystem::GetApplicationName(&application_name); 136 ASSERT(!application_name.empty()); 137 return Filesystem::GetTemporaryFolder(path, create, &application_name) 138 && FinishPath(path, create, append); 139} 140inline bool GetAppDataFolder(Pathname& path, bool create, 141 const std::string& append) { 142 ASSERT(!create); // TODO: Support create flag on Filesystem::GetAppDataFolder. 143 return Filesystem::GetAppDataFolder(&path, true) 144 && FinishPath(path, create, append); 145} 146inline bool CleanupTemporaryFolder() { 147 Pathname path; 148 if (!GetTemporaryFolder(path, false, "")) 149 return false; 150 if (Filesystem::IsAbsent(path)) 151 return true; 152 if (!Filesystem::IsTemporaryPath(path)) { 153 ASSERT(false); 154 return false; 155 } 156 return Filesystem::DeleteFolderContents(path); 157} 158 159/////////////////////////////////////////////////////////////////////////////// 160 161} // namespace rtc 162 163#endif // WEBRTC_BASE_PATHUTILS_H__ 164