• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 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 
SetOrganizationName(const std::string & organization)108 inline void SetOrganizationName(const std::string& organization) {
109   Filesystem::SetOrganizationName(organization);
110 }
SetApplicationName(const std::string & application)111 inline void SetApplicationName(const std::string& application) {
112   Filesystem::SetApplicationName(application);
113 }
GetOrganizationName(std::string * organization)114 inline void GetOrganizationName(std::string* organization) {
115   Filesystem::GetOrganizationName(organization);
116 }
GetApplicationName(std::string * application)117 inline void GetApplicationName(std::string* application) {
118   Filesystem::GetApplicationName(application);
119 }
CreateFolder(const Pathname & path)120 inline bool CreateFolder(const Pathname& path) {
121   return Filesystem::CreateFolder(path);
122 }
FinishPath(Pathname & path,bool create,const std::string & append)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.
GetTemporaryFolder(Pathname & path,bool create,const std::string & append)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 }
GetAppDataFolder(Pathname & path,bool create,const std::string & append)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 }
CleanupTemporaryFolder()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