1 ## This file is a template. The comment below is emitted 2 ## into the rendered file; feel free to edit this file. 3 // WARNING: Generated header. Do not edit! 4 5 6 #pragma once 7 8 #include <map> 9 #include <iostream> 10 #include "defines.hpp" 11 #include "store.hpp" 12 #include "types.hpp" 13 #include "utils.hpp" 14 #include "extra-properties-gen.hpp" 15 16 namespace openpower 17 { 18 namespace vpd 19 { 20 namespace inventory 21 { 22 23 /** @brief API to write parsed VPD to inventory, 24 * for a specific FRU 25 * 26 * @param [in] vpdStore - Store object containing 27 * parsed VPD 28 * @param [in] path - FRU object path 29 */ 30 template<Fru F> 31 void writeFru(const Store& vpdStore, const std::string& path) { 32 throw std::runtime_error("Not implemented"); 33 } 34 35 % for key in fruDict.keys(): 36 <% 37 fru = fruDict[key] 38 %>\ 39 // Specialization of ${key} 40 template<> 41 void writeFru<Fru::${key}>(const Store& vpdStore, 42 const std::string& path) 43 { 44 ObjectMap objects; 45 InterfaceMap interfaces; 46 auto iter = extra::objects.find(path); 47 48 // Inventory manager needs object path, list of interface names to be 49 // implemented, and property:value pairs contained in said interfaces 50 51 % for interface, properties in fru.items(): 52 <% 53 names = interface.split(".") 54 intfName = names[0] + names[-1] 55 %>\ 56 PropertyMap ${intfName}Props; 57 % if properties: 58 % for name, value in properties.items(): 59 % if fru and interface and name and value: 60 <% 61 record, keyword = name.split(",") 62 %>\ 63 if (vpdStore.exists<Record::${record}, record::Keyword::${keyword}>()) 64 { 65 ${intfName}Props["${value}"] = 66 vpdStore.get<Record::${record}, record::Keyword::${keyword}>(); 67 } 68 % endif 69 % endfor 70 % endif 71 // Check and update extra properties 72 if(extra::objects.end() != iter) 73 { 74 auto propIter = (iter->second).find("${interface}"); 75 if((iter->second).end() != propIter) 76 { 77 for(const auto& map : propIter->second) 78 { 79 ${intfName}Props[map.first] = map.second; 80 } 81 } 82 } 83 interfaces.emplace("${interface}", 84 std::move(${intfName}Props)); 85 % endfor 86 87 sdbusplus::message::object_path object(path); 88 // Check and update extra properties 89 if(extra::objects.end() != iter) 90 { 91 for(const auto& entry : iter->second) 92 { 93 if(interfaces.end() == interfaces.find(entry.first)) 94 { 95 interfaces.emplace(entry.first, entry.second); 96 } 97 } 98 } 99 objects.emplace(std::move(object), std::move(interfaces)); 100 101 callPIM(std::move(objects)); 102 } 103 104 % endfor 105 } // namespace inventory 106 } // namespace vpd 107 } // namespace openpower 108