| Index: net/ftp/ftp_util.cc
|
| diff --git a/net/ftp/ftp_util.cc b/net/ftp/ftp_util.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..591f7b22f35fc660c6fa647ecc32068ea9714d6a
|
| --- /dev/null
|
| +++ b/net/ftp/ftp_util.cc
|
| @@ -0,0 +1,107 @@
|
| +// 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 "net/ftp/ftp_util.h"
|
| +
|
| +#include <vector>
|
| +
|
| +#include "base/logging.h"
|
| +#include "base/string_tokenizer.h"
|
| +#include "base/string_util.h"
|
| +
|
| +// For examples of Unix<->VMS path conversions, see the unit test file. On VMS
|
| +// a path looks differently depending on whether it's a file or directory.
|
| +
|
| +namespace net {
|
| +
|
| +// static
|
| +std::string FtpUtil::UnixFilePathToVMS(const std::string& unix_path) {
|
| + if (unix_path.empty())
|
| + return std::string();
|
| +
|
| + StringTokenizer tokenizer(unix_path, "/");
|
| + std::vector<std::string> tokens;
|
| + while (tokenizer.GetNext())
|
| + tokens.push_back(tokenizer.token());
|
| +
|
| + if (unix_path[0] == '/') {
|
| + // It's an absolute path.
|
| +
|
| + if (tokens.empty()) {
|
| + DCHECK_EQ(1U, unix_path.length());
|
| + return "[]";
|
| + }
|
| +
|
| + if (tokens.size() == 1)
|
| + return unix_path.substr(1); // Drop the leading slash.
|
| +
|
| + std::string result(tokens[0] + ":[");
|
| + if (tokens.size() == 2) {
|
| + // Don't ask why, it just works that way on VMS.
|
| + result.append("000000");
|
| + } else {
|
| + result.append(tokens[1]);
|
| + for (size_t i = 2; i < tokens.size() - 1; i++)
|
| + result.append("." + tokens[i]);
|
| + }
|
| + result.append("]" + tokens[tokens.size() - 1]);
|
| + return result;
|
| + }
|
| +
|
| + if (tokens.size() == 1)
|
| + return unix_path;
|
| +
|
| + std::string result("[");
|
| + for (size_t i = 0; i < tokens.size() - 1; i++)
|
| + result.append("." + tokens[i]);
|
| + result.append("]" + tokens[tokens.size() - 1]);
|
| + return result;
|
| +}
|
| +
|
| +// static
|
| +std::string FtpUtil::UnixDirectoryPathToVMS(const std::string& unix_path) {
|
| + if (unix_path.empty())
|
| + return std::string();
|
| +
|
| + std::string path(unix_path);
|
| +
|
| + if (path[path.length() - 1] != '/')
|
| + path.append("/");
|
| +
|
| + // Reuse logic from UnixFilePathToVMS by appending a fake file name to the
|
| + // real path and removing it after conversion.
|
| + path.append("x");
|
| + path = UnixFilePathToVMS(path);
|
| + return path.substr(0, path.length() - 1);
|
| +}
|
| +
|
| +// static
|
| +std::string FtpUtil::VMSPathToUnix(const std::string& vms_path) {
|
| + if (vms_path.empty())
|
| + return ".";
|
| +
|
| + if (vms_path == "[]")
|
| + return "/";
|
| +
|
| + std::string result(vms_path);
|
| + if (vms_path[0] == '[') {
|
| + // It's a relative path.
|
| + ReplaceFirstSubstringAfterOffset(&result, 0, "[.", "");
|
| + } else {
|
| + // It's an absolute path.
|
| + result.insert(0, "/");
|
| + ReplaceSubstringsAfterOffset(&result, 0, ":[000000]", "/");
|
| + ReplaceSubstringsAfterOffset(&result, 0, ":[", "/");
|
| + }
|
| + std::replace(result.begin(), result.end(), '.', '/');
|
| + std::replace(result.begin(), result.end(), ']', '/');
|
| +
|
| + // Make sure the result doesn't end with a slash.
|
| + if (result[result.length() - 1] == '/')
|
| + result = result.substr(0, result.length() - 1);
|
| +
|
| + return result;
|
| +}
|
| +
|
| +} // namespace
|
|
|