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 18 namespace 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 40 class Pathname { 41 public: 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 99 private: 100 std::string folder_, basename_, extension_; 101 char folder_delimiter_; 102 }; 103 104 /////////////////////////////////////////////////////////////////////////////// 105 // Global Helpers (deprecated) 106 /////////////////////////////////////////////////////////////////////////////// 107 108 inline void SetOrganizationName(const std::string& organization) { 109 Filesystem::SetOrganizationName(organization); 110 } 111 inline void SetApplicationName(const std::string& application) { 112 Filesystem::SetApplicationName(application); 113 } 114 inline void GetOrganizationName(std::string* organization) { 115 Filesystem::GetOrganizationName(organization); 116 } 117 inline void GetApplicationName(std::string* application) { 118 Filesystem::GetApplicationName(application); 119 } 120 inline bool CreateFolder(const Pathname& path) { 121 return Filesystem::CreateFolder(path); 122 } 123 inline 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. 132 inline 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 } 140 inline 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 } 146 inline 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