13b025e69SAndrew Geissler #pragma once
23b025e69SAndrew Geissler 
32067926aSAndrew Geissler #include "associations.hpp"
435396c10SMatt Spinler #include "types.hpp"
52067926aSAndrew Geissler 
63b025e69SAndrew Geissler #include <boost/container/flat_map.hpp>
782815dacSAndrew Geissler #include <boost/container/flat_set.hpp>
88f876a5aSMatt Spinler #include <cassert>
93b025e69SAndrew Geissler #include <string>
103b025e69SAndrew Geissler 
1182815dacSAndrew Geissler /** @brief Define white list and black list data structure */
1282815dacSAndrew Geissler using WhiteBlackList = boost::container::flat_set<std::string>;
1382815dacSAndrew Geissler 
148f876a5aSMatt Spinler /** @brief The old associations definitions interface */
158f876a5aSMatt Spinler constexpr const char* orgOpenBMCAssocDefsInterface = "org.openbmc.Associations";
168f876a5aSMatt Spinler /** @brief The new associations definitions interface */
178f876a5aSMatt Spinler constexpr const char* assocDefsInterface =
188f876a5aSMatt Spinler     "xyz.openbmc_project.Association.Definitions";
198f876a5aSMatt Spinler 
208f876a5aSMatt Spinler /** @brief Says if the interface is the association definition interface.
218f876a5aSMatt Spinler  * Supports either the new or old interface.
228f876a5aSMatt Spinler  *
238f876a5aSMatt Spinler  * @param[in] iface - the interface to check
248f876a5aSMatt Spinler  * @return bool - if the interface is one of the association definition
258f876a5aSMatt Spinler  *                ones.
268f876a5aSMatt Spinler  */
278f876a5aSMatt Spinler inline bool isAssocDefIface(std::string_view iface)
288f876a5aSMatt Spinler {
298f876a5aSMatt Spinler     return (iface == assocDefsInterface) ||
308f876a5aSMatt Spinler            (iface == orgOpenBMCAssocDefsInterface);
318f876a5aSMatt Spinler }
328f876a5aSMatt Spinler 
338f876a5aSMatt Spinler /** @brief Returns the property name used by the defs iface.
348f876a5aSMatt Spinler  *
358f876a5aSMatt Spinler  * The old interface broke convention and used a lower case property
368f876a5aSMatt Spinler  * name.  This was resolved with the new interface.
378f876a5aSMatt Spinler  *
388f876a5aSMatt Spinler  * @param[in] iface - the interface to check
398f876a5aSMatt Spinler  * @return std::string - the property name
408f876a5aSMatt Spinler  */
418f876a5aSMatt Spinler inline std::string getAssocDefPropName(std::string_view iface)
428f876a5aSMatt Spinler {
438f876a5aSMatt Spinler     assert(isAssocDefIface(iface));
448f876a5aSMatt Spinler     return (iface == assocDefsInterface) ? "Associations" : "associations";
458f876a5aSMatt Spinler }
462067926aSAndrew Geissler 
4770461896SAndrew Geissler /** @brief InterfacesAdded represents the dbus data from the signal
4870461896SAndrew Geissler  *
4970461896SAndrew Geissler  * There are 2 pairs
5070461896SAndrew Geissler  * pair1: D-bus Interface,vector[pair2]
5170461896SAndrew Geissler  * pair2: D-bus Method,vector[Associations]
5270461896SAndrew Geissler  */
5370461896SAndrew Geissler using InterfacesAdded = std::vector<std::pair<
5470461896SAndrew Geissler     std::string,
5570461896SAndrew Geissler     std::vector<std::pair<
5670461896SAndrew Geissler         std::string, sdbusplus::message::variant<std::vector<Association>>>>>>;
5770461896SAndrew Geissler 
583b025e69SAndrew Geissler /** @brief Get well known name of input unique name
593b025e69SAndrew Geissler  *
603b025e69SAndrew Geissler  * If user passes in well known name then that will be returned.
613b025e69SAndrew Geissler  *
623b025e69SAndrew Geissler  * @param[in] owners       - Current list of owners
633b025e69SAndrew Geissler  * @param[in] request      - The name to look up
643b025e69SAndrew Geissler  * @param[out] wellKnown   - The well known name if found
653b025e69SAndrew Geissler  *
663b025e69SAndrew Geissler  * @return True if well known name is found, false otherwise
673b025e69SAndrew Geissler  */
683b025e69SAndrew Geissler bool getWellKnown(
693b025e69SAndrew Geissler     const boost::container::flat_map<std::string, std::string>& owners,
7082815dacSAndrew Geissler     const std::string& request, std::string& well_known);
7182815dacSAndrew Geissler 
7282815dacSAndrew Geissler /** @brief Determine if dbus service is something to monitor
7382815dacSAndrew Geissler  *
7482815dacSAndrew Geissler  * mapper supports a whitelist and blacklist concept. If a whitelist is provided
7582815dacSAndrew Geissler  * as input then only dbus objects matching that list is monitored. If a
7682815dacSAndrew Geissler  * blacklist is provided then objects matching it will not be monitored.
7782815dacSAndrew Geissler  *
7882815dacSAndrew Geissler  * @param[in] processName   - Dbus service name
7982815dacSAndrew Geissler  * @param[in] whiteList     - The white list
8082815dacSAndrew Geissler  * @param[in] blackList     - The black list
8182815dacSAndrew Geissler  *
8282815dacSAndrew Geissler  * @return True if input process_name should be monitored, false otherwise
8382815dacSAndrew Geissler  */
8482815dacSAndrew Geissler bool needToIntrospect(const std::string& processName,
8582815dacSAndrew Geissler                       const WhiteBlackList& whiteList,
8682815dacSAndrew Geissler                       const WhiteBlackList& blackList);
872067926aSAndrew Geissler 
882067926aSAndrew Geissler /** @brief Handle the removal of an existing name in objmgr data structures
892067926aSAndrew Geissler  *
902067926aSAndrew Geissler  * @param[in,out] nameOwners      - Map of unique name to well known name
912067926aSAndrew Geissler  * @param[in]     wellKnown       - Well known name that has new owner
922067926aSAndrew Geissler  * @param[in]     oldOwner        - Old unique name
932067926aSAndrew Geissler  * @param[in,out] interfaceMap    - Map of interfaces
94*e2359fb7SMatt Spinler  * @param[in,out] assocMaps       - The association maps
952067926aSAndrew Geissler  * @param[in,out] server          - sdbus system object
962067926aSAndrew Geissler  *
972067926aSAndrew Geissler  */
982067926aSAndrew Geissler void processNameChangeDelete(
992067926aSAndrew Geissler     boost::container::flat_map<std::string, std::string>& nameOwners,
1002067926aSAndrew Geissler     const std::string& wellKnown, const std::string& oldOwner,
101*e2359fb7SMatt Spinler     interface_map_type& interfaceMap, AssociationMaps& assocMaps,
1022067926aSAndrew Geissler     sdbusplus::asio::object_server& server);
10370461896SAndrew Geissler 
10470461896SAndrew Geissler /** @brief Handle an interfaces added signal
10570461896SAndrew Geissler  *
10670461896SAndrew Geissler  * @param[in,out] interfaceMap    - Global map of interfaces
10770461896SAndrew Geissler  * @param[in]     objPath         - New path to process
10870461896SAndrew Geissler  * @param[in]     interfacesAdded - New interfaces to process
10970461896SAndrew Geissler  * @param[in]     wellKnown       - Well known name that has new owner
110*e2359fb7SMatt Spinler  * @param[in,out] assocMaps       - The association maps
11170461896SAndrew Geissler  * @param[in,out] server          - sdbus system object
11270461896SAndrew Geissler  *
11370461896SAndrew Geissler  */
11470461896SAndrew Geissler void processInterfaceAdded(interface_map_type& interfaceMap,
11570461896SAndrew Geissler                            const sdbusplus::message::object_path& objPath,
11670461896SAndrew Geissler                            const InterfacesAdded& intfAdded,
11770461896SAndrew Geissler                            const std::string& wellKnown,
118*e2359fb7SMatt Spinler                            AssociationMaps& assocMaps,
11970461896SAndrew Geissler                            sdbusplus::asio::object_server& server);
120