#pragma once

// With OpenSSL 1.1.0, some functions were deprecated. Need to abstract them
// to make the code backward compatible with older OpenSSL versions.
// Reference: https://wiki.openssl.org/index.php/OpenSSL_1.1.0_Changes
#if OPENSSL_VERSION_NUMBER < 0x10100000L

#include <openssl/evp.h>

#include <sdbusplus/bus.hpp>

#include <string>

extern "C"
{
EVP_MD_CTX* EVP_MD_CTX_new(void);
void EVP_MD_CTX_free(EVP_MD_CTX* ctx);
}

namespace utils
{

/**
 * @brief Gets the D-Bus Service name for the input D-Bus path
 *
 * @param[in] bus  -  Bus handler
 * @param[in] path -  Object Path
 * @param[in] intf -  Interface
 *
 * @return  Service name
 * @error   InternalFailure exception thrown
 */
std::string getService(sdbusplus::bus_t& bus, const std::string& path,
                       const std::string& intf);

/** @brief Suspend hiomapd.
 *
 * @param[in] bus - The D-Bus bus object.
 */
void hiomapdSuspend(sdbusplus::bus_t& bus);

/** @brief Resume hiomapd.
 *
 * @param[in] bus - The D-Bus bus object.
 */
void hiomapdResume(sdbusplus::bus_t& bus);

/** @brief Set the Hardware Management Console Managed bios attribute to
 *         Disabled to clear the indication that the system is HMC-managed.
 *
 * @param[in] bus - The D-Bus bus object.
 */
void clearHMCManaged(sdbusplus::bus_t& bus);

/** @brief Set the Clear hypervisor NVRAM bios attribute to Enabled to indicate
 *         to the hypervisor to clear its NVRAM.
 *
 * @param[in] bus - The D-Bus bus object.
 */
void setClearNvram(sdbusplus::bus_t& bus);

/** @brief DeleteAll error logs
 *
 * @param[in] bus - The D-Bus bus object.
 */
void deleteAllErrorLogs(sdbusplus::bus_t& bus);

} // namespace utils

#endif // OPENSSL_VERSION_NUMBER < 0x10100000L
