| // Copyright 2013 The Flutter 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 "flutter/fml/paths.h" | |
| #include <sstream> | |
| #include "flutter/fml/build_config.h" | |
| namespace fml { | |
| namespace paths { | |
| std::string JoinPaths(std::initializer_list<std::string> components) { | |
| std::stringstream stream; | |
| size_t i = 0; | |
| const size_t size = components.size(); | |
| for (const auto& component : components) { | |
| i++; | |
| stream << component; | |
| if (i != size) { | |
| #if FML_OS_WIN | |
| stream << "\\"; | |
| #else // FML_OS_WIN | |
| stream << "/"; | |
| #endif // FML_OS_WIN | |
| } | |
| } | |
| return stream.str(); | |
| } | |
| std::string SanitizeURIEscapedCharacters(const std::string& str) { | |
| std::string result; | |
| result.reserve(str.size()); | |
| for (std::string::size_type i = 0; i < str.size(); ++i) { | |
| if (str[i] == '%') { | |
| if (i > str.size() - 3 || !isxdigit(str[i + 1]) || | |
| !isxdigit(str[i + 2])) { | |
| return ""; | |
| } | |
| const std::string hex = str.substr(i + 1, 2); | |
| const unsigned char c = strtoul(hex.c_str(), nullptr, 16); | |
| if (!c) { | |
| return ""; | |
| } | |
| result += c; | |
| i += 2; | |
| } else { | |
| result += str[i]; | |
| } | |
| } | |
| return result; | |
| } | |
| std::pair<bool, std::string> GetExecutableDirectoryPath() { | |
| auto path = GetExecutablePath(); | |
| if (!path.first) { | |
| return {false, ""}; | |
| } | |
| return {true, fml::paths::GetDirectoryName(path.second)}; | |
| } | |
| } // namespace paths | |
| } // namespace fml |