blob: 53669a5efa044ee4f8851a1c71b8668a0f736a68 [file] [log] [blame]
Andrew Geissler3b025e62019-02-01 10:33:54 -06001#pragma once
2
Andrew Geissler20679262019-02-11 20:20:40 -06003#include "associations.hpp"
Matt Spinler35396c12019-04-05 11:46:57 -05004#include "types.hpp"
Andrew Geissler20679262019-02-11 20:20:40 -06005
Andrew Geissler3b025e62019-02-01 10:33:54 -06006#include <boost/container/flat_map.hpp>
Andrew Geissler82815da2019-02-04 12:19:41 -06007#include <boost/container/flat_set.hpp>
Matt Spinler8f876a52019-04-15 13:22:50 -05008#include <cassert>
Andrew Geissler3b025e62019-02-01 10:33:54 -06009#include <string>
10
Andrew Geissler82815da2019-02-04 12:19:41 -060011/** @brief Define white list and black list data structure */
12using WhiteBlackList = boost::container::flat_set<std::string>;
13
Matt Spinler8f876a52019-04-15 13:22:50 -050014/** @brief The old associations definitions interface */
15constexpr const char* orgOpenBMCAssocDefsInterface = "org.openbmc.Associations";
16/** @brief The new associations definitions interface */
17constexpr const char* assocDefsInterface =
18 "xyz.openbmc_project.Association.Definitions";
19
20/** @brief Says if the interface is the association definition interface.
21 * Supports either the new or old interface.
22 *
23 * @param[in] iface - the interface to check
24 * @return bool - if the interface is one of the association definition
25 * ones.
26 */
27inline bool isAssocDefIface(std::string_view iface)
28{
29 return (iface == assocDefsInterface) ||
30 (iface == orgOpenBMCAssocDefsInterface);
31}
32
33/** @brief Returns the property name used by the defs iface.
34 *
35 * The old interface broke convention and used a lower case property
36 * name. This was resolved with the new interface.
37 *
38 * @param[in] iface - the interface to check
39 * @return std::string - the property name
40 */
41inline std::string getAssocDefPropName(std::string_view iface)
42{
43 assert(isAssocDefIface(iface));
44 return (iface == assocDefsInterface) ? "Associations" : "associations";
45}
Andrew Geissler20679262019-02-11 20:20:40 -060046
Andrew Geissler70461892019-02-27 09:57:37 -060047/** @brief InterfacesAdded represents the dbus data from the signal
48 *
49 * There are 2 pairs
50 * pair1: D-bus Interface,vector[pair2]
51 * pair2: D-bus Method,vector[Associations]
52 */
53using InterfacesAdded = std::vector<std::pair<
54 std::string,
55 std::vector<std::pair<
56 std::string, sdbusplus::message::variant<std::vector<Association>>>>>>;
57
Andrew Geissler3b025e62019-02-01 10:33:54 -060058/** @brief Get well known name of input unique name
59 *
60 * If user passes in well known name then that will be returned.
61 *
62 * @param[in] owners - Current list of owners
63 * @param[in] request - The name to look up
64 * @param[out] wellKnown - The well known name if found
65 *
66 * @return True if well known name is found, false otherwise
67 */
68bool getWellKnown(
69 const boost::container::flat_map<std::string, std::string>& owners,
Andrew Geissler82815da2019-02-04 12:19:41 -060070 const std::string& request, std::string& well_known);
71
72/** @brief Determine if dbus service is something to monitor
73 *
74 * mapper supports a whitelist and blacklist concept. If a whitelist is provided
75 * as input then only dbus objects matching that list is monitored. If a
76 * blacklist is provided then objects matching it will not be monitored.
77 *
78 * @param[in] processName - Dbus service name
79 * @param[in] whiteList - The white list
80 * @param[in] blackList - The black list
81 *
82 * @return True if input process_name should be monitored, false otherwise
83 */
84bool needToIntrospect(const std::string& processName,
85 const WhiteBlackList& whiteList,
86 const WhiteBlackList& blackList);
Andrew Geissler20679262019-02-11 20:20:40 -060087
88/** @brief Handle the removal of an existing name in objmgr data structures
89 *
90 * @param[in,out] nameOwners - Map of unique name to well known name
91 * @param[in] wellKnown - Well known name that has new owner
92 * @param[in] oldOwner - Old unique name
93 * @param[in,out] interfaceMap - Map of interfaces
Matt Spinlere2359fb2019-04-05 14:11:33 -050094 * @param[in,out] assocMaps - The association maps
Andrew Geissler20679262019-02-11 20:20:40 -060095 * @param[in,out] server - sdbus system object
96 *
97 */
98void processNameChangeDelete(
99 boost::container::flat_map<std::string, std::string>& nameOwners,
100 const std::string& wellKnown, const std::string& oldOwner,
Matt Spinlere2359fb2019-04-05 14:11:33 -0500101 interface_map_type& interfaceMap, AssociationMaps& assocMaps,
Andrew Geissler20679262019-02-11 20:20:40 -0600102 sdbusplus::asio::object_server& server);
Andrew Geissler70461892019-02-27 09:57:37 -0600103
104/** @brief Handle an interfaces added signal
105 *
106 * @param[in,out] interfaceMap - Global map of interfaces
107 * @param[in] objPath - New path to process
108 * @param[in] interfacesAdded - New interfaces to process
109 * @param[in] wellKnown - Well known name that has new owner
Matt Spinlere2359fb2019-04-05 14:11:33 -0500110 * @param[in,out] assocMaps - The association maps
Andrew Geissler70461892019-02-27 09:57:37 -0600111 * @param[in,out] server - sdbus system object
112 *
113 */
114void processInterfaceAdded(interface_map_type& interfaceMap,
115 const sdbusplus::message::object_path& objPath,
116 const InterfacesAdded& intfAdded,
117 const std::string& wellKnown,
Matt Spinlere2359fb2019-04-05 14:11:33 -0500118 AssociationMaps& assocMaps,
Andrew Geissler70461892019-02-27 09:57:37 -0600119 sdbusplus::asio::object_server& server);