Line data Source code
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 :
16 : #include "webrtc/base/checks.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 0 : 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 Pathname&);
48 : Pathname(Pathname&&);
49 : Pathname(const std::string& pathname);
50 : Pathname(const std::string& folder, const std::string& filename);
51 :
52 : Pathname& operator=(const Pathname&);
53 : Pathname& operator=(Pathname&&);
54 :
55 : // Set's the default folder delimiter for this Pathname
56 : char folder_delimiter() const { return folder_delimiter_; }
57 : void SetFolderDelimiter(char delimiter);
58 :
59 : // Normalize changes all folder delimiters to folder_delimiter()
60 : void Normalize();
61 :
62 : // Reset to the empty pathname
63 : void clear();
64 :
65 : // Returns true if the pathname is empty. Note: this->pathname().empty()
66 : // is always false.
67 : bool empty() const;
68 :
69 : // Returns the folder and filename components. If the pathname is empty,
70 : // returns a string representing the current directory (as a relative path,
71 : // i.e., ".").
72 : std::string pathname() const;
73 : void SetPathname(const std::string& pathname);
74 : void SetPathname(const std::string& folder, const std::string& filename);
75 :
76 : // Append pathname to the current folder (if any). Any existing filename
77 : // will be discarded.
78 : void AppendPathname(const std::string& pathname);
79 :
80 : std::string folder() const;
81 : std::string folder_name() const;
82 : std::string parent_folder() const;
83 : // SetFolder and AppendFolder will append a folder delimiter, if needed.
84 : void SetFolder(const std::string& folder);
85 : void AppendFolder(const std::string& folder);
86 :
87 : std::string basename() const;
88 : bool SetBasename(const std::string& basename);
89 :
90 : std::string extension() const;
91 : // SetExtension will prefix a period, if needed.
92 : bool SetExtension(const std::string& extension);
93 :
94 : std::string filename() const;
95 : bool SetFilename(const std::string& filename);
96 :
97 : #if defined(WEBRTC_WIN)
98 : bool GetDrive(char* drive, uint32_t bytes) const;
99 : static bool GetDrive(char* drive,
100 : uint32_t bytes,
101 : const std::string& pathname);
102 : #endif
103 :
104 : private:
105 : std::string folder_, basename_, extension_;
106 : char folder_delimiter_;
107 : };
108 :
109 : } // namespace rtc
110 :
111 : #endif // WEBRTC_BASE_PATHUTILS_H__
|