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 // FilePath is a container for pathnames stored in a platform's native string | 5 // FilePath is a container for pathnames stored in a platform's native string |
6 // type, providing containers for manipulation in according with the | 6 // type, providing containers for manipulation in according with the |
7 // platform's conventions for pathnames. It supports the following path | 7 // platform's conventions for pathnames. It supports the following path |
8 // types: | 8 // types: |
9 // | 9 // |
10 // POSIX Windows | 10 // POSIX Windows |
11 // --------------- ---------------------------------- | 11 // --------------- ---------------------------------- |
12 // Fundamental type char[] wchar_t[] | 12 // Fundamental type char[] wchar_t[] |
13 // Encoding unspecified* UTF-16 | 13 // Encoding unspecified* UTF-16 |
14 // Separator / \, tolerant of / | 14 // Separator / \, tolerant of / |
15 // Drive letters no case-insensitive A-Z followed by : | 15 // Drive letters no case-insensitive A-Z followed by : |
16 // Alternate root // (surprise!) \\, for UNC paths | 16 // Alternate root // (surprise!) \\, for UNC paths |
17 // | 17 // |
18 // * The encoding need not be specified on POSIX systems, although some | 18 // * The encoding need not be specified on POSIX systems, although some |
19 // POSIX-compliant systems do specify an encoding. Mac OS X uses UTF-8. | 19 // POSIX-compliant systems do specify an encoding. Mac OS X uses UTF-8. |
20 // Linux does not specify an encoding, but in practice, the locale's | 20 // Linux does not specify an encoding, but in practice, the locale's |
21 // character set may be used. | 21 // character set may be used. |
22 // | 22 // |
| 23 // For more arcane bits of path trivia, see below. |
| 24 // |
23 // FilePath objects are intended to be used anywhere paths are. An | 25 // FilePath objects are intended to be used anywhere paths are. An |
24 // application may pass FilePath objects around internally, masking the | 26 // application may pass FilePath objects around internally, masking the |
25 // underlying differences between systems, only differing in implementation | 27 // underlying differences between systems, only differing in implementation |
26 // where interfacing directly with the system. For example, a single | 28 // where interfacing directly with the system. For example, a single |
27 // OpenFile(const FilePath &) function may be made available, allowing all | 29 // OpenFile(const FilePath &) function may be made available, allowing all |
28 // callers to operate without regard to the underlying implementation. On | 30 // callers to operate without regard to the underlying implementation. On |
29 // POSIX-like platforms, OpenFile might wrap fopen, and on Windows, it might | 31 // POSIX-like platforms, OpenFile might wrap fopen, and on Windows, it might |
30 // wrap _wfopen_s, perhaps both by calling file_path.value().c_str(). This | 32 // wrap _wfopen_s, perhaps both by calling file_path.value().c_str(). This |
31 // allows each platform to pass pathnames around without requiring conversions | 33 // allows each platform to pass pathnames around without requiring conversions |
32 // between encodings, which has an impact on performance, but more imporantly, | 34 // between encodings, which has an impact on performance, but more imporantly, |
(...skipping 28 matching lines...) Expand all Loading... |
61 // | FilePath log_file_path(kLogFileName); | 63 // | FilePath log_file_path(kLogFileName); |
62 // | [...] | 64 // | [...] |
63 // | } | 65 // | } |
64 // | 66 // |
65 // WARNING: FilePaths should ALWAYS be displayed with LTR directionality, even | 67 // WARNING: FilePaths should ALWAYS be displayed with LTR directionality, even |
66 // when the UI language is RTL. This means you always need to pass filepaths | 68 // when the UI language is RTL. This means you always need to pass filepaths |
67 // through l10n_util::WrapPathWithLTRFormatting() before displaying it in the | 69 // through l10n_util::WrapPathWithLTRFormatting() before displaying it in the |
68 // RTL UI. | 70 // RTL UI. |
69 // | 71 // |
70 // This is a very common source of bugs, please try to keep this in mind. | 72 // This is a very common source of bugs, please try to keep this in mind. |
| 73 // |
| 74 // ARCANE BITS OF PATH TRIVIA |
| 75 // |
| 76 // - A double leading slash is actually part of the POSIX standard. Systems |
| 77 // are allowed to treat // as an alternate root, as Windows does for UNC |
| 78 // (network share) paths. Most POSIX systems don't do anything special |
| 79 // with two leading slashes, but FilePath handles this case properly |
| 80 // in case it ever comes across such a system. FilePath needs this support |
| 81 // for Windows UNC paths, anyway. |
| 82 // References: |
| 83 // The Open Group Base Specifications Issue 7, sections 3.266 ("Pathname") |
| 84 // and 4.12 ("Pathname Resolution"), available at: |
| 85 // http://www.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag
_03_266 |
| 86 // http://www.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag
_04_12 |
| 87 // |
| 88 // - Windows treats c:\\ the same way it treats \\. This was intended to |
| 89 // allow older applications that require drive letters to support UNC paths |
| 90 // like \\server\share\path, by permitting c:\\server\share\path as an |
| 91 // equivalent. Since the OS treats these paths specially, FilePath needs |
| 92 // to do the same. Since Windows can use either / or \ as the separator, |
| 93 // FilePath treats c://, c:\\, //, and \\ all equivalently. |
| 94 // Reference: |
| 95 // The Old New Thing, "Why is a drive letter permitted in front of UNC |
| 96 // paths (sometimes)?", available at: |
| 97 // http://blogs.msdn.com/oldnewthing/archive/2005/11/22/495740.aspx |
| 98 |
71 #ifndef BASE_FILE_PATH_H_ | 99 #ifndef BASE_FILE_PATH_H_ |
72 #define BASE_FILE_PATH_H_ | 100 #define BASE_FILE_PATH_H_ |
73 | 101 |
74 #include <string> | 102 #include <string> |
75 #include <vector> | 103 #include <vector> |
76 | 104 |
77 #include "base/basictypes.h" | 105 #include "base/basictypes.h" |
78 #include "base/compiler_specific.h" | 106 #include "base/compiler_specific.h" |
79 #include "base/hash_tables.h" | 107 #include "base/hash_tables.h" |
80 #include "base/string_piece.h" // For implicit conversions. | 108 #include "base/string_piece.h" // For implicit conversions. |
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
296 namespace stdext { | 324 namespace stdext { |
297 | 325 |
298 inline size_t hash_value(const FilePath& f) { | 326 inline size_t hash_value(const FilePath& f) { |
299 return hash_value(f.value()); | 327 return hash_value(f.value()); |
300 } | 328 } |
301 | 329 |
302 } // namespace stdext | 330 } // namespace stdext |
303 #endif // COMPILER | 331 #endif // COMPILER |
304 | 332 |
305 #endif // BASE_FILE_PATH_H_ | 333 #endif // BASE_FILE_PATH_H_ |
OLD | NEW |