1f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org/*
2f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
3f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *
4f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  Use of this source code is governed by a BSD-style license
5f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  that can be found in the LICENSE file in the root of the source
6f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  tree. An additional intellectual property rights grant can be found
7f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  in the file PATENTS.  All contributing project authors may
8f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org */
10f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
11f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#if defined(WEBRTC_WIN)
12f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/win32.h"
13f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include <shellapi.h>
14f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include <shlobj.h>
15f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include <tchar.h>
16f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif  // WEBRTC_WIN
17f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
18f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/common.h"
19f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/fileutils.h"
20f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/logging.h"
21f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/pathutils.h"
22f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/stringutils.h"
23f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/urlencode.h"
24f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
25f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgnamespace rtc {
26f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
27f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgstatic const char EMPTY_STR[] = "";
28f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
29f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// EXT_DELIM separates a file basename from extension
30f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgconst char EXT_DELIM = '.';
31f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
32f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// FOLDER_DELIMS separate folder segments and the filename
33f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgconst char* const FOLDER_DELIMS = "/\\";
34f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
35f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// DEFAULT_FOLDER_DELIM is the preferred delimiter for this platform
36f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#if WEBRTC_WIN
37f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgconst char DEFAULT_FOLDER_DELIM = '\\';
38f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#else  // !WEBRTC_WIN
39f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgconst char DEFAULT_FOLDER_DELIM = '/';
40f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif  // !WEBRTC_WIN
41f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
42f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org///////////////////////////////////////////////////////////////////////////////
43f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Pathname - parsing of pathnames into components, and vice versa
44f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org///////////////////////////////////////////////////////////////////////////////
45f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
46f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool Pathname::IsFolderDelimiter(char ch) {
47f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return (NULL != ::strchr(FOLDER_DELIMS, ch));
48f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
49f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
50f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgchar Pathname::DefaultFolderDelimiter() {
51f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return DEFAULT_FOLDER_DELIM;
52f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
53f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
54f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgPathname::Pathname()
55f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    : folder_delimiter_(DEFAULT_FOLDER_DELIM) {
56f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
57f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
58f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgPathname::Pathname(const std::string& pathname)
59f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    : folder_delimiter_(DEFAULT_FOLDER_DELIM) {
60f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SetPathname(pathname);
61f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
62f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
63f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgPathname::Pathname(const std::string& folder, const std::string& filename)
64f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    : folder_delimiter_(DEFAULT_FOLDER_DELIM) {
65f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SetPathname(folder, filename);
66f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
67f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
68f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgvoid Pathname::SetFolderDelimiter(char delimiter) {
69f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  ASSERT(IsFolderDelimiter(delimiter));
70f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  folder_delimiter_ = delimiter;
71f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
72f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
73f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgvoid Pathname::Normalize() {
74f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  for (size_t i=0; i<folder_.length(); ++i) {
75f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    if (IsFolderDelimiter(folder_[i])) {
76f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      folder_[i] = folder_delimiter_;
77f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    }
78f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
79f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
80f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
81f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgvoid Pathname::clear() {
82f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  folder_.clear();
83f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  basename_.clear();
84f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  extension_.clear();
85f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
86f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
87f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool Pathname::empty() const {
88f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return folder_.empty() && basename_.empty() && extension_.empty();
89f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
90f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
91f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgstd::string Pathname::pathname() const {
92f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  std::string pathname(folder_);
93f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  pathname.append(basename_);
94f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  pathname.append(extension_);
95f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (pathname.empty()) {
96f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    // Instead of the empty pathname, return the current working directory.
97f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    pathname.push_back('.');
98f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    pathname.push_back(folder_delimiter_);
99f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
100f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return pathname;
101f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
102f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
103f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgstd::string Pathname::url() const {
104f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  std::string s = "file:///";
105f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  for (size_t i=0; i<folder_.length(); ++i) {
106f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    if (IsFolderDelimiter(folder_[i]))
107f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      s += '/';
108f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    else
109f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      s += folder_[i];
110f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
111f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  s += basename_;
112f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  s += extension_;
113f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return UrlEncodeStringForOnlyUnsafeChars(s);
114f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
115f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
116f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgvoid Pathname::SetPathname(const std::string& pathname) {
117f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  std::string::size_type pos = pathname.find_last_of(FOLDER_DELIMS);
118f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (pos != std::string::npos) {
119f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    SetFolder(pathname.substr(0, pos + 1));
120f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    SetFilename(pathname.substr(pos + 1));
121f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  } else {
122f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    SetFolder(EMPTY_STR);
123f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    SetFilename(pathname);
124f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
125f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
126f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
127f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgvoid Pathname::SetPathname(const std::string& folder,
128f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                           const std::string& filename) {
129f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SetFolder(folder);
130f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SetFilename(filename);
131f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
132f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
133f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgvoid Pathname::AppendPathname(const std::string& pathname) {
134f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  std::string full_pathname(folder_);
135f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  full_pathname.append(pathname);
136f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SetPathname(full_pathname);
137f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
138f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
139f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgstd::string Pathname::folder() const {
140f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return folder_;
141f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
142f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
143f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgstd::string Pathname::folder_name() const {
144f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  std::string::size_type pos = std::string::npos;
145f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (folder_.size() >= 2) {
146f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    pos = folder_.find_last_of(FOLDER_DELIMS, folder_.length() - 2);
147f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
148f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (pos != std::string::npos) {
149f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return folder_.substr(pos + 1);
150f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  } else {
151f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return folder_;
152f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
153f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
154f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
155f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgstd::string Pathname::parent_folder() const {
156f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  std::string::size_type pos = std::string::npos;
157f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (folder_.size() >= 2) {
158f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    pos = folder_.find_last_of(FOLDER_DELIMS, folder_.length() - 2);
159f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
160f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (pos != std::string::npos) {
161f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return folder_.substr(0, pos + 1);
162f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  } else {
163f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return EMPTY_STR;
164f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
165f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
166f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
167f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgvoid Pathname::SetFolder(const std::string& folder) {
168f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  folder_.assign(folder);
169f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // Ensure folder ends in a path delimiter
170f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (!folder_.empty() && !IsFolderDelimiter(folder_[folder_.length()-1])) {
171f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    folder_.push_back(folder_delimiter_);
172f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
173f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
174f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
175f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgvoid Pathname::AppendFolder(const std::string& folder) {
176f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  folder_.append(folder);
177f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // Ensure folder ends in a path delimiter
178f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (!folder_.empty() && !IsFolderDelimiter(folder_[folder_.length()-1])) {
179f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    folder_.push_back(folder_delimiter_);
180f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
181f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
182f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
183f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgstd::string Pathname::basename() const {
184f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return basename_;
185f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
186f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
187f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool Pathname::SetBasename(const std::string& basename) {
188f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if(basename.find_first_of(FOLDER_DELIMS) != std::string::npos) {
189f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return false;
190f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
191f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  basename_.assign(basename);
192f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return true;
193f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
194f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
195f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgstd::string Pathname::extension() const {
196f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return extension_;
197f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
198f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
199f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool Pathname::SetExtension(const std::string& extension) {
200f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (extension.find_first_of(FOLDER_DELIMS) != std::string::npos ||
201f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    extension.find_first_of(EXT_DELIM, 1) != std::string::npos) {
202f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      return false;
203f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
204f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  extension_.assign(extension);
205f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // Ensure extension begins with the extension delimiter
206f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (!extension_.empty() && (extension_[0] != EXT_DELIM)) {
207f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    extension_.insert(extension_.begin(), EXT_DELIM);
208f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
209f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return true;
210f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
211f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
212f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgstd::string Pathname::filename() const {
213f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  std::string filename(basename_);
214f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  filename.append(extension_);
215f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return filename;
216f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
217f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
218f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool Pathname::SetFilename(const std::string& filename) {
219f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  std::string::size_type pos = filename.rfind(EXT_DELIM);
220f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if ((pos == std::string::npos) || (pos == 0)) {
221f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return SetExtension(EMPTY_STR) && SetBasename(filename);
222f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  } else {
223f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return SetExtension(filename.substr(pos)) && SetBasename(filename.substr(0, pos));
224f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
225f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
226f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
227f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#if defined(WEBRTC_WIN)
2280c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströmbool Pathname::GetDrive(char* drive, uint32_t bytes) const {
229f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return GetDrive(drive, bytes, folder_);
230f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
231f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
232f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// static
2330c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströmbool Pathname::GetDrive(char* drive,
2340c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström                        uint32_t bytes,
235f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                        const std::string& pathname) {
236f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // need at lease 4 bytes to save c:
237f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (bytes < 4 || pathname.size() < 3) {
238f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return false;
239f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
240f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
241f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  memcpy(drive, pathname.c_str(), 3);
242f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  drive[3] = 0;
243f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // sanity checking
244f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return (isalpha(drive[0]) &&
245f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          drive[1] == ':' &&
246f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          drive[2] == '\\');
247f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
248f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif
249f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
250f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org///////////////////////////////////////////////////////////////////////////////
251f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
252f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} // namespace rtc
253