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
folder_delimiter()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_t bytes) const;
96 static bool GetDrive(char* drive,
97 uint32_t bytes,
98 const std::string& pathname);
99 #endif
100
101 private:
102 std::string folder_, basename_, extension_;
103 char folder_delimiter_;
104 };
105
106 ///////////////////////////////////////////////////////////////////////////////
107 // Global Helpers (deprecated)
108 ///////////////////////////////////////////////////////////////////////////////
109
SetOrganizationName(const std::string & organization)110 inline void SetOrganizationName(const std::string& organization) {
111 Filesystem::SetOrganizationName(organization);
112 }
SetApplicationName(const std::string & application)113 inline void SetApplicationName(const std::string& application) {
114 Filesystem::SetApplicationName(application);
115 }
GetOrganizationName(std::string * organization)116 inline void GetOrganizationName(std::string* organization) {
117 Filesystem::GetOrganizationName(organization);
118 }
GetApplicationName(std::string * application)119 inline void GetApplicationName(std::string* application) {
120 Filesystem::GetApplicationName(application);
121 }
CreateFolder(const Pathname & path)122 inline bool CreateFolder(const Pathname& path) {
123 return Filesystem::CreateFolder(path);
124 }
FinishPath(Pathname & path,bool create,const std::string & append)125 inline bool FinishPath(Pathname& path, bool create, const std::string& append) {
126 if (!append.empty())
127 path.AppendFolder(append);
128 return !create || CreateFolder(path);
129 }
130 // Note: this method uses the convention of <temp>/<appname> for the temporary
131 // folder. Filesystem uses <temp>/<exename>. We will be migrating exclusively
132 // to <temp>/<orgname>/<appname> eventually. Since these are temp folders,
133 // it's probably ok to orphan them during the transition.
GetTemporaryFolder(Pathname & path,bool create,const std::string & append)134 inline bool GetTemporaryFolder(Pathname& path, bool create,
135 const std::string& append) {
136 std::string application_name;
137 Filesystem::GetApplicationName(&application_name);
138 ASSERT(!application_name.empty());
139 return Filesystem::GetTemporaryFolder(path, create, &application_name)
140 && FinishPath(path, create, append);
141 }
GetAppDataFolder(Pathname & path,bool create,const std::string & append)142 inline bool GetAppDataFolder(Pathname& path, bool create,
143 const std::string& append) {
144 ASSERT(!create); // TODO: Support create flag on Filesystem::GetAppDataFolder.
145 return Filesystem::GetAppDataFolder(&path, true)
146 && FinishPath(path, create, append);
147 }
CleanupTemporaryFolder()148 inline bool CleanupTemporaryFolder() {
149 Pathname path;
150 if (!GetTemporaryFolder(path, false, ""))
151 return false;
152 if (Filesystem::IsAbsent(path))
153 return true;
154 if (!Filesystem::IsTemporaryPath(path)) {
155 ASSERT(false);
156 return false;
157 }
158 return Filesystem::DeleteFolderContents(path);
159 }
160
161 ///////////////////////////////////////////////////////////////////////////////
162
163 } // namespace rtc
164
165 #endif // WEBRTC_BASE_PATHUTILS_H__
166