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