Index: chrome/browser/sync/util/path_helpers.cc |
=================================================================== |
--- chrome/browser/sync/util/path_helpers.cc (revision 0) |
+++ chrome/browser/sync/util/path_helpers.cc (revision 0) |
@@ -0,0 +1,153 @@ |
+// Copyright (c) 2009 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/sync/util/path_helpers.h" |
+ |
+#include <Shlwapi.h> |
+#include <stdlib.h> |
+ |
+#include "base/logging.h" |
+#include "base/port.h" |
+#include "chrome/browser/sync/syncable/syncable.h" |
+ |
+#ifndef OS_WINDOWS |
+#error Compile this file on Windows only. |
+#endif |
+ |
+using std::string; |
+ |
+#if OS_WINDOWS |
+const char PATH_SEPARATOR = '\\'; |
+#else |
+const char PATH_SEPARATOR = '/'; |
+#endif // OS_WINDOWS |
+ |
+ |
+static PathString RemoveTrailingSlashes16(PathString str) { |
+ while ((str.length() > 0) && (str.at(str.length() - 1) == kPathSeparator[0])) |
+ str.resize(str.length() - 1); |
+ return str; |
+} |
+ |
+static string RemoveTrailingSlashes(string str) { |
+ while ((str.length() > 0) && (str.at(str.length() - 1) == PATH_SEPARATOR)) |
+ str.resize(str.length() - 1); |
+ return str; |
+} |
+ |
+PathString LastPathSegment(const PathString& path) { |
+ return RemoveTrailingSlashes16(PathFindFileNameW(path.c_str())); |
+} |
+ |
+string LastPathSegment(const string& path) { |
+ return RemoveTrailingSlashes(PathFindFileNameA(path.c_str())); |
+} |
+ |
+PathString GetFullPath(const PathString& path) { |
+ PathChar buffer[MAX_PATH]; |
+ PathChar* file_part; |
+ DWORD const size = GetFullPathName(path.c_str(), ARRAYSIZE(buffer), buffer, |
+ &file_part); |
+ return PathString(buffer, size); |
+} |
+ |
+PathString AppendSlash(const PathString& path) { |
+ PathString result(path); |
+ if (!result.empty()) { |
+ if (*result.rbegin() == '/') |
+ *result.rbegin() = '\\'; |
+ else if (*result.rbegin() != '\\') |
+ result.push_back('\\'); |
+ } |
+ return result; |
+} |
+ |
+PathString ExpandTilde(const PathString& path) { |
+ // Do nothing on windows. |
+ return path; |
+} |
+ |
+// Returns a string with length or fewer elements, careful to |
+// not truncate a string mid-surrogate pair. |
+PathString TruncatePathString(const PathString& original, int length) { |
+ if (original.size() <= length) |
+ return original; |
+ if (length <= 0) |
+ return original; |
+ PathString ret(original.begin(), original.begin() + length); |
+ COMPILE_ASSERT(sizeof(PathChar) == sizeof(uint16), PathStringNotUTF16); |
+ PathChar last_char = *ret.rbegin(); |
+ |
+ // Values taken from |
+ // http://en.wikipedia.org/w/index.php?title=UTF-16/UCS-2&oldid=248072840 |
+ if (last_char >= 0xD800 && last_char <= 0xDBFF) |
+ ret.resize(ret.size() - 1); |
+ return ret; |
+} |
+ |
+namespace { |
+const PathString kWindowsIllegalBaseFilenames[] = { |
+ L"CON", L"PRN", L"AUX", L"NUL", L"COM1", L"COM2", |
+ L"COM3", L"COM4", L"COM5", L"COM6", L"COM7", |
+ L"COM8", L"COM9", L"LPT1", L"LPT2", L"LPT3", |
+ L"LPT4", L"LPT5", L"LPT6", L"LPT7", L"LPT8", |
+ L"LPT9" }; |
+} |
+ |
+// See: http://msdn.microsoft.com/library/default.asp?url=/library/ |
+// en-us/fileio/fs/naming_a_file.asp |
+// note that * and ? are not listed on the page as illegal characters, |
+// but they are. |
+PathString MakePathComponentOSLegal(const PathString& component) { |
+ CHECK(!component.empty()); |
+ PathString mutable_component = component; |
+ |
+ // Remove illegal characters. |
+ for (PathString::iterator i = mutable_component.begin(); |
+ i != mutable_component.end();) { |
+ if ((PathString::npos != PathString(L"<>:\"/\\|*?").find(*i)) || |
+ ((static_cast<unsigned short>(*i) >= 0) && |
+ (static_cast<unsigned short>(*i) <= 31))) { |
+ mutable_component.erase(i); |
+ } else { |
+ ++i; |
+ } |
+ } |
+ |
+ // Remove trailing spaces or periods. |
+ while (mutable_component.size() && |
+ ((mutable_component.at(mutable_component.size() - 1) == L' ') || |
+ (mutable_component.at(mutable_component.size() - 1) == L'.'))) |
+ mutable_component.resize(mutable_component.size() - 1, L' '); |
+ |
+ // Remove a bunch of forbidden names. windows only seems to mind if |
+ // a forbidden name matches our name exactly (e.g. "prn") or if the |
+ // name is the forbidden name, followed by a dot, followed by anything |
+ // (e.g., "prn.anything.foo.bar") |
+ |
+ // From this point out, we break mutable_component into two strings, and |
+ // use them this way: we save anything after and including the first dot |
+ // (usually the extension) and only mess with stuff before the first dot. |
+ PathString::size_type first_dot = mutable_component.find_first_of(L'.'); |
+ if (PathString::npos == first_dot) |
+ first_dot = mutable_component.size(); |
+ PathString sub = mutable_component.substr(0, first_dot); |
+ PathString postsub = mutable_component.substr(first_dot); |
+ CHECK(sub + postsub == mutable_component); |
+ for (int i = 0; i < ARRAYSIZE(kWindowsIllegalBaseFilenames); i++) { |
+ // ComparePathNames(a, b) == 0 -> same |
+ if (syncable::ComparePathNames(kWindowsIllegalBaseFilenames[i], sub) == 0) { |
+ sub.append(L"~1"); |
+ break; |
+ } |
+ } |
+ if ((L"" == sub) && (L"" == postsub)) { |
+ sub = L"~1"; |
+ } |
+ |
+ // Return the new name, only if it differs from the original. |
+ if ((sub + postsub) == component) |
+ return L""; |
+ return (sub + postsub); |
+} |
Property changes on: chrome\browser\sync\util\path_helpers.cc |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |