mirror of
https://github.com/wiiu-env/WiiUPluginLoaderBackend.git
synced 2026-08-28 13:55:26 -05:00
Update plugin (un)loading logic to keep plugins loaded if possible
This commit is contained in:
@@ -1,6 +1,5 @@
|
||||
#include "PluginContainer.h"
|
||||
|
||||
#include <utils/storage/StorageUtils.h>
|
||||
#include "utils/storage/StorageUtils.h"
|
||||
|
||||
PluginContainer::PluginContainer(PluginMetaInformation metaInformation, PluginInformation pluginInformation, std::shared_ptr<PluginData> pluginData)
|
||||
: mMetaInformation(std::move(metaInformation)),
|
||||
@@ -12,21 +11,25 @@ PluginContainer::PluginContainer(PluginContainer &&src) noexcept : mMetaInformat
|
||||
mPluginInformation(std::move(src.mPluginInformation)),
|
||||
mPluginData(std::move(src.mPluginData)),
|
||||
mPluginConfigData(std::move(src.mPluginConfigData)),
|
||||
storageRootItem(src.storageRootItem)
|
||||
mStorageRootItem(src.mStorageRootItem),
|
||||
mInitDone(src.mInitDone)
|
||||
|
||||
{
|
||||
src.storageRootItem = {};
|
||||
src.mStorageRootItem = {};
|
||||
src.mInitDone = {};
|
||||
}
|
||||
|
||||
PluginContainer &PluginContainer::operator=(PluginContainer &&src) noexcept {
|
||||
if (this != &src) {
|
||||
this->mMetaInformation = src.mMetaInformation;
|
||||
this->mMetaInformation = std::move(src.mMetaInformation);
|
||||
this->mPluginInformation = std::move(src.mPluginInformation);
|
||||
this->mPluginData = std::move(src.mPluginData);
|
||||
this->mPluginConfigData = std::move(src.mPluginConfigData);
|
||||
this->storageRootItem = src.storageRootItem;
|
||||
this->mStorageRootItem = src.mStorageRootItem;
|
||||
this->mInitDone = src.mInitDone;
|
||||
|
||||
src.storageRootItem = nullptr;
|
||||
src.mStorageRootItem = nullptr;
|
||||
src.mInitDone = false;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
@@ -48,7 +51,7 @@ std::shared_ptr<PluginData> PluginContainer::getPluginDataCopy() const {
|
||||
}
|
||||
|
||||
uint32_t PluginContainer::getHandle() const {
|
||||
return (uint32_t) this;
|
||||
return reinterpret_cast<uint32_t>(this);
|
||||
}
|
||||
|
||||
const std::optional<PluginConfigData> &PluginContainer::getConfigData() const {
|
||||
@@ -67,9 +70,9 @@ WUPSStorageError PluginContainer::OpenStorage() {
|
||||
if (storageId.empty()) {
|
||||
return WUPS_STORAGE_ERROR_SUCCESS;
|
||||
}
|
||||
auto res = StorageUtils::API::Internal::OpenStorage(storageId, storageRootItem);
|
||||
auto res = StorageUtils::API::Internal::OpenStorage(storageId, mStorageRootItem);
|
||||
if (res != WUPS_STORAGE_ERROR_SUCCESS) {
|
||||
storageRootItem = nullptr;
|
||||
mStorageRootItem = nullptr;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
@@ -78,8 +81,20 @@ WUPSStorageError PluginContainer::CloseStorage() {
|
||||
if (getMetaInformation().getWUPSVersion() < WUPSVersion(0, 8, 0)) {
|
||||
return WUPS_STORAGE_ERROR_SUCCESS;
|
||||
}
|
||||
if (storageRootItem == nullptr) {
|
||||
if (mStorageRootItem == nullptr) {
|
||||
return WUPS_STORAGE_ERROR_SUCCESS;
|
||||
}
|
||||
return StorageUtils::API::Internal::CloseStorage(storageRootItem);
|
||||
return StorageUtils::API::Internal::CloseStorage(mStorageRootItem);
|
||||
}
|
||||
|
||||
wups_storage_root_item PluginContainer::getStorageRootItem() const {
|
||||
return mStorageRootItem;
|
||||
}
|
||||
|
||||
void PluginContainer::setInitDone(const bool val) {
|
||||
mInitDone = val;
|
||||
}
|
||||
|
||||
bool PluginContainer::isInitDone() const {
|
||||
return mInitDone;
|
||||
}
|
||||
@@ -30,15 +30,12 @@ class PluginContainer {
|
||||
public:
|
||||
PluginContainer(PluginMetaInformation metaInformation, PluginInformation pluginInformation, std::shared_ptr<PluginData> pluginData);
|
||||
|
||||
|
||||
PluginContainer(const PluginContainer &) = delete;
|
||||
|
||||
|
||||
PluginContainer(PluginContainer &&src) noexcept;
|
||||
|
||||
PluginContainer &operator=(PluginContainer &&src) noexcept;
|
||||
|
||||
|
||||
[[nodiscard]] const PluginMetaInformation &getMetaInformation() const;
|
||||
|
||||
[[nodiscard]] const PluginInformation &getPluginInformation() const;
|
||||
@@ -56,9 +53,11 @@ public:
|
||||
|
||||
WUPSStorageError CloseStorage();
|
||||
|
||||
[[nodiscard]] wups_storage_root_item getStorageRootItem() const {
|
||||
return storageRootItem;
|
||||
}
|
||||
[[nodiscard]] wups_storage_root_item getStorageRootItem() const;
|
||||
|
||||
void setInitDone(bool val);
|
||||
|
||||
[[nodiscard]] bool isInitDone() const;
|
||||
|
||||
private:
|
||||
PluginMetaInformation mMetaInformation;
|
||||
@@ -66,5 +65,6 @@ private:
|
||||
std::shared_ptr<PluginData> mPluginData;
|
||||
|
||||
std::optional<PluginConfigData> mPluginConfigData;
|
||||
wups_storage_root_item storageRootItem = nullptr;
|
||||
wups_storage_root_item mStorageRootItem = nullptr;
|
||||
bool mInitDone = false;
|
||||
};
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
#include <memory>
|
||||
#include <span>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
@@ -44,3 +45,9 @@ private:
|
||||
std::vector<uint8_t> mBuffer;
|
||||
std::string mSource;
|
||||
};
|
||||
|
||||
struct PluginDataSharedPtrComparator {
|
||||
bool operator()(const std::shared_ptr<PluginData> &lhs, const std::shared_ptr<PluginData> &rhs) const {
|
||||
return lhs->getHandle() < rhs->getHandle();
|
||||
}
|
||||
};
|
||||
|
||||
@@ -25,8 +25,8 @@
|
||||
#include <set>
|
||||
#include <sys/dirent.h>
|
||||
|
||||
std::set<std::shared_ptr<PluginData>> PluginDataFactory::loadDir(const std::string_view path) {
|
||||
std::set<std::shared_ptr<PluginData>> result;
|
||||
std::set<std::shared_ptr<PluginData>, PluginDataSharedPtrComparator> PluginDataFactory::loadDir(const std::string_view path) {
|
||||
std::set<std::shared_ptr<PluginData>, PluginDataSharedPtrComparator> result;
|
||||
dirent *dp;
|
||||
DIR *dfd;
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
|
||||
class PluginDataFactory {
|
||||
public:
|
||||
static std::set<std::shared_ptr<PluginData>> loadDir(std::string_view path);
|
||||
static std::set<std::shared_ptr<PluginData>, PluginDataSharedPtrComparator> loadDir(std::string_view path);
|
||||
|
||||
static std::unique_ptr<PluginData> load(std::string_view path);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user