|  | // 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 |