# base::Environment in base baseディレクトリを埋めようの回。 本日は[base::Environment](https://source.chromium.org/chromium/chromium/src/+/main:base/environment.h;l=26;drc=e4622aaeccea84652488d1822c28c78b7115684f)。 ## base::Environmentとは 環境変数を持ち回るための抽象クラス。 [Create](https://source.chromium.org/chromium/chromium/src/+/main:base/environment.cc;l=115;drc=f4a00cc248dd2dc8ec8759fb51620d47b5114090)でオブジェクトを作る。 [SetVar](https://source.chromium.org/chromium/chromium/src/+/main:base/environment.h;l=42;drc=e4622aaeccea84652488d1822c28c78b7115684f)で`variable_name`に対応して`new_value`をセットし、[GetVar](https://source.chromium.org/chromium/chromium/src/+/main:base/environment.h;l=35;drc=e4622aaeccea84652488d1822c28c78b7115684f)で`variable_name`に対応する結果を`result`に保存して返す。 なお、`variable_name`はStringPieceで登録する値はstd::stringでないといけない。 抽象クラスは[EnvironmentImpl](https://source.chromium.org/chromium/chromium/src/+/main:base/environment.cc;l=23;drc=e4622aaeccea84652488d1822c28c78b7115684f)によって実装されている。 実際に使用している例として[browser_launcher.cc](https://source.chromium.org/chromium/chromium/src/+/main:chrome/browser/ash/crosapi/browser_launcher.cc;l=86;drc=f4a00cc248dd2dc8ec8759fb51620d47b5114090)に以下のようなコードがある。 ```cpp std::string GetXdgRuntimeDir() { std::unique_ptr<base::Environment> env = base::Environment::Create(); std::string xdg_runtime_dir; if (env->GetVar("XDG_RUNTIME_DIR", &xdg_runtime_dir)) { return xdg_runtime_dir; } return "/run/chrome"; } ``` ## 実装パート [GetVar](https://source.chromium.org/chromium/chromium/src/+/main:base/environment.cc;l=25;drc=f4a00cc248dd2dc8ec8759fb51620d47b5114090)の実装も[SetVar](https://source.chromium.org/chromium/chromium/src/+/main:base/environment.cc;l=44;drc=f4a00cc248dd2dc8ec8759fb51620d47b5114090)もGetVarImpl、SetVarImplを使っていて、これはWINとPOSIX or FUCHSIAの2つで実装が分岐する。 POSIXでの実装を見てみると、[getenv](https://man7.org/linux/man-pages/man3/getenv.3.html)ライブラリ関数を使って`variable_name`に対応するvalueを取ってきて、存在するなら`result`に代入してtrueを返す。 ない場合はfalseを返すのがシンプルだが、この実装ではlower case版を試してくれている。 例えばHTTP_PROXYがシステムによってはhttp_proxyになったりする。 なので、最初の文字をみて、それのサイズに合わせて、最初がlowerなら全部Upperに変換したものを検索し、逆も然り。 それで結果が存在する場合は`result`とともにtrueを返すようにしている。 ```cpp char first_char = variable_name[0]; std::string alternate_case_var; if (IsAsciiLower(first_char)) alternate_case_var = ToUpperASCII(variable_name); else if (IsAsciiUpper(first_char)) alternate_case_var = ToLowerASCII(variable_name); else return false; return GetVarImpl(alternate_case_var, result); ``` Setの方はシンプルに[setenv](https://man7.org/linux/man-pages/man3/setenv.3.html)ライブラリでセットする。 なお、このライブラリ関数は成功時には`0`を返すようにしているようなので、`!setenv`を返すことでSetvarとしてはtrueを返してくれる。
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up