diff options
author | bruvzg <7645683+bruvzg@users.noreply.github.com> | 2022-01-24 13:12:46 +0200 |
---|---|---|
committer | bruvzg <7645683+bruvzg@users.noreply.github.com> | 2022-01-24 16:22:59 +0200 |
commit | cba82805156ada29993d18b4ceb0721636a3db80 (patch) | |
tree | 25e189aeaf622d0f27889019e0f9977d290e37e5 /core/string | |
parent | 6a3ff8fa1f2cbad5752cf039827206ac265f68f6 (diff) |
[Windows] Add support for handling network share paths.
Diffstat (limited to 'core/string')
-rw-r--r-- | core/string/ustring.cpp | 30 | ||||
-rw-r--r-- | core/string/ustring.h | 1 |
2 files changed, 28 insertions, 3 deletions
diff --git a/core/string/ustring.cpp b/core/string/ustring.cpp index 93b2060155..95246f37a1 100644 --- a/core/string/ustring.cpp +++ b/core/string/ustring.cpp @@ -3558,6 +3558,10 @@ String String::rstrip(const String &p_chars) const { return substr(0, end + 1); } +bool String::is_network_share_path() const { + return begins_with("//") || begins_with("\\\\"); +} + String String::simplify_path() const { String s = *this; String drive; @@ -3570,6 +3574,9 @@ String String::simplify_path() const { } else if (s.begins_with("user://")) { drive = "user://"; s = s.substr(7, s.length()); + } else if (is_network_share_path()) { + drive = s.substr(0, 2); + s = s.substr(2, s.length() - 2); } else if (s.begins_with("/") || s.begins_with("\\")) { drive = s.substr(0, 1); s = s.substr(1, s.length() - 1); @@ -4271,13 +4278,13 @@ bool String::is_relative_path() const { String String::get_base_dir() const { int end = 0; - // url scheme style base + // URL scheme style base. int basepos = find("://"); if (basepos != -1) { end = basepos + 3; } - // windows top level directory base + // Windows top level directory base. if (end == 0) { basepos = find(":/"); if (basepos == -1) { @@ -4288,7 +4295,24 @@ String String::get_base_dir() const { } } - // unix root directory base + // Windows UNC network share path. + if (end == 0) { + if (is_network_share_path()) { + basepos = find("/", 2); + if (basepos == -1) { + basepos = find("\\", 2); + } + int servpos = find("/", basepos + 1); + if (servpos == -1) { + servpos = find("\\", basepos + 1); + } + if (servpos != -1) { + end = servpos + 1; + } + } + } + + // Unix root directory base. if (end == 0) { if (begins_with("/")) { end = 1; diff --git a/core/string/ustring.h b/core/string/ustring.h index 4840c236c0..4284810b74 100644 --- a/core/string/ustring.h +++ b/core/string/ustring.h @@ -405,6 +405,7 @@ public: String get_file() const; static String humanize_size(uint64_t p_size); String simplify_path() const; + bool is_network_share_path() const; String xml_escape(bool p_escape_quotes = false) const; String xml_unescape() const; |