Home | History | Annotate | Download | only in base
      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 
     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 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 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 
     99 private:
    100   std::string folder_, basename_, extension_;
    101   char folder_delimiter_;
    102 };
    103 
    104 ///////////////////////////////////////////////////////////////////////////////
    105 // Global Helpers (deprecated)
    106 ///////////////////////////////////////////////////////////////////////////////
    107 
    108 inline void SetOrganizationName(const std::string& organization) {
    109   Filesystem::SetOrganizationName(organization);
    110 }
    111 inline void SetApplicationName(const std::string& application) {
    112   Filesystem::SetApplicationName(application);
    113 }
    114 inline void GetOrganizationName(std::string* organization) {
    115   Filesystem::GetOrganizationName(organization);
    116 }
    117 inline void GetApplicationName(std::string* application) {
    118   Filesystem::GetApplicationName(application);
    119 }
    120 inline bool CreateFolder(const Pathname& path) {
    121   return Filesystem::CreateFolder(path);
    122 }
    123 inline 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.
    132 inline 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 }
    140 inline 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 }
    146 inline 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