mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
Cleans up header order/grouping for consistency: associated header, C/C++ system/standard library headers, library headers, platform-specific #includes. Adds <cstring> where strlen, memcpy are being used: there are a bunch of places we use them transitively. Applies linter-required cleanups. Disables linter on one file due to included RapidJson header. See https://github.com/flutter/flutter/issues/65676 This patch does not cover flutter/shell/platform/darwin. There's a separate, slightly more intensive cleanup for those in progress.
101 lines
2.6 KiB
C++
101 lines
2.6 KiB
C++
// 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"
|
|
|
|
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.size() == 0)
|
|
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> GetExecutableDirectoryPath() {
|
|
HMODULE module = GetModuleHandle(NULL);
|
|
if (module == NULL) {
|
|
return {false, ""};
|
|
}
|
|
char path[MAX_PATH];
|
|
DWORD read_size = GetModuleFileNameA(module, path, MAX_PATH);
|
|
if (read_size == 0 || read_size == MAX_PATH) {
|
|
return {false, ""};
|
|
}
|
|
return {true, GetDirectoryName(std::string{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
|