Browse Source

Merge pull request #53580 from RandomShaper/improve_cache_funcs

Rémi Verschelde 3 years ago
parent
commit
ab9c1574d0

+ 5 - 2
platform/android/os_android.cpp

@@ -230,10 +230,13 @@ String OS_Android::get_user_data_dir() const {
 }
 }
 
 
 String OS_Android::get_cache_path() const {
 String OS_Android::get_cache_path() const {
+	if (cache_dir_cache != String())
+		return cache_dir_cache;
+
 	String cache_dir = godot_io_java->get_cache_dir();
 	String cache_dir = godot_io_java->get_cache_dir();
 	if (cache_dir != "") {
 	if (cache_dir != "") {
-		cache_dir = _remove_symlink(cache_dir);
-		return cache_dir;
+		cache_dir_cache = _remove_symlink(cache_dir);
+		return cache_dir_cache;
 	}
 	}
 	return ".";
 	return ".";
 }
 }

+ 1 - 0
platform/android/os_android.h

@@ -57,6 +57,7 @@ private:
 #endif
 #endif
 
 
 	mutable String data_dir_cache;
 	mutable String data_dir_cache;
+	mutable String cache_dir_cache;
 
 
 	AudioDriverOpenSL audio_driver_android;
 	AudioDriverOpenSL audio_driver_android;
 
 

+ 4 - 2
platform/iphone/app_delegate.mm

@@ -44,7 +44,7 @@
 extern int gargc;
 extern int gargc;
 extern char **gargv;
 extern char **gargv;
 
 
-extern int iphone_main(int, char **, String);
+extern int iphone_main(int, char **, String, String);
 extern void iphone_finish();
 extern void iphone_finish();
 
 
 @implementation AppDelegate
 @implementation AppDelegate
@@ -67,8 +67,10 @@ static ViewController *mainViewController = nil;
 
 
 	NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
 	NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
 	NSString *documentsDirectory = [paths objectAtIndex:0];
 	NSString *documentsDirectory = [paths objectAtIndex:0];
+	paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
+	NSString *cacheDirectory = [paths objectAtIndex:0];
 
 
-	int err = iphone_main(gargc, gargv, String::utf8([documentsDirectory UTF8String]));
+	int err = iphone_main(gargc, gargv, String::utf8([documentsDirectory UTF8String]), String::utf8([cacheDirectory UTF8String]));
 
 
 	if (err != 0) {
 	if (err != 0) {
 		// bail, things did not go very well for us, should probably output a message on screen with our error code...
 		// bail, things did not go very well for us, should probably output a message on screen with our error code...

+ 2 - 2
platform/iphone/godot_iphone.mm

@@ -74,7 +74,7 @@ int add_cmdline(int p_argc, char **p_args) {
 	return p_argc;
 	return p_argc;
 };
 };
 
 
-int iphone_main(int argc, char **argv, String data_dir) {
+int iphone_main(int argc, char **argv, String data_dir, String cache_dir) {
 	size_t len = strlen(argv[0]);
 	size_t len = strlen(argv[0]);
 
 
 	while (len--) {
 	while (len--) {
@@ -95,7 +95,7 @@ int iphone_main(int argc, char **argv, String data_dir) {
 	char cwd[512];
 	char cwd[512];
 	getcwd(cwd, sizeof(cwd));
 	getcwd(cwd, sizeof(cwd));
 	printf("cwd %s\n", cwd);
 	printf("cwd %s\n", cwd);
-	os = new OSIPhone(data_dir);
+	os = new OSIPhone(data_dir, cache_dir);
 
 
 	// We must override main when testing is enabled
 	// We must override main when testing is enabled
 	TEST_MAIN_OVERRIDE
 	TEST_MAIN_OVERRIDE

+ 4 - 1
platform/iphone/os_iphone.h

@@ -72,6 +72,7 @@ private:
 	virtual void finalize() override;
 	virtual void finalize() override;
 
 
 	String user_data_dir;
 	String user_data_dir;
+	String cache_dir;
 
 
 	bool is_focused = false;
 	bool is_focused = false;
 
 
@@ -80,7 +81,7 @@ private:
 public:
 public:
 	static OSIPhone *get_singleton();
 	static OSIPhone *get_singleton();
 
 
-	OSIPhone(String p_data_dir);
+	OSIPhone(String p_data_dir, String p_cache_dir);
 	~OSIPhone();
 	~OSIPhone();
 
 
 	void initialize_modules();
 	void initialize_modules();
@@ -103,6 +104,8 @@ public:
 	void set_user_data_dir(String p_dir);
 	void set_user_data_dir(String p_dir);
 	virtual String get_user_data_dir() const override;
 	virtual String get_user_data_dir() const override;
 
 
+	virtual String get_cache_path() const override;
+
 	virtual String get_locale() const override;
 	virtual String get_locale() const override;
 
 
 	virtual String get_unique_id() const override;
 	virtual String get_unique_id() const override;

+ 6 - 1
platform/iphone/os_iphone.mm

@@ -87,7 +87,7 @@ OSIPhone *OSIPhone::get_singleton() {
 	return (OSIPhone *)OS::get_singleton();
 	return (OSIPhone *)OS::get_singleton();
 }
 }
 
 
-OSIPhone::OSIPhone(String p_data_dir) {
+OSIPhone::OSIPhone(String p_data_dir, String p_cache_dir) {
 	for (int i = 0; i < ios_init_callbacks_count; ++i) {
 	for (int i = 0; i < ios_init_callbacks_count; ++i) {
 		ios_init_callbacks[i]();
 		ios_init_callbacks[i]();
 	}
 	}
@@ -101,6 +101,7 @@ OSIPhone::OSIPhone(String p_data_dir) {
 	// can't call set_data_dir from here, since it requires DirAccess
 	// can't call set_data_dir from here, since it requires DirAccess
 	// which is initialized in initialize_core
 	// which is initialized in initialize_core
 	user_data_dir = p_data_dir;
 	user_data_dir = p_data_dir;
+	cache_dir = p_cache_dir;
 
 
 	Vector<Logger *> loggers;
 	Vector<Logger *> loggers;
 	loggers.push_back(memnew(SyslogLogger));
 	loggers.push_back(memnew(SyslogLogger));
@@ -266,6 +267,10 @@ String OSIPhone::get_user_data_dir() const {
 	return user_data_dir;
 	return user_data_dir;
 }
 }
 
 
+String OSIPhone::get_cache_path() const {
+	return cache_dir;
+}
+
 String OSIPhone::get_locale() const {
 String OSIPhone::get_locale() const {
 	NSString *preferedLanguage = [NSLocale preferredLanguages].firstObject;
 	NSString *preferedLanguage = [NSLocale preferredLanguages].firstObject;
 
 

+ 19 - 10
platform/windows/os_windows.cpp

@@ -677,18 +677,27 @@ String OS_Windows::get_data_path() const {
 }
 }
 
 
 String OS_Windows::get_cache_path() const {
 String OS_Windows::get_cache_path() const {
-	// The XDG Base Directory specification technically only applies on Linux/*BSD, but it doesn't hurt to support it on Windows as well.
-	if (has_environment("XDG_CACHE_HOME")) {
-		if (get_environment("XDG_CACHE_HOME").is_absolute_path()) {
-			return get_environment("XDG_CACHE_HOME").replace("\\", "/");
-		} else {
-			WARN_PRINT_ONCE("`XDG_CACHE_HOME` is a relative path. Ignoring its value and falling back to `%TEMP%` or `get_config_path()` per the XDG Base Directory specification.");
+	static String cache_path_cache;
+	if (cache_path_cache.is_empty()) {
+		// The XDG Base Directory specification technically only applies on Linux/*BSD, but it doesn't hurt to support it on Windows as well.
+		if (has_environment("XDG_CACHE_HOME")) {
+			if (get_environment("XDG_CACHE_HOME").is_absolute_path()) {
+				cache_path_cache = get_environment("XDG_CACHE_HOME").replace("\\", "/");
+			} else {
+				WARN_PRINT_ONCE("`XDG_CACHE_HOME` is a relative path. Ignoring its value and falling back to `%LOCALAPPDATA%\\cache`, `%TEMP%` or `get_config_path()` per the XDG Base Directory specification.");
+			}
+		}
+		if (cache_path_cache.is_empty() && has_environment("LOCALAPPDATA")) {
+			cache_path_cache = get_environment("LOCALAPPDATA").replace("\\", "/");
+		}
+		if (cache_path_cache.is_empty() && has_environment("TEMP")) {
+			cache_path_cache = get_environment("TEMP").replace("\\", "/");
+		}
+		if (cache_path_cache.is_empty()) {
+			cache_path_cache = get_config_path();
 		}
 		}
 	}
 	}
-	if (has_environment("TEMP")) {
-		return get_environment("TEMP").replace("\\", "/");
-	}
-	return get_config_path();
+	return cache_path_cache;
 }
 }
 
 
 // Get properly capitalized engine name for system paths
 // Get properly capitalized engine name for system paths