OLD | NEW |
1 // Copyright (c) 2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2008 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/file_path.h" | 5 #include "base/file_path.h" |
| 6 #include "base/file_util.h" |
6 #include "base/logging.h" | 7 #include "base/logging.h" |
7 | 8 |
8 // These includes are just for the *Hack functions, and should be removed | 9 // These includes are just for the *Hack functions, and should be removed |
9 // when those functions are removed. | 10 // when those functions are removed. |
10 #include "base/string_piece.h" | 11 #include "base/string_piece.h" |
| 12 #include "base/string_util.h" |
11 #include "base/sys_string_conversions.h" | 13 #include "base/sys_string_conversions.h" |
12 | 14 |
13 #if defined(FILE_PATH_USES_WIN_SEPARATORS) | 15 #if defined(FILE_PATH_USES_WIN_SEPARATORS) |
14 const FilePath::CharType FilePath::kSeparators[] = FILE_PATH_LITERAL("\\/"); | 16 const FilePath::CharType FilePath::kSeparators[] = FILE_PATH_LITERAL("\\/"); |
15 #else // FILE_PATH_USES_WIN_SEPARATORS | 17 #else // FILE_PATH_USES_WIN_SEPARATORS |
16 const FilePath::CharType FilePath::kSeparators[] = FILE_PATH_LITERAL("/"); | 18 const FilePath::CharType FilePath::kSeparators[] = FILE_PATH_LITERAL("/"); |
17 #endif // FILE_PATH_USES_WIN_SEPARATORS | 19 #endif // FILE_PATH_USES_WIN_SEPARATORS |
18 | 20 |
19 const FilePath::CharType FilePath::kCurrentDirectory[] = FILE_PATH_LITERAL("."); | 21 const FilePath::CharType FilePath::kCurrentDirectory[] = FILE_PATH_LITERAL("."); |
20 const FilePath::CharType FilePath::kParentDirectory[] = FILE_PATH_LITERAL(".."); | 22 const FilePath::CharType FilePath::kParentDirectory[] = FILE_PATH_LITERAL(".."); |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
171 } | 173 } |
172 | 174 |
173 FilePath FilePath::Append(const FilePath& component) const { | 175 FilePath FilePath::Append(const FilePath& component) const { |
174 return Append(component.value()); | 176 return Append(component.value()); |
175 } | 177 } |
176 | 178 |
177 bool FilePath::IsAbsolute() const { | 179 bool FilePath::IsAbsolute() const { |
178 return IsPathAbsolute(path_); | 180 return IsPathAbsolute(path_); |
179 } | 181 } |
180 | 182 |
| 183 bool FilePath::Contains(const FilePath &other) const { |
| 184 FilePath parent = FilePath(*this); |
| 185 FilePath child = FilePath(other); |
| 186 |
| 187 if (!file_util::AbsolutePath(&parent) || !file_util::AbsolutePath(&child)) |
| 188 return false; |
| 189 |
| 190 #if defined(OS_WIN) |
| 191 // file_util::AbsolutePath() does not flatten case on Windows, so we must do |
| 192 // a case-insensitive compare. |
| 193 if (!StartsWith(child.value(), parent.value(), false)) |
| 194 #else |
| 195 if (!StartsWithASCII(child.value(), parent.value(), true)) |
| 196 #endif |
| 197 return false; |
| 198 |
| 199 // file_util::AbsolutePath() normalizes '/' to '\', so we only need to check |
| 200 // kSeparators[0]. |
| 201 if (child.value().length() <= parent.value().length() || |
| 202 child.value()[parent.value().length()] != kSeparators[0]) |
| 203 return false; |
| 204 |
| 205 return true; |
| 206 } |
| 207 |
181 #if defined(OS_POSIX) | 208 #if defined(OS_POSIX) |
182 // See file_path.h for a discussion of the encoding of paths on POSIX | 209 // See file_path.h for a discussion of the encoding of paths on POSIX |
183 // platforms. These *Hack() functions are not quite correct, but they're | 210 // platforms. These *Hack() functions are not quite correct, but they're |
184 // only temporary while we fix the remainder of the code. | 211 // only temporary while we fix the remainder of the code. |
185 // Remember to remove the #includes at the top when you remove these. | 212 // Remember to remove the #includes at the top when you remove these. |
186 | 213 |
187 // static | 214 // static |
188 FilePath FilePath::FromWStringHack(const std::wstring& wstring) { | 215 FilePath FilePath::FromWStringHack(const std::wstring& wstring) { |
189 return FilePath(base::SysWideToNativeMB(wstring)); | 216 return FilePath(base::SysWideToNativeMB(wstring)); |
190 } | 217 } |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
222 --pos) { | 249 --pos) { |
223 // If the string only has two separators and they're at the beginning, | 250 // If the string only has two separators and they're at the beginning, |
224 // don't strip them, unless the string began with more than two separators. | 251 // don't strip them, unless the string began with more than two separators. |
225 if (pos != start + 1 || last_stripped == start + 2 || | 252 if (pos != start + 1 || last_stripped == start + 2 || |
226 !IsSeparator(path_[start - 1])) { | 253 !IsSeparator(path_[start - 1])) { |
227 path_.resize(pos - 1); | 254 path_.resize(pos - 1); |
228 last_stripped = pos; | 255 last_stripped = pos; |
229 } | 256 } |
230 } | 257 } |
231 } | 258 } |
OLD | NEW |