mirror of
https://github.com/wiiu-env/libwupsbackend.git
synced 2024-11-25 11:16:52 +01:00
first commit
This commit is contained in:
commit
b7eb531c05
8
.gitignore
vendored
Normal file
8
.gitignore
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
/*.a
|
||||||
|
/build
|
||||||
|
*.bz2
|
||||||
|
release/
|
||||||
|
lib/
|
||||||
|
CMakeLists.txt
|
||||||
|
.idea/
|
||||||
|
cmake-build-debug/
|
157
Makefile
Normal file
157
Makefile
Normal file
@ -0,0 +1,157 @@
|
|||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
.SUFFIXES:
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
ifeq ($(strip $(DEVKITPRO)),)
|
||||||
|
$(error "Please set DEVKITPRO in your environment. export DEVKITPRO=<path to>/devkitpro")
|
||||||
|
endif
|
||||||
|
|
||||||
|
TOPDIR ?= $(CURDIR)
|
||||||
|
|
||||||
|
include $(DEVKITPRO)/wut/share/wut_rules
|
||||||
|
|
||||||
|
export VER_MAJOR := 1
|
||||||
|
export VER_MINOR := 0
|
||||||
|
export VER_PATCH := 0
|
||||||
|
|
||||||
|
VERSION := $(VER_MAJOR).$(VER_MINOR).$(VER_PATCH)
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# TARGET is the name of the output
|
||||||
|
# BUILD is the directory where object files & intermediate files will be placed
|
||||||
|
# SOURCES is a list of directories containing source code
|
||||||
|
# DATA is a list of directories containing data files
|
||||||
|
# INCLUDES is a list of directories containing header files
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
TARGET := $(notdir $(CURDIR))
|
||||||
|
BUILD := build
|
||||||
|
SOURCES := source
|
||||||
|
DATA := data
|
||||||
|
INCLUDES := source \
|
||||||
|
include \
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
# options for code generation
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
CFLAGS := -Wall -Werror -save-temps \
|
||||||
|
-ffunction-sections -fdata-sections \
|
||||||
|
$(MACHDEP) \
|
||||||
|
$(BUILD_CFLAGS)
|
||||||
|
|
||||||
|
CFLAGS += $(INCLUDE) -D__WIIU__
|
||||||
|
|
||||||
|
CXXFLAGS := $(CFLAGS) -std=gnu++17
|
||||||
|
|
||||||
|
ASFLAGS := $(MACHDEP)
|
||||||
|
|
||||||
|
LDFLAGS = $(ARCH) -Wl,--gc-sections
|
||||||
|
|
||||||
|
|
||||||
|
LIBS :=
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
# list of directories containing libraries, this must be the top level containing
|
||||||
|
# include and lib
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
LIBDIRS := $(PORTLIBS) $(WUT_ROOT)
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
# no real need to edit anything past this point unless you need to add additional
|
||||||
|
# rules for different file extensions
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
ifneq ($(BUILD),$(notdir $(CURDIR)))
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
export TOPDIR := $(CURDIR)
|
||||||
|
|
||||||
|
export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \
|
||||||
|
$(foreach dir,$(DATA),$(CURDIR)/$(dir))
|
||||||
|
|
||||||
|
CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c)))
|
||||||
|
CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp)))
|
||||||
|
SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s)))
|
||||||
|
DEFFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.def)))
|
||||||
|
BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*)))
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
# use CXX for linking C++ projects, CC for standard C
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
ifeq ($(strip $(CPPFILES)),)
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
export LD := $(CC)
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
else
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
export LD := $(CXX)
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
endif
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
export OFILES_BIN := $(addsuffix .o,$(BINFILES))
|
||||||
|
export OFILES_SRC := $(DEFFILES:.def=.o) $(SFILES:.s=.o) $(CFILES:.c=.o) $(CPPFILES:.cpp=.o)
|
||||||
|
export OFILES := $(OFILES_BIN) $(OFILES_SRC)
|
||||||
|
export HFILES := $(addsuffix .h,$(subst .,_,$(BINFILES)))
|
||||||
|
|
||||||
|
export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \
|
||||||
|
$(foreach dir,$(LIBDIRS),-I$(dir)/include) \
|
||||||
|
-I.
|
||||||
|
|
||||||
|
.PHONY: all dist-bin dist-src dist install clean
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
all: lib/libwupsbackend.a
|
||||||
|
|
||||||
|
dist-bin: all
|
||||||
|
@tar --exclude=*~ -cjf libwupsbackend-$(VERSION).tar.bz2 include lib
|
||||||
|
|
||||||
|
dist-src:
|
||||||
|
@tar --exclude=*~ -cjf libwupsbackend-src-$(VERSION).tar.bz2 include source Makefile
|
||||||
|
|
||||||
|
dist: dist-src dist-bin
|
||||||
|
|
||||||
|
install: dist-bin
|
||||||
|
mkdir -p $(DESTDIR)$(DEVKITPRO)/wups
|
||||||
|
bzip2 -cd libwupsbackend-$(VERSION).tar.bz2 | tar -xf - -C $(DESTDIR)$(DEVKITPRO)/wups
|
||||||
|
|
||||||
|
lib:
|
||||||
|
@[ -d $@ ] || mkdir -p $@
|
||||||
|
|
||||||
|
release:
|
||||||
|
@[ -d $@ ] || mkdir -p $@
|
||||||
|
|
||||||
|
lib/libwupsbackend.a :$(SOURCES) $(INCLUDES) | lib release
|
||||||
|
@$(MAKE) BUILD=release OUTPUT=$(CURDIR)/$@ \
|
||||||
|
BUILD_CFLAGS="-DNDEBUG=1 -O2 -s" \
|
||||||
|
DEPSDIR=$(CURDIR)/release \
|
||||||
|
--no-print-directory -C release \
|
||||||
|
-f $(CURDIR)/Makefile
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
clean:
|
||||||
|
@echo clean ...
|
||||||
|
@rm -rf release lib
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
else
|
||||||
|
|
||||||
|
DEPENDS := $(OFILES:.o=.d)
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
# main targets
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
$(OUTPUT) : $(OFILES)
|
||||||
|
|
||||||
|
$(OFILES_SRC) : $(HFILES)
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
%_bin.h %.bin.o : %.bin
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
@echo $(notdir $<)
|
||||||
|
@$(bin2o)
|
||||||
|
|
||||||
|
|
||||||
|
-include $(DEPENDS)
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------------
|
||||||
|
endif
|
||||||
|
#---------------------------------------------------------------------------------------
|
45
include/wups_backend/PluginContainer.h
Normal file
45
include/wups_backend/PluginContainer.h
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* Copyright (C) 2019,2020 Maschell
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "PluginMetaInformation.h"
|
||||||
|
#include "PluginData.h"
|
||||||
|
|
||||||
|
class PluginContainer {
|
||||||
|
|
||||||
|
public:
|
||||||
|
PluginContainer(const PluginData &data, const PluginMetaInformation &metaInfo, uint32_t handle) : pluginData(data), metaInformation(metaInfo) {
|
||||||
|
this->handle = handle;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t getHandle() const {
|
||||||
|
return this->handle;
|
||||||
|
}
|
||||||
|
|
||||||
|
const PluginMetaInformation &getMetaInformation() const {
|
||||||
|
return this->metaInformation;
|
||||||
|
}
|
||||||
|
|
||||||
|
const PluginData &getPluginData() const {
|
||||||
|
return pluginData;
|
||||||
|
}
|
||||||
|
|
||||||
|
const PluginData pluginData;
|
||||||
|
const PluginMetaInformation metaInformation;
|
||||||
|
uint32_t handle = 0;
|
||||||
|
};
|
29
include/wups_backend/PluginData.h
Normal file
29
include/wups_backend/PluginData.h
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* Copyright (C) 2019,2020 Maschell
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
****************************************************************************/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
class PluginData {
|
||||||
|
|
||||||
|
public:
|
||||||
|
PluginData(uint32_t handle);
|
||||||
|
|
||||||
|
uint32_t getHandle() const {
|
||||||
|
return handle;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t handle;
|
||||||
|
};
|
101
include/wups_backend/PluginMetaInformation.h
Normal file
101
include/wups_backend/PluginMetaInformation.h
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* Copyright (C) 2019,2020 Maschell
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
#include <optional>
|
||||||
|
|
||||||
|
class PluginMetaInformation {
|
||||||
|
public:
|
||||||
|
const std::string getName() const {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::string getAuthor() const {
|
||||||
|
return this->author;
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::string getVersion() const {
|
||||||
|
return this->version;
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::string getLicense() const {
|
||||||
|
return this->license;
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::string getBuildTimestamp() const {
|
||||||
|
return this->buildtimestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::string getDescription() const {
|
||||||
|
return this->description;
|
||||||
|
}
|
||||||
|
|
||||||
|
const size_t getSize() const {
|
||||||
|
return this->size;
|
||||||
|
}
|
||||||
|
|
||||||
|
PluginMetaInformation(std::string name,
|
||||||
|
std::string author,
|
||||||
|
std::string version,
|
||||||
|
std::string license,
|
||||||
|
std::string buildtimestamp,
|
||||||
|
std::string description,
|
||||||
|
size_t size);
|
||||||
|
|
||||||
|
private:
|
||||||
|
PluginMetaInformation() {
|
||||||
|
}
|
||||||
|
|
||||||
|
void setName(const std::string &name) {
|
||||||
|
this->name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setAuthor(const std::string &author) {
|
||||||
|
this->author = author;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setVersion(const std::string &version) {
|
||||||
|
this->version = version;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setLicense(const std::string &license) {
|
||||||
|
this->license = license;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setBuildTimestamp(const std::string &buildtimestamp) {
|
||||||
|
this->buildtimestamp = buildtimestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setDescription(const std::string &description) {
|
||||||
|
this->description = description;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setSize(size_t size) {
|
||||||
|
this->size = size;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string name;
|
||||||
|
std::string author;
|
||||||
|
std::string version;
|
||||||
|
std::string license;
|
||||||
|
std::string buildtimestamp;
|
||||||
|
std::string description;
|
||||||
|
size_t size;
|
||||||
|
};
|
40
include/wups_backend/PluginUtils.h
Normal file
40
include/wups_backend/PluginUtils.h
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* Copyright (C) 2019,2020 Maschell
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
****************************************************************************/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <optional>
|
||||||
|
#include "PluginMetaInformation.h"
|
||||||
|
#include "PluginContainer.h"
|
||||||
|
|
||||||
|
class PluginUtils {
|
||||||
|
public:
|
||||||
|
static std::optional<PluginMetaInformation> getMetaInformationForBuffer(char *buffer, size_t size);
|
||||||
|
|
||||||
|
static std::optional<PluginMetaInformation> getMetaInformationForPath(const std::string &path);
|
||||||
|
|
||||||
|
static std::vector<PluginContainer> getLoadedPlugins(uint32_t maxSize);
|
||||||
|
|
||||||
|
static std::optional<PluginContainer> getPluginForPath(const std::string &path);
|
||||||
|
|
||||||
|
static std::optional<PluginContainer> getPluginForBuffer(char *buffer, size_t size);
|
||||||
|
|
||||||
|
static void destroyPluginContainer(PluginContainer &plugin);
|
||||||
|
|
||||||
|
static void destroyPluginContainer(std::vector<PluginContainer> &vector);
|
||||||
|
|
||||||
|
static int32_t LoadAndLinkOnRestart(std::vector<PluginContainer> &plugins);
|
||||||
|
};
|
23
source/PluginData.cpp
Normal file
23
source/PluginData.cpp
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* Copyright (C) 2019,2020 Maschell
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
#include "wups_backend/PluginData.h"
|
||||||
|
|
||||||
|
PluginData::PluginData(uint32_t handle) {
|
||||||
|
this->handle = handle;
|
||||||
|
}
|
37
source/PluginMetaInformation.cpp
Normal file
37
source/PluginMetaInformation.cpp
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* Copyright (C) 2019,2020 Maschell
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include "wups_backend/PluginMetaInformation.h"
|
||||||
|
|
||||||
|
#include <optional>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
PluginMetaInformation::PluginMetaInformation(std::string name,
|
||||||
|
std::string author,
|
||||||
|
std::string version,
|
||||||
|
std::string license,
|
||||||
|
std::string buildtimestamp,
|
||||||
|
std::string description,
|
||||||
|
size_t size) {
|
||||||
|
this->name = name;
|
||||||
|
this->author = author;
|
||||||
|
this->size = size;
|
||||||
|
this->buildtimestamp = buildtimestamp;
|
||||||
|
this->description = description;
|
||||||
|
this->license = license;
|
||||||
|
this->version = version;
|
||||||
|
}
|
181
source/PluginUtils.cpp
Normal file
181
source/PluginUtils.cpp
Normal file
@ -0,0 +1,181 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* Copyright (C) 2019,2020 Maschell
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <cstring>
|
||||||
|
#include "wups_backend/PluginUtils.h"
|
||||||
|
#include "wups_backend/PluginMetaInformation.h"
|
||||||
|
#include "wups_backend/PluginContainer.h"
|
||||||
|
#include "imports.h"
|
||||||
|
|
||||||
|
std::optional<PluginMetaInformation> PluginUtils::getMetaInformationForBuffer(char *buffer, size_t size) {
|
||||||
|
plugin_information info;
|
||||||
|
memset(&info, 0, sizeof(info));
|
||||||
|
if (WUPSGetPluginMetaInformationByBuffer(&info, buffer, size)) {
|
||||||
|
// DEBUG_FUNCTION_LINE("Failed to load meta infos for buffer %08X with size %08X\n", buffer, size);
|
||||||
|
return std::nullopt;
|
||||||
|
}
|
||||||
|
|
||||||
|
PluginMetaInformation metaInfo(info.name,
|
||||||
|
info.author,
|
||||||
|
info.version,
|
||||||
|
info.license,
|
||||||
|
info.buildTimestamp,
|
||||||
|
info.description,
|
||||||
|
info.size);
|
||||||
|
|
||||||
|
return metaInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::optional<PluginMetaInformation> PluginUtils::getMetaInformationForPath(const std::string &path) {
|
||||||
|
plugin_information info;
|
||||||
|
memset(&info, 0, sizeof(info));
|
||||||
|
if (WUPSGetPluginMetaInformationByPath(&info, path.c_str()) != 0) {
|
||||||
|
// DEBUG_FUNCTION_LINE("Failed to load meta infos for %s\n", path.c_str());
|
||||||
|
return std::nullopt;
|
||||||
|
}
|
||||||
|
PluginMetaInformation metaInfo(info.name,
|
||||||
|
info.author,
|
||||||
|
info.version,
|
||||||
|
info.license,
|
||||||
|
info.buildTimestamp,
|
||||||
|
info.description,
|
||||||
|
info.size);
|
||||||
|
return metaInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::optional<PluginContainer> PluginUtils::getPluginForPath(const std::string &path) {
|
||||||
|
auto metaInfoOpt = PluginUtils::getMetaInformationForPath(path);
|
||||||
|
if (!metaInfoOpt) {
|
||||||
|
return std::nullopt;
|
||||||
|
}
|
||||||
|
|
||||||
|
plugin_data_handle dataHandle;
|
||||||
|
if (WUPSLoadPluginAsDataByPath(&dataHandle, path.c_str()) != 0) {
|
||||||
|
// DEBUG_FUNCTION_LINE("Failed to load data");
|
||||||
|
return std::nullopt;
|
||||||
|
}
|
||||||
|
|
||||||
|
return PluginContainer(PluginData(dataHandle), metaInfoOpt.value(), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::optional<PluginContainer> PluginUtils::getPluginForBuffer(char *buffer, size_t size) {
|
||||||
|
auto metaInfoOpt = PluginUtils::getMetaInformationForBuffer(buffer, size);
|
||||||
|
if (!metaInfoOpt) {
|
||||||
|
return std::nullopt;
|
||||||
|
}
|
||||||
|
|
||||||
|
plugin_data_handle dataHandle;
|
||||||
|
if (WUPSLoadPluginAsDataByBuffer(&dataHandle, buffer, size) != 0) {
|
||||||
|
// DEBUG_FUNCTION_LINE("Failed to load data");
|
||||||
|
return std::nullopt;
|
||||||
|
}
|
||||||
|
return PluginContainer(PluginData(dataHandle), metaInfoOpt.value(), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::vector<PluginContainer> PluginUtils::getLoadedPlugins(uint32_t maxSize) {
|
||||||
|
std::vector<PluginContainer> result;
|
||||||
|
plugin_container_handle handles[maxSize];
|
||||||
|
uint32_t realSize = 0;
|
||||||
|
|
||||||
|
if (WUPSGetLoadedPlugins(handles, maxSize, &realSize) != 0) {
|
||||||
|
// DEBUG_FUNCTION_LINE("Failed");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
if (realSize == 0) {
|
||||||
|
// DEBUG_FUNCTION_LINE("realsize is 0");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
plugin_data_handle dataHandles[realSize];
|
||||||
|
if (WUPSGetPluginDataForContainerHandles(handles, dataHandles, realSize) != 0) {
|
||||||
|
// DEBUG_FUNCTION_LINE("Failed to get plugin data");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
plugin_information information[realSize];
|
||||||
|
if (WUPSGetMetaInformation(handles, information, realSize) != 0) {
|
||||||
|
// DEBUG_FUNCTION_LINE("Failed to get meta information for handles");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i < realSize; i++) {
|
||||||
|
PluginMetaInformation metaInfo(information[i].name,
|
||||||
|
information[i].author,
|
||||||
|
information[i].version,
|
||||||
|
information[i].license,
|
||||||
|
information[i].buildTimestamp,
|
||||||
|
information[i].description,
|
||||||
|
information[i].size);
|
||||||
|
PluginData pluginData((uint32_t) dataHandles[i]);
|
||||||
|
result.push_back(PluginContainer(pluginData, metaInfo, handles[i]));
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PluginUtils::destroyPluginContainer(PluginContainer &plugin) {
|
||||||
|
std::vector<PluginContainer> list;
|
||||||
|
list.push_back(plugin);
|
||||||
|
return destroyPluginContainer(list);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PluginUtils::destroyPluginContainer(std::vector<PluginContainer> &plugins) {
|
||||||
|
uint32_t containerSize = plugins.size();
|
||||||
|
uint32_t dataSize = containerSize;
|
||||||
|
plugin_container_handle container_handles[containerSize];
|
||||||
|
plugin_data_handle data_handles[dataSize];
|
||||||
|
|
||||||
|
uint32_t cntC = 0;
|
||||||
|
uint32_t cntD = 0;
|
||||||
|
for (auto &plugin : plugins) {
|
||||||
|
if (plugin.getHandle() != 0) {
|
||||||
|
container_handles[cntC] = plugin.getHandle();
|
||||||
|
cntC++;
|
||||||
|
} else {
|
||||||
|
containerSize--;
|
||||||
|
}
|
||||||
|
if (plugin.pluginData.getHandle() != 0) {
|
||||||
|
data_handles[cntD] = plugin.pluginData.getHandle();
|
||||||
|
cntD++;
|
||||||
|
} else {
|
||||||
|
dataSize--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
WUPSDeletePluginContainer(container_handles, containerSize);
|
||||||
|
WUPSDeletePluginData(data_handles, dataSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t PluginUtils::LoadAndLinkOnRestart(std::vector<PluginContainer> &plugins) {
|
||||||
|
uint32_t dataSize = plugins.size();
|
||||||
|
plugin_data_handle handles[dataSize];
|
||||||
|
int i = 0;
|
||||||
|
for (auto &plugin:plugins) {
|
||||||
|
plugin_data_handle handle = plugin.getPluginData().getHandle();
|
||||||
|
if (handle == 0) {
|
||||||
|
dataSize--;
|
||||||
|
} else {
|
||||||
|
handles[i] = handle;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int res = WUPSLoadAndLinkByDataHandle(handles, dataSize);
|
||||||
|
// DEBUG_FUNCTION_LINE("%d", res);
|
||||||
|
return res;
|
||||||
|
}
|
69
source/imports.h
Normal file
69
source/imports.h
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* Copyright (C) 2019,2020 Maschell
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef enum GetPluginInformationInputType {
|
||||||
|
PLUGIN_INFORMATION_INPUT_TYPE_PATH = 0,
|
||||||
|
PLUGIN_INFORMATION_INPUT_TYPE_BUFFER = 1,
|
||||||
|
} GetPluginInformationInputType;
|
||||||
|
|
||||||
|
typedef uint32_t plugin_container_handle;
|
||||||
|
typedef uint32_t plugin_data_handle;
|
||||||
|
|
||||||
|
/* plugin_information message */
|
||||||
|
typedef struct __attribute__((__packed__)) plugin_information {
|
||||||
|
char name[256];
|
||||||
|
char author[256];
|
||||||
|
char buildTimestamp[256];
|
||||||
|
char description[256];
|
||||||
|
char license[256];
|
||||||
|
char version[256];
|
||||||
|
size_t size;
|
||||||
|
} plugin_information;
|
||||||
|
|
||||||
|
int32_t WUPSLoadAndLinkByDataHandle(const plugin_data_handle *plugin_data_handle_list, uint32_t plugin_data_handle_list_size);
|
||||||
|
|
||||||
|
int32_t WUPSDeletePluginContainer(const plugin_container_handle *handle_list, uint32_t handle_list_size);
|
||||||
|
|
||||||
|
int32_t WUPSDeletePluginData(const plugin_data_handle *plugin_data_handle_list, uint32_t plugin_data_handle_list_size);
|
||||||
|
|
||||||
|
int32_t WUPSLoadPluginAsData(GetPluginInformationInputType inputType, const char *path, char *buffer, size_t size, plugin_data_handle *out);
|
||||||
|
|
||||||
|
int32_t WUPSLoadPluginAsDataByPath(plugin_data_handle *output, const char *path);
|
||||||
|
|
||||||
|
int32_t WUPSLoadPluginAsDataByBuffer(plugin_data_handle *output, char *buffer, size_t size);
|
||||||
|
|
||||||
|
int32_t WUPSGetPluginMetaInformation(GetPluginInformationInputType inputType, const char *path, char *buffer, size_t size, plugin_information *output);
|
||||||
|
|
||||||
|
int32_t WUPSGetPluginMetaInformationByPath(plugin_information *output, const char *path);
|
||||||
|
|
||||||
|
int32_t WUPSGetPluginMetaInformationByBuffer(plugin_information *output, char *buffer, size_t size);
|
||||||
|
|
||||||
|
int32_t WUPSGetPluginDataForContainerHandles(const plugin_container_handle *plugin_container_handle_list, const plugin_data_handle *plugin_data_list, uint32_t buffer_size);
|
||||||
|
|
||||||
|
int32_t WUPSGetMetaInformation(const plugin_container_handle *plugin_container_handle_list, plugin_information *plugin_information_list, uint32_t buffer_size);
|
||||||
|
|
||||||
|
int32_t WUPSGetLoadedPlugins(const plugin_container_handle *io_handles, uint32_t buffer_size, uint32_t *outSize);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
15
source/wupsbackend.def
Normal file
15
source/wupsbackend.def
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
:NAME homebrew_wupsbackend
|
||||||
|
|
||||||
|
:TEXT
|
||||||
|
WUPSLoadPluginAsDataByPath
|
||||||
|
WUPSLoadPluginAsDataByBuffer
|
||||||
|
WUPSLoadPluginAsData
|
||||||
|
WUPSLoadAndLinkByDataHandle
|
||||||
|
WUPSDeletePluginContainer
|
||||||
|
WUPSDeletePluginData
|
||||||
|
WUPSGetPluginMetaInformation
|
||||||
|
WUPSGetPluginMetaInformationByPath
|
||||||
|
WUPSGetPluginMetaInformationByBuffer
|
||||||
|
WUPSGetMetaInformation
|
||||||
|
WUPSGetLoadedPlugins
|
||||||
|
WUPSGetPluginDataForContainerHandles
|
Loading…
Reference in New Issue
Block a user