1d58858caSShawn McCarney /** 2d58858caSShawn McCarney * Copyright © 2020 IBM Corporation 3d58858caSShawn McCarney * 4d58858caSShawn McCarney * Licensed under the Apache License, Version 2.0 (the "License"); 5d58858caSShawn McCarney * you may not use this file except in compliance with the License. 6d58858caSShawn McCarney * You may obtain a copy of the License at 7d58858caSShawn McCarney * 8d58858caSShawn McCarney * http://www.apache.org/licenses/LICENSE-2.0 9d58858caSShawn McCarney * 10d58858caSShawn McCarney * Unless required by applicable law or agreed to in writing, software 11d58858caSShawn McCarney * distributed under the License is distributed on an "AS IS" BASIS, 12d58858caSShawn McCarney * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d58858caSShawn McCarney * See the License for the specific language governing permissions and 14d58858caSShawn McCarney * limitations under the License. 15d58858caSShawn McCarney */ 16d58858caSShawn McCarney #pragma once 17d58858caSShawn McCarney 18d58858caSShawn McCarney #include <sdbusplus/bus.hpp> 193cd2b407SShawn McCarney #include <sdbusplus/exception.hpp> 20d58858caSShawn McCarney 21d58858caSShawn McCarney #include <map> 22d58858caSShawn McCarney #include <string> 23d58858caSShawn McCarney 24d58858caSShawn McCarney namespace phosphor::power::regulators 25d58858caSShawn McCarney { 26d58858caSShawn McCarney 27d58858caSShawn McCarney /** 28d58858caSShawn McCarney * @class PresenceService 29d58858caSShawn McCarney * 30d58858caSShawn McCarney * Abstract base class that provides an interface to hardware presence data. 31d58858caSShawn McCarney * 32d58858caSShawn McCarney * The interface is used to determine whether hardware is present. 33d58858caSShawn McCarney */ 34d58858caSShawn McCarney class PresenceService 35d58858caSShawn McCarney { 36d58858caSShawn McCarney public: 37d58858caSShawn McCarney // Specify which compiler-generated methods we want 38d58858caSShawn McCarney PresenceService() = default; 39d58858caSShawn McCarney PresenceService(const PresenceService&) = delete; 40d58858caSShawn McCarney PresenceService(PresenceService&&) = delete; 41d58858caSShawn McCarney PresenceService& operator=(const PresenceService&) = delete; 42d58858caSShawn McCarney PresenceService& operator=(PresenceService&&) = delete; 43d58858caSShawn McCarney virtual ~PresenceService() = default; 44d58858caSShawn McCarney 45d58858caSShawn McCarney /** 46d58858caSShawn McCarney * Clears any cached hardware presence data. 47d58858caSShawn McCarney */ 48d58858caSShawn McCarney virtual void clearCache(void) = 0; 49d58858caSShawn McCarney 50d58858caSShawn McCarney /** 51d58858caSShawn McCarney * Returns whether the hardware with the specified inventory path is 52d58858caSShawn McCarney * present. 53d58858caSShawn McCarney * 54d58858caSShawn McCarney * May return a cached value if one is available to improve performance. 55d58858caSShawn McCarney * 56d58858caSShawn McCarney * Throws an exception if an error occurs while obtaining the presence 57d58858caSShawn McCarney * value. 58d58858caSShawn McCarney * 59d58858caSShawn McCarney * @param inventoryPath D-Bus inventory path of the hardware 60d58858caSShawn McCarney * @return true if hardware is present, false otherwise 61d58858caSShawn McCarney */ 62d58858caSShawn McCarney virtual bool isPresent(const std::string& inventoryPath) = 0; 63d58858caSShawn McCarney }; 64d58858caSShawn McCarney 65d58858caSShawn McCarney /** 66d58858caSShawn McCarney * @class DBusPresenceService 67d58858caSShawn McCarney * 68d58858caSShawn McCarney * Implementation of the PresenceService interface using D-Bus method calls. 69d58858caSShawn McCarney */ 70d58858caSShawn McCarney class DBusPresenceService : public PresenceService 71d58858caSShawn McCarney { 72d58858caSShawn McCarney public: 73d58858caSShawn McCarney // Specify which compiler-generated methods we want 74d58858caSShawn McCarney DBusPresenceService() = delete; 75d58858caSShawn McCarney DBusPresenceService(const DBusPresenceService&) = delete; 76d58858caSShawn McCarney DBusPresenceService(DBusPresenceService&&) = delete; 77d58858caSShawn McCarney DBusPresenceService& operator=(const DBusPresenceService&) = delete; 78d58858caSShawn McCarney DBusPresenceService& operator=(DBusPresenceService&&) = delete; 79d58858caSShawn McCarney virtual ~DBusPresenceService() = default; 80d58858caSShawn McCarney 81d58858caSShawn McCarney /** 82d58858caSShawn McCarney * Constructor. 83d58858caSShawn McCarney * 84d58858caSShawn McCarney * @param bus D-Bus bus object 85d58858caSShawn McCarney */ DBusPresenceService(sdbusplus::bus_t & bus)86*48781aefSPatrick Williams explicit DBusPresenceService(sdbusplus::bus_t& bus) : bus{bus} {} 87d58858caSShawn McCarney 88d58858caSShawn McCarney /** @copydoc PresenceService::clearCache() */ clearCache(void)89d58858caSShawn McCarney virtual void clearCache(void) override 90d58858caSShawn McCarney { 91d58858caSShawn McCarney cache.clear(); 92d58858caSShawn McCarney } 93d58858caSShawn McCarney 94d58858caSShawn McCarney /** @copydoc PresenceService::isPresent() */ 95d58858caSShawn McCarney virtual bool isPresent(const std::string& inventoryPath) override; 96d58858caSShawn McCarney 97d58858caSShawn McCarney private: 98d58858caSShawn McCarney /** 993cd2b407SShawn McCarney * Returns whether the specified D-Bus exception is one of the expected 1003cd2b407SShawn McCarney * types that can be thrown if hardware is not present. 1013cd2b407SShawn McCarney * 1023cd2b407SShawn McCarney * @return true if exception type is expected, false otherwise 1033cd2b407SShawn McCarney */ 1047354ce62SPatrick Williams bool isExpectedException(const sdbusplus::exception_t& e); 1053cd2b407SShawn McCarney 1063cd2b407SShawn McCarney /** 107d58858caSShawn McCarney * D-Bus bus object. 108d58858caSShawn McCarney */ 1097354ce62SPatrick Williams sdbusplus::bus_t& bus; 110d58858caSShawn McCarney 111d58858caSShawn McCarney /** 112d58858caSShawn McCarney * Cached presence data. 113d58858caSShawn McCarney * 114d58858caSShawn McCarney * Map from inventory paths to presence values. 115d58858caSShawn McCarney */ 116d58858caSShawn McCarney std::map<std::string, bool> cache{}; 117d58858caSShawn McCarney }; 118d58858caSShawn McCarney 119d58858caSShawn McCarney } // namespace phosphor::power::regulators 120