1 #include "version.hpp"
2 
3 #include "item_updater.hpp"
4 
5 #include <fstream>
6 #include <iostream>
7 #include <phosphor-logging/elog-errors.hpp>
8 #include <phosphor-logging/log.hpp>
9 #include <sstream>
10 #include <stdexcept>
11 #include <string>
12 #include <xyz/openbmc_project/Common/error.hpp>
13 
14 namespace phosphor
15 {
16 namespace software
17 {
18 namespace updater
19 {
20 
21 using namespace sdbusplus::xyz::openbmc_project::Common::Error;
22 using namespace phosphor::logging;
23 using Argument = xyz::openbmc_project::Common::InvalidArgument;
24 
25 std::map<std::string, std::string>
26     Version::getValues(const std::string& filePath,
27                        const std::vector<std::string>& keys)
28 {
29     if (filePath.empty())
30     {
31         log<level::ERR>("Error filePath is empty");
32         elog<InvalidArgument>(Argument::ARGUMENT_NAME("FilePath"),
33                               Argument::ARGUMENT_VALUE(filePath.c_str()));
34     }
35 
36     std::ifstream efile(filePath);
37     std::string line;
38     std::map<std::string, std::string> ret;
39 
40     while (getline(efile, line))
41     {
42         if (!line.empty() && line.back() == '\r')
43         {
44             // Remove \r from the end of line
45             line.pop_back();
46         }
47         for (const auto& key : keys)
48         {
49             auto value = key + "=";
50             auto keySize = value.length();
51             if (line.compare(0, keySize, value) == 0)
52             {
53                 ret.emplace(key, line.substr(keySize));
54                 break;
55             }
56         }
57     }
58     return ret;
59 }
60 
61 std::string Version::getValue(const std::string& filePath,
62                               const std::string& key)
63 {
64     std::string ret;
65     auto values = Version::getValues(filePath, {key});
66     const auto it = values.find(key);
67     if (it != values.end())
68     {
69         ret = it->second;
70     }
71     return ret;
72 }
73 
74 std::map<std::string, std::string>
75     Version::getExtVersionInfo(const std::string& extVersion)
76 {
77     // The extVersion shall be key/value pairs separated by comma,
78     // e.g. key1=value1,key2=value2
79     std::map<std::string, std::string> result;
80     std::stringstream ss(extVersion);
81 
82     while (ss.good())
83     {
84         std::string substr;
85         getline(ss, substr, ',');
86         auto pos = substr.find('=');
87         if (pos != std::string::npos)
88         {
89             std::string key = substr.substr(0, pos);
90             std::string value = substr.substr(pos + 1);
91             result.emplace(key, value);
92         }
93     }
94     return result;
95 }
96 
97 void Delete::delete_()
98 {
99     if (version.eraseCallback)
100     {
101         version.eraseCallback(version.getVersionId());
102     }
103 }
104 
105 } // namespace updater
106 } // namespace software
107 } // namespace phosphor
108