summaryrefslogtreecommitdiffstats
path: root/chrome/browser/sync/util/path_helpers-posix.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/sync/util/path_helpers-posix.cc')
-rw-r--r--chrome/browser/sync/util/path_helpers-posix.cc99
1 files changed, 99 insertions, 0 deletions
diff --git a/chrome/browser/sync/util/path_helpers-posix.cc b/chrome/browser/sync/util/path_helpers-posix.cc
new file mode 100644
index 0000000..02726db
--- /dev/null
+++ b/chrome/browser/sync/util/path_helpers-posix.cc
@@ -0,0 +1,99 @@
+// 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 <pwd.h>
+
+#include <string.h>
+
+#include "base/port.h"
+#include "chrome/browser/sync/util/path_helpers.h"
+#include "strings/strutil.h"
+
+#if ((!defined(OS_LINUX)) && (!defined(OS_MACOSX)))
+#error Compile this file on Mac OS X or Linux only.
+#endif
+
+PathString ExpandTilde(const PathString& path) {
+ if (path.empty())
+ return path;
+ if ('~' != path[0])
+ return path;
+ PathString ret;
+ // TODO(sync): Consider using getpwuid_r.
+ ret.insert(0, getpwuid(getuid())->pw_dir);
+ ret.append(++path.begin(), path.end());
+ return ret;
+}
+
+namespace {
+// TODO(sync): We really should use char[].
+string cache_dir_;
+}
+
+void set_cache_dir(string cache_dir) {
+ CHECK(cache_dir_.empty());
+ cache_dir_ = cache_dir;
+}
+
+string get_cache_dir() {
+ CHECK(!cache_dir_.empty());
+ return cache_dir_;
+}
+
+// On Posix, PathStrings are UTF-8, not UTF-16 as they are on Windows.
+// Thus, this function is different from the Windows version.
+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(uint8), PathStringNotUTF8);
+ PathString::reverse_iterator last_char = ret.rbegin();
+
+ // Values taken from
+ // http://en.wikipedia.org/w/index.php?title=UTF-8&oldid=252875566
+ if (0 == (*last_char & 0x80))
+ return ret;
+
+ for (; last_char != ret.rend(); ++last_char) {
+ if (0 == (*last_char & 0x80)) {
+ // got malformed UTF-8; bail
+ return ret;
+ }
+ if (0 == (*last_char & 0x40)) {
+ // got another trailing byte
+ continue;
+ }
+ break;
+ }
+
+ if (ret.rend() == last_char) {
+ // We hit the beginning of the string. bail.
+ return ret;
+ }
+
+ int last_codepoint_len = last_char - ret.rbegin() + 1;
+
+ if (((0xC0 == (*last_char & 0xE0)) && (2 == last_codepoint_len)) ||
+ ((0xE0 == (*last_char & 0xF0)) && (3 == last_codepoint_len)) ||
+ ((0xF0 == (*last_char & 0xF8)) && (4 == last_codepoint_len))) {
+ // Valid utf-8.
+ return ret;
+ }
+
+ // Invalid utf-8. chop off last "codepoint" and return.
+ ret.resize(ret.size() - last_codepoint_len);
+ return ret;
+}
+
+// Convert /s to :s .
+PathString MakePathComponentOSLegal(const PathString& component) {
+ if (PathString::npos == component.find("/"))
+ return PSTR("");
+ PathString new_name;
+ new_name.reserve(component.size());
+ StringReplace(component, "/", ":", true, &new_name);
+ return new_name;
+}