[Loader] Now show config GUI when entering Mii Maker

- Added for methods to the plugin loader.
This commit is contained in:
Maschell 2018-02-18 17:47:03 +01:00
parent 41da4db58c
commit 869b3bc391
5 changed files with 61 additions and 33 deletions

View File

@ -56,8 +56,6 @@ void CallHook(wups_loader_hook_type_t hook_type);
static void RestorePatches(); static void RestorePatches();
s32 isInMiiMakerHBL(); s32 isInMiiMakerHBL();
u8 isFirstBoot __attribute__((section(".data"))) = 1;
/* Entry point */ /* Entry point */
extern "C" int Menu_Main(int argc, char **argv){ extern "C" int Menu_Main(int argc, char **argv){
if(gAppStatus == 2){ if(gAppStatus == 2){
@ -86,8 +84,12 @@ extern "C" int Menu_Main(int argc, char **argv){
DEBUG_FUNCTION_LINE("Mount SD partition\n"); DEBUG_FUNCTION_LINE("Mount SD partition\n");
Init_SD_USB(); Init_SD_USB();
if(isFirstBoot){ s32 result = 0;
memset((void*)&gbl_replacement_data,0,sizeof(gbl_replacement_data));
//Reset everything when were going back to the Mii Maker
if(isInMiiMakerHBL()){
// Restore patches as the patched functions could change.
RestorePatches();
PluginLoader * pluginLoader = PluginLoader::getInstance(); PluginLoader * pluginLoader = PluginLoader::getInstance();
std::vector<PluginInformation *> pluginList = pluginLoader->getPluginInformation("sd:/wiiu/plugins/"); std::vector<PluginInformation *> pluginList = pluginLoader->getPluginInformation("sd:/wiiu/plugins/");
@ -100,50 +102,33 @@ extern "C" int Menu_Main(int argc, char **argv){
memoryInitialize(); memoryInitialize();
DEBUG_FUNCTION_LINE("Start main application\n"); DEBUG_FUNCTION_LINE("Start main application\n");
s32 result = Application::instance()->exec(); result = Application::instance()->exec();
DEBUG_FUNCTION_LINE("Main application stopped result: %d\n",result); DEBUG_FUNCTION_LINE("Main application stopped result: %d\n",result);
Application::destroyInstance(); Application::destroyInstance();
DEBUG_FUNCTION_LINE("Release memory\n"); DEBUG_FUNCTION_LINE("Release memory\n");
memoryRelease(); memoryRelease();
CSettings::destroyInstance(); CSettings::destroyInstance();
if(result == APPLICATION_CLOSE_MIIMAKER){ PluginLoader::destroyInstance();
DeInit();
return EXIT_SUCCESS;
}
} }
DEBUG_FUNCTION_LINE("Apply patches.\n");
ApplyPatches();
//Reset everything when were going back to the Mii Maker if(!isInMiiMakerHBL()){
if(!isFirstBoot && isInMiiMakerHBL()){
DEBUG_FUNCTION_LINE("Returing to the Homebrew Launcher!\n");
isFirstBoot = 0;
DeInit();
RestorePatches();
return EXIT_SUCCESS;
} else {
DEBUG_FUNCTION_LINE("Apply patches.\n");
ApplyPatches();
}
if(!isInMiiMakerHBL()){ //Starting the application
DEBUG_FUNCTION_LINE("Calling init hook.\n");
CallHook(WUPS_LOADER_HOOK_INIT_FUNCTION); CallHook(WUPS_LOADER_HOOK_INIT_FUNCTION);
return EXIT_RELAUNCH_ON_LOAD; return EXIT_RELAUNCH_ON_LOAD;
} }
if(isFirstBoot){ // First boot back to SysMenu if(result == APPLICATION_CLOSE_APPLY){
DEBUG_FUNCTION_LINE("Loading the System Menu\n"); DEBUG_FUNCTION_LINE("Loading the system menu.\n");
isFirstBoot = 0;
SYSLaunchMenu(); SYSLaunchMenu();
return EXIT_RELAUNCH_ON_LOAD; return EXIT_RELAUNCH_ON_LOAD;
} }
DEBUG_FUNCTION_LINE("Application is ending now.\n"); DEBUG_FUNCTION_LINE("Going back to the Homebrew Launcher\n");
DeInit();
RestorePatches(); RestorePatches();
DeInit();
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }

View File

@ -30,8 +30,7 @@ MainWindow::MainWindow(s32 w, s32 h)
: width(w) : width(w)
, height(h) , height(h)
{ {
for(s32 i = 0; i < 4; i++) for(s32 i = 0; i < 4; i++) {
{
std::string filename = StringTools::strfmt("player%i_point.png", i+1); std::string filename = StringTools::strfmt("player%i_point.png", i+1);
pointerImgData[i] = Resources::GetImageData(filename.c_str()); pointerImgData[i] = Resources::GetImageData(filename.c_str());
pointerImg[i] = new GuiImage(pointerImgData[i]); pointerImg[i] = new GuiImage(pointerImgData[i]);

View File

@ -38,6 +38,7 @@ struct rpl_handling {
#define DYNAMIC_FUNCTION 1 #define DYNAMIC_FUNCTION 1
#define FUNCTION_PATCHER_METHOD_STORE_SIZE 7 #define FUNCTION_PATCHER_METHOD_STORE_SIZE 7
#define MAXIMUM_PLUGIN_PATH_NAME_LENGTH 256
#define MAXIMUM_PLUGIN_NAME_LENGTH 51 #define MAXIMUM_PLUGIN_NAME_LENGTH 51
#define MAXIMUM_FUNCTION_NAME_LENGTH 51 #define MAXIMUM_FUNCTION_NAME_LENGTH 51
@ -66,6 +67,7 @@ struct replacement_data_hook_t{
#define MAXIMUM_FUNCTION_PER_PLUGIN 100 #define MAXIMUM_FUNCTION_PER_PLUGIN 100
struct replacement_data_plugin_t{ struct replacement_data_plugin_t{
char path[MAXIMUM_PLUGIN_PATH_NAME_LENGTH];
char plugin_name[MAXIMUM_PLUGIN_NAME_LENGTH] = ""; // Name of this plugin char plugin_name[MAXIMUM_PLUGIN_NAME_LENGTH] = ""; // Name of this plugin
int priority; // Priority of this plugin int priority; // Priority of this plugin
int number_used_functions; // Number of used function. Maximum is MAXIMUM_FUNCTION_PER_PLUGIN int number_used_functions; // Number of used function. Maximum is MAXIMUM_FUNCTION_PER_PLUGIN

View File

@ -77,6 +77,18 @@ std::vector<PluginInformation *> PluginLoader::getPluginInformation(const char *
return result; return result;
} }
std::vector<PluginInformation *> PluginLoader::getPluginsLoadedInMemory(){
std::vector<PluginInformation *> pluginInformation;
for(s32 i = 0; i < gbl_replacement_data.number_used_plugins; i++){
replacement_data_plugin_t * pluginInfo = &gbl_replacement_data.plugin_data[i];
PluginInformation * curPlugin = PluginInformation::loadPluginInformation(pluginInfo->path);
if(curPlugin != NULL){
pluginInformation.push_back(curPlugin);
}
}
return pluginInformation;
}
void PluginLoader::loadAndLinkPlugins(std::vector<PluginInformation *> pluginInformation){ void PluginLoader::loadAndLinkPlugins(std::vector<PluginInformation *> pluginInformation){
std::vector<PluginData *> loadedPlugins; std::vector<PluginData *> loadedPlugins;
for(size_t i = 0;i < pluginInformation.size(); i++){ for(size_t i = 0;i < pluginInformation.size(); i++){
@ -104,6 +116,14 @@ void PluginLoader::clearPluginData(std::vector<PluginData *> pluginData){
} }
} }
void PluginLoader::clearPluginInformation(std::vector<PluginInformation *> pluginInformation){
for(size_t i = 0;i < pluginInformation.size(); i++){
PluginInformation * curPluginInformation = pluginInformation[i];
if(curPluginInformation != NULL){
delete curPluginInformation;
}
}
}
PluginData * PluginLoader::loadAndLinkPlugin(PluginInformation * pluginInformation){ PluginData * PluginLoader::loadAndLinkPlugin(PluginInformation * pluginInformation){
DEBUG_FUNCTION_LINE("\n"); DEBUG_FUNCTION_LINE("\n");
@ -376,6 +396,7 @@ void PluginLoader::copyPluginDataIntoGlobalStruct(std::vector<PluginData *> plug
replacement_data_plugin_t * plugin_data = &gbl_replacement_data.plugin_data[plugin_index]; replacement_data_plugin_t * plugin_data = &gbl_replacement_data.plugin_data[plugin_index];
strncpy(plugin_data->plugin_name,cur_pluginInformation->getName().c_str(),MAXIMUM_PLUGIN_NAME_LENGTH-1); strncpy(plugin_data->plugin_name,cur_pluginInformation->getName().c_str(),MAXIMUM_PLUGIN_NAME_LENGTH-1);
strncpy(plugin_data->path,cur_pluginInformation->getPath().c_str(),MAXIMUM_PLUGIN_PATH_NAME_LENGTH-1);
for(size_t j = 0; j < entry_data_list.size();j++){ for(size_t j = 0; j < entry_data_list.size();j++){
replacement_data_function_t * function_data = &plugin_data->functions[j]; replacement_data_function_t * function_data = &plugin_data->functions[j];

View File

@ -29,6 +29,7 @@
#include <vector> #include <vector>
#include "PluginInformation.h" #include "PluginInformation.h"
#include "PluginData.h" #include "PluginData.h"
#include "dynamic_libs/os_types.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
@ -75,7 +76,7 @@ public:
\return a list of MetaInformation objects for all plugins currently loaded and linked (relocated). Will only contain \return a list of MetaInformation objects for all plugins currently loaded and linked (relocated). Will only contain
plugin which are still on the sd card. plugin which are still on the sd card.
**/ **/
//std::vector<PluginInformation *> getPluginsLoadedInMemory(); std::vector<PluginInformation *> getPluginsLoadedInMemory();
/** /**
\brief Takes a list of plugins that should be linked (relocated) loaded into the memory. \brief Takes a list of plugins that should be linked (relocated) loaded into the memory.
@ -86,6 +87,26 @@ public:
\param A list of plugin that should be linked (relocated) an loaded into memory \param A list of plugin that should be linked (relocated) an loaded into memory
**/ **/
void loadAndLinkPlugins(std::vector<PluginInformation *> pluginInformation); void loadAndLinkPlugins(std::vector<PluginInformation *> pluginInformation);
/**
\brief Iterates through the vector and delete all it's elements
\param A list of PluginInformation* that should be deleted.
**/
void clearPluginInformation(std::vector<PluginInformation*> PluginInformation);
size_t getTotalSpace(){
return ((u32) this->endAddress - (u32) this->startAddress);
}
size_t getAvailableSpace(){
return ((u32) this->currentStoreAddress - (u32) this->startAddress);
}
size_t getUsedSpace(){
return getTotalSpace() - getAvailableSpace();
}
private: private:
PluginLoader(void * startAddress, void * endAddress){ PluginLoader(void * startAddress, void * endAddress){
// TODO: Check if endAddress > startAddress. // TODO: Check if endAddress > startAddress.