1f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch/* 2f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * libjingle 3f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * Copyright 2004--2005, Google Inc. 4f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 5f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * Redistribution and use in source and binary forms, with or without 6f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * modification, are permitted provided that the following conditions are met: 7f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 8f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 1. Redistributions of source code must retain the above copyright notice, 9f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * this list of conditions and the following disclaimer. 10f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 2. Redistributions in binary form must reproduce the above copyright notice, 11f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * this list of conditions and the following disclaimer in the documentation 12f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * and/or other materials provided with the distribution. 13f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 3. The name of the author may not be used to endorse or promote products 14f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * derived from this software without specific prior written permission. 15f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 16f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 17f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 19f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 21f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 22f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 23f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 24f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 25f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch */ 27f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 28f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#ifdef WIN32 29f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/base/win32.h" 30f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <shellapi.h> 31f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <shlobj.h> 32f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <tchar.h> 33f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#endif // WIN32 34f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 35f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/base/common.h" 36f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/base/fileutils.h" 37f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/base/logging.h" 38f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/base/pathutils.h" 39f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/base/stringutils.h" 40f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/base/urlencode.h" 41f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 42f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochnamespace talk_base { 43f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 44f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochstd::string const EMPTY_STR = ""; 45f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 46f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// EXT_DELIM separates a file basename from extension 47f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochconst char EXT_DELIM = '.'; 48f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 49f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// FOLDER_DELIMS separate folder segments and the filename 50f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochconst char* const FOLDER_DELIMS = "/\\"; 51f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 52f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// DEFAULT_FOLDER_DELIM is the preferred delimiter for this platform 53f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#if WIN32 54f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochconst char DEFAULT_FOLDER_DELIM = '\\'; 55f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#else // !WIN32 56f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochconst char DEFAULT_FOLDER_DELIM = '/'; 57f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#endif // !WIN32 58f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 59f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch/////////////////////////////////////////////////////////////////////////////// 60f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// Pathname - parsing of pathnames into components, and vice versa 61f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch/////////////////////////////////////////////////////////////////////////////// 62f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 63f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochbool Pathname::IsFolderDelimiter(char ch) { 64f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return (NULL != ::strchr(FOLDER_DELIMS, ch)); 65f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 66f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 67f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochchar Pathname::DefaultFolderDelimiter() { 68f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return DEFAULT_FOLDER_DELIM; 69f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 70f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 71f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen MurdochPathname::Pathname() 72f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch : folder_delimiter_(DEFAULT_FOLDER_DELIM) { 73f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 74f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 75f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen MurdochPathname::Pathname(const std::string& pathname) 76f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch : folder_delimiter_(DEFAULT_FOLDER_DELIM) { 77f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch SetPathname(pathname); 78f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 79f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 80f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen MurdochPathname::Pathname(const std::string& folder, const std::string& filename) 81f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch : folder_delimiter_(DEFAULT_FOLDER_DELIM) { 82f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch SetPathname(folder, filename); 83f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 84f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 85f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochvoid Pathname::SetFolderDelimiter(char delimiter) { 86f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch ASSERT(IsFolderDelimiter(delimiter)); 87f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch folder_delimiter_ = delimiter; 88f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 89f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 90f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochvoid Pathname::Normalize() { 91f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch for (size_t i=0; i<folder_.length(); ++i) { 92f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (IsFolderDelimiter(folder_[i])) { 93f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch folder_[i] = folder_delimiter_; 94f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 95f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 96f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 97f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 98f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochvoid Pathname::clear() { 99f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch folder_.clear(); 100f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch basename_.clear(); 101f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch extension_.clear(); 102f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 103f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 104f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochbool Pathname::empty() const { 105f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return folder_.empty() && basename_.empty() && extension_.empty(); 106f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 107f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 108f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochstd::string Pathname::pathname() const { 109f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::string pathname(folder_); 110f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch pathname.append(basename_); 111f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch pathname.append(extension_); 112f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (pathname.empty()) { 113f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Instead of the empty pathname, return the current working directory. 114f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch pathname.push_back('.'); 115f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch pathname.push_back(folder_delimiter_); 116f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 117f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return pathname; 118f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 119f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 120f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochstd::string Pathname::url() const { 121f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::string s = "file:///"; 122f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch for (size_t i=0; i<folder_.length(); ++i) { 123f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (IsFolderDelimiter(folder_[i])) 124f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch s += '/'; 125f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch else 126f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch s += folder_[i]; 127f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 128f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch s += basename_; 129f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch s += extension_; 130f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return UrlEncodeStringForOnlyUnsafeChars(s); 131f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 132f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 133f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochvoid Pathname::SetPathname(const std::string& pathname) { 134f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::string::size_type pos = pathname.find_last_of(FOLDER_DELIMS); 135f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (pos != std::string::npos) { 136f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch SetFolder(pathname.substr(0, pos + 1)); 137f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch SetFilename(pathname.substr(pos + 1)); 138f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } else { 139f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch SetFolder(EMPTY_STR); 140f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch SetFilename(pathname); 141f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 142f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 143f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 144f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochvoid Pathname::SetPathname(const std::string& folder, 145f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const std::string& filename) { 146f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch SetFolder(folder); 147f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch SetFilename(filename); 148f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 149f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 150f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochvoid Pathname::AppendPathname(const std::string& pathname) { 151f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::string full_pathname(folder_); 152f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch full_pathname.append(pathname); 153f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch SetPathname(full_pathname); 154f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 155f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 156f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochstd::string Pathname::folder() const { 157f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return folder_; 158f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 159f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 160f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochstd::string Pathname::folder_name() const { 161f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::string::size_type pos = std::string::npos; 162f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (folder_.size() >= 2) { 163f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch pos = folder_.find_last_of(FOLDER_DELIMS, folder_.length() - 2); 164f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 165f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (pos != std::string::npos) { 166f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return folder_.substr(pos + 1); 167f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } else { 168f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return folder_; 169f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 170f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 171f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 172f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochstd::string Pathname::parent_folder() const { 173f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::string::size_type pos = std::string::npos; 174f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (folder_.size() >= 2) { 175f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch pos = folder_.find_last_of(FOLDER_DELIMS, folder_.length() - 2); 176f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 177f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (pos != std::string::npos) { 178f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return folder_.substr(0, pos + 1); 179f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } else { 180f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return EMPTY_STR; 181f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 182f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 183f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 184f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochvoid Pathname::SetFolder(const std::string& folder) { 185f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch folder_.assign(folder); 186f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Ensure folder ends in a path delimiter 187f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (!folder_.empty() && !IsFolderDelimiter(folder_[folder_.length()-1])) { 188f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch folder_.push_back(folder_delimiter_); 189f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 190f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 191f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 192f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochvoid Pathname::AppendFolder(const std::string& folder) { 193f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch folder_.append(folder); 194f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Ensure folder ends in a path delimiter 195f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (!folder_.empty() && !IsFolderDelimiter(folder_[folder_.length()-1])) { 196f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch folder_.push_back(folder_delimiter_); 197f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 198f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 199f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 200f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochstd::string Pathname::basename() const { 201f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return basename_; 202f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 203f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 204f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochbool Pathname::SetBasename(const std::string& basename) { 205f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if(basename.find_first_of(FOLDER_DELIMS) != std::string::npos) { 206f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return false; 207f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 208f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch basename_.assign(basename); 209f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return true; 210f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 211f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 212f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochstd::string Pathname::extension() const { 213f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return extension_; 214f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 215f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 216f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochbool Pathname::SetExtension(const std::string& extension) { 217f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (extension.find_first_of(FOLDER_DELIMS) != std::string::npos || 218f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch extension.find_first_of(EXT_DELIM, 1) != std::string::npos) { 219f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return false; 220f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 221f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch extension_.assign(extension); 222f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Ensure extension begins with the extension delimiter 223f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (!extension_.empty() && (extension_[0] != EXT_DELIM)) { 224f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch extension_.insert(extension_.begin(), EXT_DELIM); 225f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 226f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return true; 227f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 228f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 229f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochstd::string Pathname::filename() const { 230f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::string filename(basename_); 231f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch filename.append(extension_); 232f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return filename; 233f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 234f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 235f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochbool Pathname::SetFilename(const std::string& filename) { 236f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::string::size_type pos = filename.rfind(EXT_DELIM); 237f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if ((pos == std::string::npos) || (pos == 0)) { 238f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return SetExtension(EMPTY_STR) && SetBasename(filename); 239f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } else { 240f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return SetExtension(filename.substr(pos)) && SetBasename(filename.substr(0, pos)); 241f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 242f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 243f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 244f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#ifdef WIN32 245f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochbool Pathname::GetDrive(char *drive, uint32 bytes) const { 246f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return GetDrive(drive, bytes, folder_); 247f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 248f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 249f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// static 250f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochbool Pathname::GetDrive(char *drive, uint32 bytes, 251f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const std::string& pathname) { 252f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // need at lease 4 bytes to save c: 253f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (bytes < 4 || pathname.size() < 3) { 254f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return false; 255f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 256f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 257f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch memcpy(drive, pathname.c_str(), 3); 258f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch drive[3] = 0; 259f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // sanity checking 260f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return (isalpha(drive[0]) && 261f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch drive[1] == ':' && 262f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch drive[2] == '\\'); 263f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 264f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#endif 265f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 266f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch/////////////////////////////////////////////////////////////////////////////// 267f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 268f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} // namespace talk_base 269