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