Home | History | Annotate | Download | only in base
      1 /*
      2  * libjingle
      3  * Copyright 2004--2005, Google Inc.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions are met:
      7  *
      8  *  1. Redistributions of source code must retain the above copyright notice,
      9  *     this list of conditions and the following disclaimer.
     10  *  2. Redistributions in binary form must reproduce the above copyright notice,
     11  *     this list of conditions and the following disclaimer in the documentation
     12  *     and/or other materials provided with the distribution.
     13  *  3. The name of the author may not be used to endorse or promote products
     14  *     derived from this software without specific prior written permission.
     15  *
     16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
     17  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     18  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
     19  * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     20  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     21  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
     22  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     23  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
     24  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
     25  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     26  */
     27 
     28 #ifndef TALK_BASE_PATHUTILS_H__
     29 #define TALK_BASE_PATHUTILS_H__
     30 
     31 #include <string>
     32 // Temporary, until deprecated helpers are removed.
     33 #include "talk/base/fileutils.h"
     34 
     35 namespace talk_base {
     36 
     37 ///////////////////////////////////////////////////////////////////////////////
     38 // Pathname - parsing of pathnames into components, and vice versa.
     39 //
     40 // To establish consistent terminology, a filename never contains a folder
     41 // component.  A folder never contains a filename.  A pathname may include
     42 // a folder and/or filename component.  Here are some examples:
     43 //
     44 //   pathname()      /home/john/example.txt
     45 //   folder()        /home/john/
     46 //   filename()                 example.txt
     47 //   parent_folder() /home/
     48 //   folder_name()         john/
     49 //   basename()                 example
     50 //   extension()                       .txt
     51 //
     52 // Basename may begin, end, and/or include periods, but no folder delimiters.
     53 // If extension exists, it consists of a period followed by zero or more
     54 // non-period/non-delimiter characters, and basename is non-empty.
     55 ///////////////////////////////////////////////////////////////////////////////
     56 
     57 class Pathname {
     58 public:
     59   // Folder delimiters are slash and backslash
     60   static bool IsFolderDelimiter(char ch);
     61   static char DefaultFolderDelimiter();
     62 
     63   Pathname();
     64   Pathname(const std::string& pathname);
     65   Pathname(const std::string& folder, const std::string& filename);
     66 
     67   // Set's the default folder delimiter for this Pathname
     68   char folder_delimiter() const { return folder_delimiter_; }
     69   void SetFolderDelimiter(char delimiter);
     70 
     71   // Normalize changes all folder delimiters to folder_delimiter()
     72   void Normalize();
     73 
     74   // Reset to the empty pathname
     75   void clear();
     76 
     77   // Returns true if the pathname is empty.  Note: this->pathname().empty()
     78   // is always false.
     79   bool empty() const;
     80 
     81   std::string url() const;
     82 
     83   // Returns the folder and filename components.  If the pathname is empty,
     84   // returns a string representing the current directory (as a relative path,
     85   // i.e., ".").
     86   std::string pathname() const;
     87   void SetPathname(const std::string& pathname);
     88   void SetPathname(const std::string& folder, const std::string& filename);
     89 
     90   // Append pathname to the current folder (if any).  Any existing filename
     91   // will be discarded.
     92   void AppendPathname(const std::string& pathname);
     93 
     94   std::string folder() const;
     95   std::string folder_name() const;
     96   std::string parent_folder() const;
     97   // SetFolder and AppendFolder will append a folder delimiter, if needed.
     98   void SetFolder(const std::string& folder);
     99   void AppendFolder(const std::string& folder);
    100 
    101   std::string basename() const;
    102   bool SetBasename(const std::string& basename);
    103 
    104   std::string extension() const;
    105   // SetExtension will prefix a period, if needed.
    106   bool SetExtension(const std::string& extension);
    107 
    108   std::string filename() const;
    109   bool SetFilename(const std::string& filename);
    110 
    111 #ifdef WIN32
    112   bool GetDrive(char *drive, uint32 bytes) const;
    113   static bool GetDrive(char *drive, uint32 bytes,const std::string& pathname);
    114 #endif
    115 
    116 private:
    117   std::string folder_, basename_, extension_;
    118   char folder_delimiter_;
    119 };
    120 
    121 ///////////////////////////////////////////////////////////////////////////////
    122 // Global Helpers (deprecated)
    123 ///////////////////////////////////////////////////////////////////////////////
    124 
    125 inline void SetOrganizationName(const std::string& organization) {
    126   Filesystem::SetOrganizationName(organization);
    127 }
    128 inline void SetApplicationName(const std::string& application) {
    129   Filesystem::SetApplicationName(application);
    130 }
    131 inline void GetOrganizationName(std::string* organization) {
    132   Filesystem::GetOrganizationName(organization);
    133 }
    134 inline void GetApplicationName(std::string* application) {
    135   Filesystem::GetApplicationName(application);
    136 }
    137 inline bool CreateFolder(const Pathname& path) {
    138   return Filesystem::CreateFolder(path);
    139 }
    140 inline bool FinishPath(Pathname& path, bool create, const std::string& append) {
    141   if (!append.empty())
    142     path.AppendFolder(append);
    143   return !create || CreateFolder(path);
    144 }
    145 // Note: this method uses the convention of <temp>/<appname> for the temporary
    146 // folder.  Filesystem uses <temp>/<exename>.  We will be migrating exclusively
    147 // to <temp>/<orgname>/<appname> eventually.  Since these are temp folders,
    148 // it's probably ok to orphan them during the transition.
    149 inline bool GetTemporaryFolder(Pathname& path, bool create,
    150                                const std::string& append) {
    151   std::string application_name;
    152   Filesystem::GetApplicationName(&application_name);
    153   ASSERT(!application_name.empty());
    154   return Filesystem::GetTemporaryFolder(path, create, &application_name)
    155          && FinishPath(path, create, append);
    156 }
    157 inline bool GetAppDataFolder(Pathname& path, bool create,
    158                              const std::string& append) {
    159   ASSERT(!create); // TODO: Support create flag on Filesystem::GetAppDataFolder.
    160   return Filesystem::GetAppDataFolder(&path, true)
    161          && FinishPath(path, create, append);
    162 }
    163 inline bool CleanupTemporaryFolder() {
    164   Pathname path;
    165   if (!GetTemporaryFolder(path, false, ""))
    166     return false;
    167   if (Filesystem::IsAbsent(path))
    168     return true;
    169   if (!Filesystem::IsTemporaryPath(path)) {
    170     ASSERT(false);
    171     return false;
    172   }
    173   return Filesystem::DeleteFolderContents(path);
    174 }
    175 
    176 ///////////////////////////////////////////////////////////////////////////////
    177 
    178 }  // namespace talk_base
    179 
    180 #endif // TALK_BASE_PATHUTILS_H__
    181