/* * Copyright 2004 The WebRTC Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #ifndef RTC_BASE_PATHUTILS_H_ #define RTC_BASE_PATHUTILS_H_ #include #include "rtc_base/checks.h" namespace rtc { /////////////////////////////////////////////////////////////////////////////// // Pathname - parsing of pathnames into components, and vice versa. // // To establish consistent terminology, a filename never contains a folder // component. A folder never contains a filename. A pathname may include // a folder and/or filename component. Here are some examples: // // pathname() /home/john/example.txt // folder() /home/john/ // filename() example.txt // parent_folder() /home/ // folder_name() john/ // basename() example // extension() .txt // // Basename may begin, end, and/or include periods, but no folder delimiters. // If extension exists, it consists of a period followed by zero or more // non-period/non-delimiter characters, and basename is non-empty. /////////////////////////////////////////////////////////////////////////////// class Pathname { public: // Folder delimiters are slash and backslash static bool IsFolderDelimiter(char ch); static char DefaultFolderDelimiter(); Pathname(); Pathname(const Pathname&); Pathname(Pathname&&); Pathname(const std::string& pathname); Pathname(const std::string& folder, const std::string& filename); Pathname& operator=(const Pathname&); Pathname& operator=(Pathname&&); // Normalize changes all folder delimiters to folder_delimiter() void Normalize(); // Reset to the empty pathname void clear(); // Returns true if the pathname is empty. Note: this->pathname().empty() // is always false. bool empty() const; // Returns the folder and filename components. If the pathname is empty, // returns a string representing the current directory (as a relative path, // i.e., "."). std::string pathname() const; void SetPathname(const std::string& pathname); void SetPathname(const std::string& folder, const std::string& filename); std::string folder() const; std::string parent_folder() const; // SetFolder and AppendFolder will append a folder delimiter, if needed. void SetFolder(const std::string& folder); void AppendFolder(const std::string& folder); bool SetBasename(const std::string& basename); // SetExtension will prefix a period, if needed. bool SetExtension(const std::string& extension); std::string filename() const; bool SetFilename(const std::string& filename); private: std::string folder_, basename_, extension_; char folder_delimiter_; }; } // namespace rtc #endif // RTC_BASE_PATHUTILS_H_