1*b66ac3aeSAdriana Kobylak #include <phosphor-logging/log.hpp>
22d8fa225SAdriana Kobylak #include "config.h"
32d8fa225SAdriana Kobylak #include "item_updater.hpp"
42d8fa225SAdriana Kobylak 
52d8fa225SAdriana Kobylak namespace openpower
62d8fa225SAdriana Kobylak {
72d8fa225SAdriana Kobylak namespace software
82d8fa225SAdriana Kobylak {
92d8fa225SAdriana Kobylak namespace manager
102d8fa225SAdriana Kobylak {
112d8fa225SAdriana Kobylak 
12*b66ac3aeSAdriana Kobylak using namespace phosphor::logging;
13*b66ac3aeSAdriana Kobylak 
142d8fa225SAdriana Kobylak int ItemUpdater::createActivation(sd_bus_message* msg,
152d8fa225SAdriana Kobylak                                   void* userData,
162d8fa225SAdriana Kobylak                                   sd_bus_error* retErr)
172d8fa225SAdriana Kobylak {
182d8fa225SAdriana Kobylak     auto* updater = static_cast<ItemUpdater*>(userData);
19*b66ac3aeSAdriana Kobylak     auto mapper = updater->busItem.new_method_call(
20*b66ac3aeSAdriana Kobylak             MAPPER_BUSNAME,
21*b66ac3aeSAdriana Kobylak             MAPPER_PATH,
22*b66ac3aeSAdriana Kobylak             MAPPER_INTERFACE,
23*b66ac3aeSAdriana Kobylak             "GetSubTreePaths");
24*b66ac3aeSAdriana Kobylak     mapper.append(SOFTWARE_OBJPATH,
25*b66ac3aeSAdriana Kobylak                   1, // Depth
26*b66ac3aeSAdriana Kobylak                   std::vector<std::string>({VERSION_IFACE}));
27*b66ac3aeSAdriana Kobylak 
28*b66ac3aeSAdriana Kobylak     auto mapperResponseMsg = updater->busItem.call(mapper);
29*b66ac3aeSAdriana Kobylak     if (mapperResponseMsg.is_method_error())
30*b66ac3aeSAdriana Kobylak     {
31*b66ac3aeSAdriana Kobylak         log<level::ERR>("Error in mapper call",
32*b66ac3aeSAdriana Kobylak                         entry("PATH=%s", SOFTWARE_OBJPATH),
33*b66ac3aeSAdriana Kobylak                         entry("INTERFACE=%s", VERSION_IFACE));
34*b66ac3aeSAdriana Kobylak         return -1;
35*b66ac3aeSAdriana Kobylak     }
36*b66ac3aeSAdriana Kobylak 
37*b66ac3aeSAdriana Kobylak     std::vector<std::string> mapperResponse;
38*b66ac3aeSAdriana Kobylak     mapperResponseMsg.read(mapperResponse);
39*b66ac3aeSAdriana Kobylak     if (mapperResponse.empty())
40*b66ac3aeSAdriana Kobylak     {
41*b66ac3aeSAdriana Kobylak         log<level::ERR>("Error reading mapper response",
42*b66ac3aeSAdriana Kobylak                         entry("PATH=%s", SOFTWARE_OBJPATH),
43*b66ac3aeSAdriana Kobylak                         entry("INTERFACE=%s", VERSION_IFACE));
44*b66ac3aeSAdriana Kobylak         return -1;
45*b66ac3aeSAdriana Kobylak     }
46*b66ac3aeSAdriana Kobylak 
47*b66ac3aeSAdriana Kobylak     for (const auto& resp : mapperResponse)
48*b66ac3aeSAdriana Kobylak     {
49*b66ac3aeSAdriana Kobylak         // Version id is the last item in the path
50*b66ac3aeSAdriana Kobylak         auto pos = resp.rfind("/");
51*b66ac3aeSAdriana Kobylak         if (pos == std::string::npos)
52*b66ac3aeSAdriana Kobylak         {
53*b66ac3aeSAdriana Kobylak             log<level::ERR>("No version id found in object path",
54*b66ac3aeSAdriana Kobylak                     entry("OBJPATH=%s", resp));
55*b66ac3aeSAdriana Kobylak             return -1;
56*b66ac3aeSAdriana Kobylak         }
57*b66ac3aeSAdriana Kobylak 
58*b66ac3aeSAdriana Kobylak         auto versionId = std::stoi(resp.substr(pos + 1), nullptr, 16);
59*b66ac3aeSAdriana Kobylak         if (updater->activations.find(versionId) == updater->activations.end())
60*b66ac3aeSAdriana Kobylak         {
612d8fa225SAdriana Kobylak             updater->activations.insert(std::make_pair(
622d8fa225SAdriana Kobylak                     versionId,
632d8fa225SAdriana Kobylak                     std::make_unique<Activation>(
642d8fa225SAdriana Kobylak                             updater->busItem,
65*b66ac3aeSAdriana Kobylak                             resp)));
66*b66ac3aeSAdriana Kobylak         }
67*b66ac3aeSAdriana Kobylak     }
682d8fa225SAdriana Kobylak     return 0;
692d8fa225SAdriana Kobylak }
702d8fa225SAdriana Kobylak 
712d8fa225SAdriana Kobylak } // namespace manager
722d8fa225SAdriana Kobylak } // namespace software
732d8fa225SAdriana Kobylak } // namespace openpower
742d8fa225SAdriana Kobylak 
75