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