libsdutils/source/utils.cpp

123 lines
4.8 KiB
C++
Raw Normal View History

2022-09-03 23:29:22 +02:00
#include "logger.h"
2022-03-03 23:50:19 +01:00
#include "sdutils/sdutils.h"
#include <coreinit/debug.h>
#include <coreinit/dynload.h>
#include <dirent.h>
static OSDynLoad_Module sModuleHandle = nullptr;
static SDUtilsStatus (*sSDUtilsGetVersion)(SDUtilsVersion *) = nullptr;
2022-03-03 23:50:19 +01:00
static bool (*sSDUtilsAddAttachHandler)(SDAttachHandlerFn) = nullptr;
static bool (*sSDUtilsRemoveAttachHandler)(SDAttachHandlerFn) = nullptr;
2022-04-28 19:47:43 +02:00
static bool (*sSDUtilsAddCleanUpHandlesHandler)(SDCleanUpHandlesHandlerFn) = nullptr;
static bool (*sSDUtilsRemoveCleanUpHandlesHandler)(SDCleanUpHandlesHandlerFn) = nullptr;
static SDUtilsVersion sSDUtilsVersion = SD_UTILS_MODULE_VERSION_ERROR;
SDUtilsStatus SDUtils_InitLibrary() {
2022-03-03 23:50:19 +01:00
if (OSDynLoad_Acquire("homebrew_sdhotswap", &sModuleHandle) != OS_DYNLOAD_OK) {
2022-09-03 23:29:22 +02:00
DEBUG_FUNCTION_LINE_ERR("SDUtils_Init: OSDynLoad_Acquire failed.");
2022-03-03 23:50:19 +01:00
return SDUTILS_RESULT_MODULE_NOT_FOUND;
}
if (OSDynLoad_FindExport(sModuleHandle, FALSE, "SDUtilsGetVersion", (void **) &sSDUtilsGetVersion) != OS_DYNLOAD_OK) {
2022-09-03 23:29:22 +02:00
DEBUG_FUNCTION_LINE_ERR("SDUtils_Init: SDUtilsGetVersion failed.");
return SDUTILS_RESULT_MODULE_MISSING_EXPORT;
}
auto res = SDUtils_GetVersion(&sSDUtilsVersion);
if (res != SDUTILS_RESULT_SUCCESS) {
return SDUTILS_RESULT_UNSUPPORTED_VERSION;
}
2022-03-03 23:50:19 +01:00
if (OSDynLoad_FindExport(sModuleHandle, FALSE, "SDUtilsAddAttachHandler", (void **) &sSDUtilsAddAttachHandler) != OS_DYNLOAD_OK) {
2022-09-03 23:29:22 +02:00
DEBUG_FUNCTION_LINE_ERR("SDUtils_Init: SDUtilsAddAttachHandler failed.");
2022-03-03 23:50:19 +01:00
return SDUTILS_RESULT_MODULE_MISSING_EXPORT;
}
if (OSDynLoad_FindExport(sModuleHandle, FALSE, "SDUtilsRemoveAttachHandler", (void **) &sSDUtilsRemoveAttachHandler) != OS_DYNLOAD_OK) {
2022-09-03 23:29:22 +02:00
DEBUG_FUNCTION_LINE_ERR("SDUtils_Init: SDUtilsRemoveAttachHandler failed.");
2022-03-03 23:50:19 +01:00
return SDUTILS_RESULT_MODULE_MISSING_EXPORT;
}
2022-04-28 19:47:43 +02:00
if (OSDynLoad_FindExport(sModuleHandle, FALSE, "SDUtilsAddCleanUpHandlesHandler", (void **) &sSDUtilsAddCleanUpHandlesHandler) != OS_DYNLOAD_OK) {
2022-09-03 23:29:22 +02:00
DEBUG_FUNCTION_LINE_ERR("SDUtils_Init: SDUtilsAddCleanUpHandlesHandler failed.");
2022-04-28 19:47:43 +02:00
return SDUTILS_RESULT_MODULE_MISSING_EXPORT;
}
if (OSDynLoad_FindExport(sModuleHandle, FALSE, "SDUtilsRemoveCleanUpHandlesHandler", (void **) &sSDUtilsRemoveCleanUpHandlesHandler) != OS_DYNLOAD_OK) {
2022-09-03 23:29:22 +02:00
DEBUG_FUNCTION_LINE_ERR("SDUtils_Init: SDUtilsRemoveCleanUpHandlesHandler failed.");
2022-04-28 19:47:43 +02:00
return SDUTILS_RESULT_MODULE_MISSING_EXPORT;
}
2022-03-03 23:50:19 +01:00
return SDUTILS_RESULT_SUCCESS;
}
SDUtilsStatus SDUtils_DeInitLibrary() {
// We don't need to release the OSDynLoad handle for modules.
return SDUTILS_RESULT_SUCCESS;
}
SDUtilsStatus GetVersion(SDUtilsVersion *);
SDUtilsStatus SDUtils_GetVersion(SDUtilsVersion *version) {
if (version == nullptr) {
return SDUTILS_RESULT_INVALID_ARGUMENT;
}
return reinterpret_cast<decltype(&GetVersion)>(sSDUtilsGetVersion)(version);
}
2022-03-03 23:50:19 +01:00
SDUtilsStatus SDUtils_IsSdCardMounted(bool *status) {
if (status == nullptr) {
return SDUTILS_RESULT_INVALID_ARGUMENT;
}
auto dir = opendir("fs:/vol/external01/");
if (dir != nullptr) {
closedir(dir);
*status = true;
} else {
*status = false;
}
return SDUTILS_RESULT_SUCCESS;
}
bool AddAttachHandler(SDAttachHandlerFn);
SDUtilsStatus SDUtils_AddAttachHandler(SDAttachHandlerFn fn) {
if (sSDUtilsAddAttachHandler == nullptr) {
return SDUTILS_RESULT_LIB_UNINITIALIZED;
}
auto res = reinterpret_cast<decltype(&AddAttachHandler)>(sSDUtilsAddAttachHandler)(fn);
return res ? SDUTILS_RESULT_SUCCESS : SDUTILS_RESULT_MAX_CALLBACKS;
}
bool RemoveAttachHandler(SDAttachHandlerFn);
SDUtilsStatus SDUtils_RemoveAttachHandler(SDAttachHandlerFn fn) {
if (sSDUtilsRemoveAttachHandler == nullptr) {
return SDUTILS_RESULT_LIB_UNINITIALIZED;
}
auto res = reinterpret_cast<decltype(&RemoveAttachHandler)>(sSDUtilsRemoveAttachHandler)(fn);
return res ? SDUTILS_RESULT_SUCCESS : SDUTILS_RESULT_NOT_FOUND;
2022-04-28 19:47:43 +02:00
}
bool AddCleanUpHandlesHandler(SDCleanUpHandlesHandlerFn);
SDUtilsStatus SDUtils_AddCleanUpHandlesHandler(SDCleanUpHandlesHandlerFn fn) {
if (sSDUtilsAddCleanUpHandlesHandler == nullptr) {
return SDUTILS_RESULT_LIB_UNINITIALIZED;
}
auto res = reinterpret_cast<decltype(&AddCleanUpHandlesHandler)>(sSDUtilsAddCleanUpHandlesHandler)(fn);
return res ? SDUTILS_RESULT_SUCCESS : SDUTILS_RESULT_MAX_CALLBACKS;
}
bool RemoveCleanUpHandlesHandler(SDCleanUpHandlesHandlerFn);
SDUtilsStatus SDUtils_RemoveCleanUpHandlesHandler(SDCleanUpHandlesHandlerFn fn) {
if (sSDUtilsRemoveCleanUpHandlesHandler == nullptr) {
return SDUTILS_RESULT_LIB_UNINITIALIZED;
}
auto res = reinterpret_cast<decltype(&RemoveCleanUpHandlesHandler)>(sSDUtilsRemoveCleanUpHandlesHandler)(fn);
return res ? SDUTILS_RESULT_SUCCESS : SDUTILS_RESULT_NOT_FOUND;
2022-03-03 23:50:19 +01:00
}