11#pragma once
22
3+ #include < jni.h>
4+
35#include < cerrno>
46#include < cstdlib>
57#include < cstring>
68#include < string_view>
79
10+ #include < runtime-base/jni-wrappers.hh>
811#include < runtime-base/logger.hh>
12+ #include < runtime-base/strings.hh>
13+ #include < runtime-base/util.hh>
914
1015struct AppEnvironmentVariable ;
1116
@@ -18,16 +23,19 @@ namespace xamarin::android {
1823 [[gnu::flatten, gnu::always_inline]]
1924 static void set_variable (const char *name, const char *value) noexcept
2025 {
21- log_debug (LOG_DEFAULT, " Variable {} = '{}'" , optional_string (name), optional_string (value));
22- if (::setenv (name, value, 1 ) < 0 ) {
23- log_warn (LOG_DEFAULT, " Failed to set environment variable '{}': {}" , name, ::strerror (errno));
24- }
26+ Util::set_environment_variable (name, value);
2527 }
2628
2729 [[gnu::flatten, gnu::always_inline]]
2830 static void set_variable (std::string_view const & name, std::string_view const & value) noexcept
2931 {
30- set_variable (name.data (), value.data ());
32+ Util::set_environment_variable (name.data (), value.data ());
33+ }
34+
35+ [[gnu::flatten, gnu::always_inline]]
36+ static void set_variable (std::string_view const & name, jstring_wrapper &value) noexcept
37+ {
38+ Util::set_environment_variable (name.data (), value);
3139 }
3240
3341 [[gnu::flatten, gnu::always_inline]]
@@ -72,5 +80,47 @@ namespace xamarin::android {
7280 setter (var_name, var_value);
7381 }
7482 }
83+
84+ private:
85+ [[gnu::flatten, gnu::always_inline]]
86+ static void create_xdg_directory (jstring_wrapper &home, size_t home_len, std::string_view const & relative_path, std::string_view const & environment_variable_name) noexcept
87+ {
88+ static_local_string<SENSIBLE_PATH_MAX> dir (home_len + relative_path.length ());
89+ Util::path_combine (dir, home.get_string_view (), relative_path);
90+
91+ log_debug (LOG_DEFAULT, " Creating XDG directory: {}" sv, optional_string (dir.get ()));
92+ int rv = Util::create_directory (dir.get (), Constants::DEFAULT_DIRECTORY_MODE);
93+ if (rv < 0 && errno != EEXIST) {
94+ log_warn (LOG_DEFAULT, " Failed to create XDG directory {}. {}" sv, optional_string (dir.get ()), strerror (errno));
95+ }
96+
97+ if (!environment_variable_name.empty ()) {
98+ set_variable (environment_variable_name.data (), dir.get ());
99+ }
100+ }
101+
102+ [[gnu::flatten, gnu::always_inline]]
103+ static void create_xdg_directories_and_environment (jstring_wrapper &homeDir) noexcept
104+ {
105+ size_t home_len = strlen (homeDir.get_cstr ());
106+
107+ constexpr auto XDG_DATA_HOME = " XDG_DATA_HOME" sv;
108+ constexpr auto HOME_PATH = " .local/share" sv;
109+ create_xdg_directory (homeDir, home_len, HOME_PATH, XDG_DATA_HOME);
110+
111+ constexpr auto XDG_CONFIG_HOME = " XDG_CONFIG_HOME" sv;
112+ constexpr auto CONFIG_PATH = " .config" sv;
113+ create_xdg_directory (homeDir, home_len, CONFIG_PATH, XDG_CONFIG_HOME);
114+ }
115+
116+ public:
117+ [[gnu::flatten, gnu::always_inline]]
118+ static void setup_environment (jstring_wrapper &language, jstring_wrapper &files_dir, jstring_wrapper &cache_dir) noexcept
119+ {
120+ set_variable (" LANG" sv, language);
121+ Util::set_environment_variable_for_directory (" TMPDIR" sv, cache_dir);
122+ Util::set_environment_variable_for_directory (" HOME" sv, files_dir);
123+ create_xdg_directories_and_environment (files_dir);
124+ }
75125 };
76126}
0 commit comments