Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 | 6 |
| 7 #include <string.h> | 7 #include <string.h> |
| 8 #include <algorithm> | 8 #include <algorithm> |
| 9 | 9 |
| 10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 33 const FilePath::CharType FilePath::kSeparators[] = FILE_PATH_LITERAL("\\/"); | 33 const FilePath::CharType FilePath::kSeparators[] = FILE_PATH_LITERAL("\\/"); |
| 34 #else // FILE_PATH_USES_WIN_SEPARATORS | 34 #else // FILE_PATH_USES_WIN_SEPARATORS |
| 35 const FilePath::CharType FilePath::kSeparators[] = FILE_PATH_LITERAL("/"); | 35 const FilePath::CharType FilePath::kSeparators[] = FILE_PATH_LITERAL("/"); |
| 36 #endif // FILE_PATH_USES_WIN_SEPARATORS | 36 #endif // FILE_PATH_USES_WIN_SEPARATORS |
| 37 | 37 |
| 38 const FilePath::CharType FilePath::kCurrentDirectory[] = FILE_PATH_LITERAL("."); | 38 const FilePath::CharType FilePath::kCurrentDirectory[] = FILE_PATH_LITERAL("."); |
| 39 const FilePath::CharType FilePath::kParentDirectory[] = FILE_PATH_LITERAL(".."); | 39 const FilePath::CharType FilePath::kParentDirectory[] = FILE_PATH_LITERAL(".."); |
| 40 | 40 |
| 41 const FilePath::CharType FilePath::kExtensionSeparator = FILE_PATH_LITERAL('.'); | 41 const FilePath::CharType FilePath::kExtensionSeparator = FILE_PATH_LITERAL('.'); |
| 42 | 42 |
| 43 const FilePath::CharType kStringTerminator = FILE_PATH_LITERAL('\0'); | |
| 44 | |
|
Tom Sepez
2012/12/20 21:14:34
Should be in namespace { below.
| |
| 43 typedef FilePath::StringType StringType; | 45 typedef FilePath::StringType StringType; |
| 44 | 46 |
| 45 namespace { | 47 namespace { |
| 46 | 48 |
| 47 const char* kCommonDoubleExtensionSuffixes[] = { "gz", "z", "bz2" }; | 49 const char* kCommonDoubleExtensionSuffixes[] = { "gz", "z", "bz2" }; |
| 48 const char* kCommonDoubleExtensions[] = { "user.js" }; | 50 const char* kCommonDoubleExtensions[] = { "user.js" }; |
| 49 | 51 |
| 50 // If this FilePath contains a drive letter specification, returns the | 52 // If this FilePath contains a drive letter specification, returns the |
| 51 // position of the last character of the drive letter specification, | 53 // position of the last character of the drive letter specification, |
| 52 // otherwise returns npos. This can only be true on Windows, when a pathname | 54 // otherwise returns npos. This can only be true on Windows, when a pathname |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 175 | 177 |
| 176 } // namespace | 178 } // namespace |
| 177 | 179 |
| 178 FilePath::FilePath() { | 180 FilePath::FilePath() { |
| 179 } | 181 } |
| 180 | 182 |
| 181 FilePath::FilePath(const FilePath& that) : path_(that.path_) { | 183 FilePath::FilePath(const FilePath& that) : path_(that.path_) { |
| 182 } | 184 } |
| 183 | 185 |
| 184 FilePath::FilePath(const StringType& path) : path_(path) { | 186 FilePath::FilePath(const StringType& path) : path_(path) { |
| 187 // Don't allow '\0' characters in path. | |
|
Tom Sepez
2012/12/20 21:14:34
nit: not sure we need this comment. Maybe just add
| |
| 188 StringType::size_type zero_pos = path_.find(kStringTerminator); | |
| 189 if (zero_pos != StringType::npos) | |
| 190 path_.erase(zero_pos); | |
|
Tom Sepez
2012/12/20 21:14:34
nit: maybe write
path_.erase(zero_pos, StringTy
| |
| 185 } | 191 } |
| 186 | 192 |
| 187 FilePath::~FilePath() { | 193 FilePath::~FilePath() { |
| 188 } | 194 } |
| 189 | 195 |
| 190 FilePath& FilePath::operator=(const FilePath& that) { | 196 FilePath& FilePath::operator=(const FilePath& that) { |
| 191 path_ = that.path_; | 197 path_ = that.path_; |
| 192 return *this; | 198 return *this; |
| 193 } | 199 } |
| 194 | 200 |
| (...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 447 | 453 |
| 448 StringType current_extension = Extension(); | 454 StringType current_extension = Extension(); |
| 449 | 455 |
| 450 if (current_extension.length() != extension.length()) | 456 if (current_extension.length() != extension.length()) |
| 451 return false; | 457 return false; |
| 452 | 458 |
| 453 return FilePath::CompareEqualIgnoreCase(extension, current_extension); | 459 return FilePath::CompareEqualIgnoreCase(extension, current_extension); |
| 454 } | 460 } |
| 455 | 461 |
| 456 FilePath FilePath::Append(const StringType& component) const { | 462 FilePath FilePath::Append(const StringType& component) const { |
| 457 DCHECK(!IsPathAbsolute(component)); | 463 StringType appended(component); |
|
Tom Sepez
2012/12/20 21:14:34
Would be nice to avoid the copy if the NULs not fo
| |
| 464 | |
| 465 // Don't allow '\0' characters to be appended. | |
| 466 StringType::size_type zero_pos = appended.find(kStringTerminator); | |
| 467 if (zero_pos != StringType::npos) | |
| 468 appended.erase(zero_pos); | |
| 469 | |
| 470 DCHECK(!IsPathAbsolute(appended)); | |
| 471 | |
| 458 if (path_.compare(kCurrentDirectory) == 0) { | 472 if (path_.compare(kCurrentDirectory) == 0) { |
| 459 // Append normally doesn't do any normalization, but as a special case, | 473 // Append normally doesn't do any normalization, but as a special case, |
| 460 // when appending to kCurrentDirectory, just return a new path for the | 474 // when appending to kCurrentDirectory, just return a new path for the |
| 461 // component argument. Appending component to kCurrentDirectory would | 475 // component argument. Appending component to kCurrentDirectory would |
| 462 // serve no purpose other than needlessly lengthening the path, and | 476 // serve no purpose other than needlessly lengthening the path, and |
| 463 // it's likely in practice to wind up with FilePath objects containing | 477 // it's likely in practice to wind up with FilePath objects containing |
| 464 // only kCurrentDirectory when calling DirName on a single relative path | 478 // only kCurrentDirectory when calling DirName on a single relative path |
| 465 // component. | 479 // component. |
| 466 return FilePath(component); | 480 return FilePath(appended); |
| 467 } | 481 } |
| 468 | 482 |
| 469 FilePath new_path(path_); | 483 FilePath new_path(path_); |
| 470 new_path.StripTrailingSeparatorsInternal(); | 484 new_path.StripTrailingSeparatorsInternal(); |
| 471 | 485 |
| 472 // Don't append a separator if the path is empty (indicating the current | 486 // Don't append a separator if the path is empty (indicating the current |
| 473 // directory) or if the path component is empty (indicating nothing to | 487 // directory) or if the path component is empty (indicating nothing to |
| 474 // append). | 488 // append). |
| 475 if (component.length() > 0 && new_path.path_.length() > 0) { | 489 if (appended.length() > 0 && new_path.path_.length() > 0) { |
| 476 // Don't append a separator if the path still ends with a trailing | 490 // Don't append a separator if the path still ends with a trailing |
| 477 // separator after stripping (indicating the root directory). | 491 // separator after stripping (indicating the root directory). |
| 478 if (!IsSeparator(new_path.path_[new_path.path_.length() - 1])) { | 492 if (!IsSeparator(new_path.path_[new_path.path_.length() - 1])) { |
| 479 // Don't append a separator if the path is just a drive letter. | 493 // Don't append a separator if the path is just a drive letter. |
| 480 if (FindDriveLetter(new_path.path_) + 1 != new_path.path_.length()) { | 494 if (FindDriveLetter(new_path.path_) + 1 != new_path.path_.length()) { |
| 481 new_path.path_.append(1, kSeparators[0]); | 495 new_path.path_.append(1, kSeparators[0]); |
| 482 } | 496 } |
| 483 } | 497 } |
| 484 } | 498 } |
| 485 | 499 |
| 486 new_path.path_.append(component); | 500 new_path.path_.append(appended); |
| 487 return new_path; | 501 return new_path; |
| 488 } | 502 } |
| 489 | 503 |
| 490 FilePath FilePath::Append(const FilePath& component) const { | 504 FilePath FilePath::Append(const FilePath& component) const { |
| 491 return Append(component.value()); | 505 return Append(component.value()); |
| 492 } | 506 } |
| 493 | 507 |
| 494 FilePath FilePath::AppendASCII(const base::StringPiece& component) const { | 508 FilePath FilePath::AppendASCII(const base::StringPiece& component) const { |
| 495 DCHECK(IsStringASCII(component)); | 509 DCHECK(IsStringASCII(component)); |
| 496 #if defined(OS_WIN) | 510 #if defined(OS_WIN) |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 593 #if defined(OS_WIN) | 607 #if defined(OS_WIN) |
| 594 pickle->WriteString16(path_); | 608 pickle->WriteString16(path_); |
| 595 #else | 609 #else |
| 596 pickle->WriteString(path_); | 610 pickle->WriteString(path_); |
| 597 #endif | 611 #endif |
| 598 } | 612 } |
| 599 | 613 |
| 600 bool FilePath::ReadFromPickle(PickleIterator* iter) { | 614 bool FilePath::ReadFromPickle(PickleIterator* iter) { |
| 601 #if defined(OS_WIN) | 615 #if defined(OS_WIN) |
| 602 if (!iter->ReadString16(&path_)) | 616 if (!iter->ReadString16(&path_)) |
| 603 return false; | 617 return false; |
|
Tom Sepez
2012/12/20 21:14:34
Need the check here, otherwise IPCs bypass your co
Tom Sepez
2012/12/20 21:19:39
Or Not. Looks like IPC reads the underlying strin
| |
| 604 #else | 618 #else |
| 605 if (!iter->ReadString(&path_)) | 619 if (!iter->ReadString(&path_)) |
| 606 return false; | 620 return false; |
| 607 #endif | 621 #endif |
| 608 | 622 |
| 609 return true; | 623 return true; |
| 610 } | 624 } |
| 611 | 625 |
| 612 #if defined(OS_WIN) | 626 #if defined(OS_WIN) |
| 613 // Windows specific implementation of file string comparisons | 627 // Windows specific implementation of file string comparisons |
| (...skipping 615 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1229 } | 1243 } |
| 1230 return FilePath(copy); | 1244 return FilePath(copy); |
| 1231 #else | 1245 #else |
| 1232 return *this; | 1246 return *this; |
| 1233 #endif | 1247 #endif |
| 1234 } | 1248 } |
| 1235 | 1249 |
| 1236 void PrintTo(const FilePath& path, std::ostream* out) { | 1250 void PrintTo(const FilePath& path, std::ostream* out) { |
| 1237 *out << path.value(); | 1251 *out << path.value(); |
| 1238 } | 1252 } |
| OLD | NEW |