147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/* 247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Copyright 2004 The WebRTC Project Authors. All rights reserved. 347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * 447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Use of this source code is governed by a BSD-style license 547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * that can be found in the LICENSE file in the root of the source 647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * tree. An additional intellectual property rights grant can be found 747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * in the file PATENTS. All contributing project authors may 847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * be found in the AUTHORS file in the root of the source tree. 947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org */ 1047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifndef WEBRTC_BASE_PATHUTILS_H__ 1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define WEBRTC_BASE_PATHUTILS_H__ 1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <string> 1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Temporary, until deprecated helpers are removed. 1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/fileutils.h" 1747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgnamespace rtc { 1947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/////////////////////////////////////////////////////////////////////////////// 2147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Pathname - parsing of pathnames into components, and vice versa. 2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// 2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// To establish consistent terminology, a filename never contains a folder 2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// component. A folder never contains a filename. A pathname may include 2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// a folder and/or filename component. Here are some examples: 2647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// 2747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// pathname() /home/john/example.txt 2847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// folder() /home/john/ 2947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// filename() example.txt 3047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// parent_folder() /home/ 3147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// folder_name() john/ 3247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// basename() example 3347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// extension() .txt 3447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// 3547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Basename may begin, end, and/or include periods, but no folder delimiters. 3647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// If extension exists, it consists of a period followed by zero or more 3747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// non-period/non-delimiter characters, and basename is non-empty. 3847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/////////////////////////////////////////////////////////////////////////////// 3947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 4047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass Pathname { 4147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgpublic: 4247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Folder delimiters are slash and backslash 4347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static bool IsFolderDelimiter(char ch); 4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static char DefaultFolderDelimiter(); 4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Pathname(); 4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Pathname(const std::string& pathname); 4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Pathname(const std::string& folder, const std::string& filename); 4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Set's the default folder delimiter for this Pathname 5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org char folder_delimiter() const { return folder_delimiter_; } 5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void SetFolderDelimiter(char delimiter); 5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Normalize changes all folder delimiters to folder_delimiter() 5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void Normalize(); 5647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Reset to the empty pathname 5847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void clear(); 5947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 6047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Returns true if the pathname is empty. Note: this->pathname().empty() 6147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // is always false. 6247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool empty() const; 6347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 6447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org std::string url() const; 6547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 6647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Returns the folder and filename components. If the pathname is empty, 6747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // returns a string representing the current directory (as a relative path, 6847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // i.e., "."). 6947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org std::string pathname() const; 7047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void SetPathname(const std::string& pathname); 7147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void SetPathname(const std::string& folder, const std::string& filename); 7247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Append pathname to the current folder (if any). Any existing filename 7447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // will be discarded. 7547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void AppendPathname(const std::string& pathname); 7647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org std::string folder() const; 7847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org std::string folder_name() const; 7947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org std::string parent_folder() const; 8047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // SetFolder and AppendFolder will append a folder delimiter, if needed. 8147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void SetFolder(const std::string& folder); 8247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void AppendFolder(const std::string& folder); 8347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 8447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org std::string basename() const; 8547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool SetBasename(const std::string& basename); 8647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 8747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org std::string extension() const; 8847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // SetExtension will prefix a period, if needed. 8947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool SetExtension(const std::string& extension); 9047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 9147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org std::string filename() const; 9247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool SetFilename(const std::string& filename); 9347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 9447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_WIN) 9547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool GetDrive(char *drive, uint32 bytes) const; 9647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static bool GetDrive(char *drive, uint32 bytes,const std::string& pathname); 9747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 9847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 9947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgprivate: 10047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org std::string folder_, basename_, extension_; 10147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org char folder_delimiter_; 10247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 10347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 10447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/////////////////////////////////////////////////////////////////////////////// 10547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Global Helpers (deprecated) 10647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/////////////////////////////////////////////////////////////////////////////// 10747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 10847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orginline void SetOrganizationName(const std::string& organization) { 10947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Filesystem::SetOrganizationName(organization); 11047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 11147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orginline void SetApplicationName(const std::string& application) { 11247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Filesystem::SetApplicationName(application); 11347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 11447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orginline void GetOrganizationName(std::string* organization) { 11547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Filesystem::GetOrganizationName(organization); 11647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 11747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orginline void GetApplicationName(std::string* application) { 11847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Filesystem::GetApplicationName(application); 11947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 12047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orginline bool CreateFolder(const Pathname& path) { 12147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return Filesystem::CreateFolder(path); 12247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 12347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orginline bool FinishPath(Pathname& path, bool create, const std::string& append) { 12447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (!append.empty()) 12547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org path.AppendFolder(append); 12647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return !create || CreateFolder(path); 12747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 12847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Note: this method uses the convention of <temp>/<appname> for the temporary 12947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// folder. Filesystem uses <temp>/<exename>. We will be migrating exclusively 13047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// to <temp>/<orgname>/<appname> eventually. Since these are temp folders, 13147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// it's probably ok to orphan them during the transition. 13247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orginline bool GetTemporaryFolder(Pathname& path, bool create, 13347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org const std::string& append) { 13447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org std::string application_name; 13547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Filesystem::GetApplicationName(&application_name); 13647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ASSERT(!application_name.empty()); 13747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return Filesystem::GetTemporaryFolder(path, create, &application_name) 13847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org && FinishPath(path, create, append); 13947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 14047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orginline bool GetAppDataFolder(Pathname& path, bool create, 14147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org const std::string& append) { 14247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ASSERT(!create); // TODO: Support create flag on Filesystem::GetAppDataFolder. 14347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return Filesystem::GetAppDataFolder(&path, true) 14447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org && FinishPath(path, create, append); 14547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 14647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orginline bool CleanupTemporaryFolder() { 14747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Pathname path; 14847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (!GetTemporaryFolder(path, false, "")) 14947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return false; 15047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (Filesystem::IsAbsent(path)) 15147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return true; 15247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (!Filesystem::IsTemporaryPath(path)) { 15347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ASSERT(false); 15447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return false; 15547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 15647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return Filesystem::DeleteFolderContents(path); 15747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 15847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 15947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/////////////////////////////////////////////////////////////////////////////// 16047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 16147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} // namespace rtc 16247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 16347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif // WEBRTC_BASE_PATHUTILS_H__ 164