1*cf78ab8cSAndroid Build Coastguard Worker // Copyright 2022 The Android Open Source Project
2*cf78ab8cSAndroid Build Coastguard Worker //
3*cf78ab8cSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*cf78ab8cSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*cf78ab8cSAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*cf78ab8cSAndroid Build Coastguard Worker //
7*cf78ab8cSAndroid Build Coastguard Worker // http://www.apache.org/licenses/LICENSE-2.0
8*cf78ab8cSAndroid Build Coastguard Worker //
9*cf78ab8cSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*cf78ab8cSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*cf78ab8cSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*cf78ab8cSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*cf78ab8cSAndroid Build Coastguard Worker // limitations under the License.
14*cf78ab8cSAndroid Build Coastguard Worker
15*cf78ab8cSAndroid Build Coastguard Worker #include "util/ini_file.h"
16*cf78ab8cSAndroid Build Coastguard Worker
17*cf78ab8cSAndroid Build Coastguard Worker #include <fstream>
18*cf78ab8cSAndroid Build Coastguard Worker #include <iostream>
19*cf78ab8cSAndroid Build Coastguard Worker #include <string>
20*cf78ab8cSAndroid Build Coastguard Worker #include <string_view>
21*cf78ab8cSAndroid Build Coastguard Worker
22*cf78ab8cSAndroid Build Coastguard Worker #include "util/log.h"
23*cf78ab8cSAndroid Build Coastguard Worker #include "util/string_utils.h"
24*cf78ab8cSAndroid Build Coastguard Worker
25*cf78ab8cSAndroid Build Coastguard Worker namespace netsim {
26*cf78ab8cSAndroid Build Coastguard Worker
Read()27*cf78ab8cSAndroid Build Coastguard Worker bool IniFile::Read() {
28*cf78ab8cSAndroid Build Coastguard Worker data.clear();
29*cf78ab8cSAndroid Build Coastguard Worker
30*cf78ab8cSAndroid Build Coastguard Worker if (filepath.empty()) {
31*cf78ab8cSAndroid Build Coastguard Worker BtsLogWarn("Read called without a backing ini file!");
32*cf78ab8cSAndroid Build Coastguard Worker return false;
33*cf78ab8cSAndroid Build Coastguard Worker }
34*cf78ab8cSAndroid Build Coastguard Worker
35*cf78ab8cSAndroid Build Coastguard Worker std::ifstream inFile(filepath);
36*cf78ab8cSAndroid Build Coastguard Worker
37*cf78ab8cSAndroid Build Coastguard Worker if (!inFile) {
38*cf78ab8cSAndroid Build Coastguard Worker BtsLogWarn("Failed to process .ini file %s for reading.", filepath.c_str());
39*cf78ab8cSAndroid Build Coastguard Worker return false;
40*cf78ab8cSAndroid Build Coastguard Worker }
41*cf78ab8cSAndroid Build Coastguard Worker std::string line;
42*cf78ab8cSAndroid Build Coastguard Worker while (std::getline(inFile, line)) {
43*cf78ab8cSAndroid Build Coastguard Worker auto argv = stringutils::Split(line, "=");
44*cf78ab8cSAndroid Build Coastguard Worker
45*cf78ab8cSAndroid Build Coastguard Worker if (argv.size() != 2) continue;
46*cf78ab8cSAndroid Build Coastguard Worker auto key = stringutils::Trim(argv[0]);
47*cf78ab8cSAndroid Build Coastguard Worker auto val = stringutils::Trim(argv[1]);
48*cf78ab8cSAndroid Build Coastguard Worker data.emplace(key, val);
49*cf78ab8cSAndroid Build Coastguard Worker }
50*cf78ab8cSAndroid Build Coastguard Worker return true;
51*cf78ab8cSAndroid Build Coastguard Worker }
52*cf78ab8cSAndroid Build Coastguard Worker
Write()53*cf78ab8cSAndroid Build Coastguard Worker bool IniFile::Write() {
54*cf78ab8cSAndroid Build Coastguard Worker if (filepath.empty()) {
55*cf78ab8cSAndroid Build Coastguard Worker BtsLogWarn("Write called without a backing ini file!");
56*cf78ab8cSAndroid Build Coastguard Worker return false;
57*cf78ab8cSAndroid Build Coastguard Worker }
58*cf78ab8cSAndroid Build Coastguard Worker
59*cf78ab8cSAndroid Build Coastguard Worker std::ofstream outFile(filepath);
60*cf78ab8cSAndroid Build Coastguard Worker
61*cf78ab8cSAndroid Build Coastguard Worker if (!outFile) {
62*cf78ab8cSAndroid Build Coastguard Worker BtsLogWarn("Failed to open .ini file %s for writing.", filepath.c_str());
63*cf78ab8cSAndroid Build Coastguard Worker return false;
64*cf78ab8cSAndroid Build Coastguard Worker }
65*cf78ab8cSAndroid Build Coastguard Worker
66*cf78ab8cSAndroid Build Coastguard Worker for (const auto &pair : data) {
67*cf78ab8cSAndroid Build Coastguard Worker outFile << pair.first << "=" << pair.second << std::endl;
68*cf78ab8cSAndroid Build Coastguard Worker }
69*cf78ab8cSAndroid Build Coastguard Worker return true;
70*cf78ab8cSAndroid Build Coastguard Worker }
71*cf78ab8cSAndroid Build Coastguard Worker
HasKey(const std::string & key) const72*cf78ab8cSAndroid Build Coastguard Worker bool IniFile::HasKey(const std::string &key) const {
73*cf78ab8cSAndroid Build Coastguard Worker return data.find(key) != std::end(data);
74*cf78ab8cSAndroid Build Coastguard Worker }
75*cf78ab8cSAndroid Build Coastguard Worker
Get(const std::string & key) const76*cf78ab8cSAndroid Build Coastguard Worker std::optional<std::string> IniFile::Get(const std::string &key) const {
77*cf78ab8cSAndroid Build Coastguard Worker auto citer = data.find(key);
78*cf78ab8cSAndroid Build Coastguard Worker return (citer == std::end(data)) ? std::nullopt
79*cf78ab8cSAndroid Build Coastguard Worker : std::optional(citer->second);
80*cf78ab8cSAndroid Build Coastguard Worker }
81*cf78ab8cSAndroid Build Coastguard Worker
Set(const std::string & key,std::string_view value)82*cf78ab8cSAndroid Build Coastguard Worker void IniFile::Set(const std::string &key, std::string_view value) {
83*cf78ab8cSAndroid Build Coastguard Worker data[key] = std::string(value);
84*cf78ab8cSAndroid Build Coastguard Worker }
85*cf78ab8cSAndroid Build Coastguard Worker
86*cf78ab8cSAndroid Build Coastguard Worker } // namespace netsim
87