| // 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 <windows.h> |
| |
| #include <algorithm> |
| |
| #include "flutter/fml/paths.h" |
| #include "flutter/fml/platform/win/wstring_conversion.h" |
| |
| namespace fml { |
| namespace paths { |
| |
| namespace { |
| |
| constexpr char kFileURLPrefix[] = "file:///"; |
| constexpr size_t kFileURLPrefixLength = sizeof(kFileURLPrefix) - 1; |
| |
| size_t RootLength(const std::string& path) { |
| if (path.empty()) |
| return 0; |
| if (path[0] == '/') |
| return 1; |
| if (path[0] == '\\') { |
| if (path.size() < 2 || path[1] != '\\') |
| return 1; |
| // The path is a network share. Search for up to two '\'s, as they are |
| // the server and share - and part of the root part. |
| size_t index = path.find('\\', 2); |
| if (index > 0) { |
| index = path.find('\\', index + 1); |
| if (index > 0) |
| return index; |
| } |
| return path.size(); |
| } |
| // If the path is of the form 'C:/' or 'C:\', with C being any letter, it's |
| // a root part. |
| if (path.length() >= 2 && path[1] == ':' && |
| (path[2] == '/' || path[2] == '\\') && |
| ((path[0] >= 'A' && path[0] <= 'Z') || |
| (path[0] >= 'a' && path[0] <= 'z'))) { |
| return 3; |
| } |
| return 0; |
| } |
| |
| size_t LastSeparator(const std::string& path) { |
| return path.find_last_of("/\\"); |
| } |
| |
| } // namespace |
| |
| std::pair<bool, std::string> GetExecutablePath() { |
| HMODULE module = GetModuleHandle(NULL); |
| if (module == NULL) { |
| return {false, ""}; |
| } |
| wchar_t path[MAX_PATH]; |
| DWORD read_size = GetModuleFileNameW(module, path, MAX_PATH); |
| if (read_size == 0 || read_size == MAX_PATH) { |
| return {false, ""}; |
| } |
| return {true, WideStringToUtf8({path, read_size})}; |
| } |
| |
| std::string AbsolutePath(const std::string& path) { |
| char absPath[MAX_PATH]; |
| _fullpath(absPath, path.c_str(), MAX_PATH); |
| return std::string(absPath); |
| } |
| |
| std::string GetDirectoryName(const std::string& path) { |
| size_t rootLength = RootLength(path); |
| size_t separator = LastSeparator(path); |
| if (separator < rootLength) |
| separator = rootLength; |
| if (separator == std::string::npos) |
| return std::string(); |
| return path.substr(0, separator); |
| } |
| |
| std::string FromURI(const std::string& uri) { |
| if (uri.substr(0, kFileURLPrefixLength) != kFileURLPrefix) |
| return uri; |
| |
| std::string file_path = uri.substr(kFileURLPrefixLength); |
| std::replace(file_path.begin(), file_path.end(), '/', '\\'); |
| return SanitizeURIEscapedCharacters(file_path); |
| } |
| |
| fml::UniqueFD GetCachesDirectory() { |
| // Unsupported on this platform. |
| return {}; |
| } |
| |
| } // namespace paths |
| } // namespace fml |