diff --git a/source/defines.h b/source/defines.h index 4b149393..ca9b854b 100644 --- a/source/defines.h +++ b/source/defines.h @@ -1,62 +1,62 @@ -#define APP_NAME "WiiFlow" -#define APP_VERSION "Beta 4.2.2" - -#define APPDATA_DIR "wiiflow" -#define APPDATA_DIR2 "apps/wiiflow" - -#define STDEMU_DIR "/wiiflow/nandemu" -#define GAMES_DIR "%s:/wbfs" -#define HOMEBREW_DIR "%s:/apps" -#define DML_DIR "%s:/games" -#define CFG_FILENAME "wiiflow.ini" -#define LANG_FILENAME "languages.ini" -#define CAT_FILENAME "categories_v4.ini" -#define SOURCE_FILENAME "source_menu.ini" -#define TITLES_FILENAME "titles.ini" -#define CTITLES_FILENAME "custom_titles.ini" -#define AGE_LOCK_FILENAME "age_lock.ini" -#define TITLES_DUMP_FILENAME "titlesdump.ini" -#define GAME_SETTINGS1_FILENAME "gameconfig1.ini" -#define GAME_SETTINGS2_FILENAME "gameconfig2.ini" -#define PLUGIN_CRCS_FILENAME "plugin_crc32.ini" - -#define WII_DOMAIN "GAMES" -#define GC_DOMAIN "DML" -#define CHANNEL_DOMAIN "NAND" -#define PLUGIN_DOMAIN "EMULATOR" -#define HOMEBREW_DOMAIN "HOMEBREW" -#define MUSIC_DOMAIN "MUSIC" -#define FTP_DOMAIN "FTP" - -#define AGE_LOCK_DEFAULT 13 - -#define DEVELOPERS "FIX94, Fledge68, OverjoY" -#define PAST_DEVELOPERS "Hibernatus, Narolez, Hulk, Miigotu, r-win" -#define LOADER_AUTHOR "Kwiirk, Waninkoko, Hermes" -#define GUI_AUTHOR "Hibernatus" - -#define THANKS \ -"Lustar, CedWii, Benjay, Domi78, Oops, \ -Celtiore, Jiiwah, FluffyKiwi, Roku93, Yardape8000, \ -Spayrosam, Bluescreen81, Chappy23, mamule, seam, \ -BlindDude, Bubba, DJTaz, OggZee, entropy, Ayatus, \ -Usptactical, WiiPower, Hermes, Spidy1000, megazig, \ -Dimok, Kovani, Drexyl, DvZ, Etheboss, stfour, \ -GaiaKnight, nibb, NJ7, Plasma, Pakatus, giantpune, \ -wolf, ravmn, spidercaleb, Ziggy34, xFede, Abz, \ -and to anyone who has donated or \ -contributed to Wiiflow that we missed!" - -#define THANKS_SITES \ -"devkitpro.org, wiibrew.org, gametdb.com, \ -ohloh.net, wiifanart.com, wiiflowiki.com, \ -tgames.fr.nf" - -#define THANKS_CODE \ -"CFG Loader, Wii Banner Player Project, USB Loader GX, \ -uLoader, NeoGamma, Mighty Channels, WiiXplorer, Triiforce, \ -postLoader" - - -#define WIINNERTAG_URL "http://www.wiinnertag.com/wiinnertag_scripts/update_sign.php?key={KEY}&game_id={ID6}" -#define DUTAG_URL "http://tag.darkumbra.net/{KEY}.update={ID6}" +#define APP_NAME "WiiFlow Lite" +#define APP_VERSION "Beta 4.2.2" + +#define APPDATA_DIR "wiiflow" +#define APPDATA_DIR2 "apps/wiiflow" + +#define STDEMU_DIR "/wiiflow/nandemu" +#define GAMES_DIR "%s:/wbfs" +#define HOMEBREW_DIR "%s:/apps" +#define DML_DIR "%s:/games" +#define CFG_FILENAME "wiiflow_lite.ini" +#define LANG_FILENAME "languages.ini" +#define CAT_FILENAME "categories_lite.ini" +#define SOURCE_FILENAME "source_menu.ini" +#define TITLES_FILENAME "titles.ini" +#define CTITLES_FILENAME "custom_titles.ini" +#define AGE_LOCK_FILENAME "age_lock.ini" +#define TITLES_DUMP_FILENAME "titlesdump.ini" +#define GAME_SETTINGS1_FILENAME "gameconfig1.ini" +#define GAME_SETTINGS2_FILENAME "gameconfig2.ini" +#define PLUGIN_CRCS_FILENAME "plugin_crc32.ini" + +#define WII_DOMAIN "WII" +#define GC_DOMAIN "GAMECUBE" +#define CHANNEL_DOMAIN "CHANNELS" +#define PLUGIN_DOMAIN "PLUGINS" +#define HOMEBREW_DOMAIN "HOMEBREW" +#define MUSIC_DOMAIN "MUSIC" +#define FTP_DOMAIN "FTP" + +#define AGE_LOCK_DEFAULT 13 + +#define DEVELOPERS "FIX94, Fledge68, OverjoY" +#define PAST_DEVELOPERS "Hibernatus, Narolez, Hulk, Miigotu, r-win" +#define LOADER_AUTHOR "Kwiirk, Waninkoko, Hermes" +#define GUI_AUTHOR "Hibernatus" + +#define THANKS \ +"Lustar, CedWii, Benjay, Domi78, Oops, \ +Celtiore, Jiiwah, FluffyKiwi, Roku93, Yardape8000, \ +Spayrosam, Bluescreen81, Chappy23, mamule, seam, \ +BlindDude, Bubba, DJTaz, OggZee, entropy, Ayatus, \ +Usptactical, WiiPower, Hermes, Spidy1000, megazig, \ +Dimok, Kovani, Drexyl, DvZ, Etheboss, stfour, \ +GaiaKnight, nibb, NJ7, Plasma, Pakatus, giantpune, \ +wolf, ravmn, spidercaleb, Ziggy34, xFede, Abz, \ +and to anyone who has donated or \ +contributed to Wiiflow that we missed!" + +#define THANKS_SITES \ +"devkitpro.org, wiibrew.org, gametdb.com, \ +ohloh.net, wiifanart.com, wiiflowiki.com, \ +tgames.fr.nf" + +#define THANKS_CODE \ +"CFG Loader, Wii Banner Player Project, USB Loader GX, \ +uLoader, NeoGamma, Mighty Channels, WiiXplorer, Triiforce, \ +postLoader" + + +#define WIINNERTAG_URL "http://www.wiinnertag.com/wiinnertag_scripts/update_sign.php?key={KEY}&game_id={ID6}" +#define DUTAG_URL "http://tag.darkumbra.net/{KEY}.update={ID6}" diff --git a/source/list/ListGenerator.cpp b/source/list/ListGenerator.cpp index bedb9d6d..bbec5e77 100644 --- a/source/list/ListGenerator.cpp +++ b/source/list/ListGenerator.cpp @@ -1,334 +1,334 @@ -/**************************************************************************** - * Copyright (C) 2012 FIX94 - * - * 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 . - ****************************************************************************/ -#include -#include -#include "ListGenerator.hpp" -#include "cache.hpp" -#include "channel/channels.h" -#include "devicemounter/DeviceHandler.hpp" -#include "fileOps/fileOps.h" -#include "gui/coverflow.hpp" -#include "gui/text.hpp" - -ListGenerator m_gameList; -Config CustomTitles; -GameTDB gameTDB; - -dir_discHdr ListElement; -void ListGenerator::Init(const char *settingsDir, const char *Language) -{ - if(settingsDir != NULL) - { - gameTDB_Path = fmt("%s/wiitdb.xml", settingsDir); - CustomTitlesPath = fmt("%s/" CTITLES_FILENAME, settingsDir); - } - if(Language != NULL) gameTDB_Language = Language; -} - -void ListGenerator::OpenConfigs() -{ - gameTDB.OpenFile(gameTDB_Path.c_str()); - if(gameTDB.IsLoaded()) - gameTDB.SetLanguageCode(gameTDB_Language.c_str()); - CustomTitles.load(CustomTitlesPath.c_str()); -} - -void ListGenerator::CloseConfigs() -{ - if(gameTDB.IsLoaded()) - gameTDB.CloseFile(); - if(CustomTitles.loaded()) - CustomTitles.unload(); -} - -/* -static const u32 LIST_TMP_SIZE = 5000; -dir_discHdr *tmpList = NULL; -u32 tmpListPos = 0; -static void AddToList(const dir_discHdr *element) -{ - -} -*/ -static void AddISO(const char *GameID, const char *GameTitle, const char *GamePath, - u32 GameColor, u8 Type) -{ - memset((void*)&ListElement, 0, sizeof(dir_discHdr)); - ListElement.index = m_gameList.size(); - if(GameID != NULL) strncpy(ListElement.id, GameID, 6); - if(GamePath != NULL) strncpy(ListElement.path, GamePath, sizeof(ListElement.path) - 1); - ListElement.casecolor = CustomTitles.getColor("COVERS", ListElement.id, GameColor).intVal(); - const char *CustomTitle = CustomTitles.getString("TITLES", ListElement.id).c_str(); - if(gameTDB.IsLoaded()) - { - if(ListElement.casecolor == GameColor) - ListElement.casecolor = gameTDB.GetCaseColor(ListElement.id); - ListElement.wifi = gameTDB.GetWifiPlayers(ListElement.id); - ListElement.players = gameTDB.GetPlayers(ListElement.id); - if(CustomTitle == NULL || CustomTitle[0] == '\0') - gameTDB.GetTitle(ListElement.id, CustomTitle); - } - if(!ValidColor(ListElement.casecolor)) - ListElement.casecolor = CoverFlow.InternalCoverColor(ListElement.id, GameColor); - - if(CustomTitle != NULL && CustomTitle[0] != '\0') - mbstowcs(ListElement.title, CustomTitle, 63); - else if(GameTitle != NULL) - mbstowcs(ListElement.title, GameTitle, 63); - Asciify(ListElement.title); - - ListElement.type = Type; - m_gameList.push_back(ListElement); -} - -static void Create_Wii_WBFS_List(wbfs_t *handle) -{ - for(u32 i = 0; i < wbfs_count_discs(handle); i++) - { - memset((void*)&wii_hdr, 0, sizeof(discHdr)); - s32 ret = wbfs_get_disc_info(handle, i, (u8*)&wii_hdr, sizeof(discHdr), NULL); - if(ret == 0 && wii_hdr.magic == WII_MAGIC) - AddISO((const char*)wii_hdr.id, (const char*)wii_hdr.title, - NULL, 0xFFFFFF, TYPE_WII_GAME); - } -} - -static void Create_Wii_EXT_List(char *FullPath) -{ - FILE *fp = fopen(FullPath, "rb"); - if(fp) - { - fseek(fp, strcasestr(FullPath, ".wbfs") != NULL ? 512 : 0, SEEK_SET); - fread((void*)&wii_hdr, 1, sizeof(discHdr), fp); - if(wii_hdr.magic == WII_MAGIC) - AddISO((const char*)wii_hdr.id, (const char*)wii_hdr.title, - FullPath, 0xFFFFFF, TYPE_WII_GAME); - fclose(fp); - } -} - -u8 gc_disc[1]; -const char *FST_APPEND = "sys/boot.bin"; -const u8 FST_APPEND_SIZE = strlen(FST_APPEND); -static void Create_GC_List(char *FullPath) -{ - FILE *fp = fopen(FullPath, "rb"); - if(!fp && strstr(FullPath, "/root") != NULL) //fst folder - { - *(strstr(FullPath, "/root") + 1) = '\0'; - if(strlen(FullPath) + FST_APPEND_SIZE < MAX_MSG_SIZE) strcat(FullPath, FST_APPEND); - fp = fopen(FullPath, "rb"); - } - if(fp) - { - fread((void*)&gc_hdr, 1, sizeof(gc_discHdr), fp); - if(gc_hdr.magic == GC_MAGIC) - { - AddISO((const char*)gc_hdr.id, (const char*)gc_hdr.title, - FullPath, 0x000000, TYPE_GC_GAME); - /* Check for disc 2 */ - fseek(fp, 6, SEEK_SET); - fread(gc_disc, 1, 1, fp); - if(gc_disc[0]) - { - wcslcat(m_gameList.back().title, L" disc 2", 63); - m_gameList.back().settings[0] = 1; - } - } - fclose(fp); - } -} - -const char *FolderTitle = NULL; -static void Create_Plugin_List(char *FullPath) -{ - memset((void*)&ListElement, 0, sizeof(dir_discHdr)); - - strncpy(ListElement.path, FullPath, sizeof(ListElement.path) - 1); - strncpy(ListElement.id, "PLUGIN", 6); - - FolderTitle = strrchr(FullPath, '/') + 1; - *strrchr(FolderTitle, '.') = '\0'; - - char PluginMagicWord[9]; - memset(PluginMagicWord, 0, sizeof(PluginMagicWord)); - strncpy(PluginMagicWord, fmt("%08x", m_gameList.Magic), 8); - const char *CustomTitle = CustomTitles.getString(PluginMagicWord, FolderTitle).c_str(); - if(CustomTitle != NULL && CustomTitle[0] != '\0') - mbstowcs(ListElement.title, CustomTitle, 63); - else - mbstowcs(ListElement.title, FolderTitle, 63); - Asciify(ListElement.title); - - ListElement.settings[0] = m_gameList.Magic; //Plugin magic - ListElement.casecolor = m_gameList.Color; - ListElement.type = TYPE_PLUGIN; - m_gameList.push_back(ListElement); -} - -static void Create_Homebrew_List(char *FullPath) -{ - if(strcasestr(FullPath, "boot.") == NULL) - return; - memset((void*)&ListElement, 0, sizeof(dir_discHdr)); - ListElement.index = m_gameList.size(); - *strrchr(FullPath, '/') = '\0'; - strncpy(ListElement.path, FullPath, sizeof(ListElement.path) - 1); - strncpy(ListElement.id, "HB_APP", 6); - - FolderTitle = strrchr(FullPath, '/') + 1; - ListElement.casecolor = CustomTitles.getColor("COVERS", FolderTitle, 0xFFFFFF).intVal(); - const string &CustomTitle = CustomTitles.getString("TITLES", FolderTitle); - if(CustomTitle.size() > 0) - mbstowcs(ListElement.title, CustomTitle.c_str(), 63); - else - mbstowcs(ListElement.title, FolderTitle, 63); - Asciify(ListElement.title); - - ListElement.type = TYPE_HOMEBREW; - m_gameList.push_back(ListElement); -} - -Channel *chan = NULL; -static void Create_Channel_List() -{ - for(u32 i = 0; i < ChannelHandle.Count(); i++) - { - chan = ChannelHandle.GetChannel(i); - if(chan->id == NULL) - continue; // Skip invalid channels - memset((void*)&ListElement, 0, sizeof(dir_discHdr)); - ListElement.index = m_gameList.size(); - ListElement.settings[0] = TITLE_UPPER(chan->title); - ListElement.settings[1] = TITLE_LOWER(chan->title); - strncpy(ListElement.id, chan->id, 4); - ListElement.casecolor = CustomTitles.getColor("COVERS", ListElement.id, 0xFFFFFF).intVal(); - const char *CustomTitle = CustomTitles.getString("TITLES", ListElement.id).c_str(); - if(gameTDB.IsLoaded()) - { - if(ListElement.casecolor == 0xFFFFFF) - ListElement.casecolor = gameTDB.GetCaseColor(ListElement.id); - ListElement.wifi = gameTDB.GetWifiPlayers(ListElement.id); - ListElement.players = gameTDB.GetPlayers(ListElement.id); - if(CustomTitle == NULL || CustomTitle[0] == '\0') - gameTDB.GetTitle(ListElement.id, CustomTitle); - } - if(CustomTitle != NULL && CustomTitle[0] != '\0') - mbstowcs(ListElement.title, CustomTitle, 63); - else - wcsncpy(ListElement.title, chan->name, 64); - ListElement.type = TYPE_CHANNEL; - m_gameList.push_back(ListElement); - } -} - -void ListGenerator::CreateList(u32 Flow, u32 Device, const string& Path, const vector& FileTypes, - const string& DBName, bool UpdateCache) -{ - if(!DBName.empty()) - { - if(UpdateCache) - fsop_deleteFile(DBName.c_str()); - else - { - CCache(*this, DBName, LOAD); - if(!this->empty()) - return; - fsop_deleteFile(DBName.c_str()); - } - } - //if(Flow != COVERFLOW_PLUGIN) - OpenConfigs(); - if(Flow == COVERFLOW_USB) - { - if(DeviceHandle.GetFSType(Device) == PART_FS_WBFS) - Create_Wii_WBFS_List(DeviceHandle.GetWbfsHandle(Device)); - else - GetFiles(Path.c_str(), FileTypes, Create_Wii_EXT_List, false); - } - else if(Flow == COVERFLOW_CHANNEL) - { - ChannelHandle.Init(gameTDB_Language); - Create_Channel_List(); - } - else if(DeviceHandle.GetFSType(Device) != PART_FS_WBFS) - { - if(Flow == COVERFLOW_DML) - GetFiles(Path.c_str(), FileTypes, Create_GC_List, true); - else if(Flow == COVERFLOW_PLUGIN) - GetFiles(Path.c_str(), FileTypes, Create_Plugin_List, false, 30); - else if(Flow == COVERFLOW_HOMEBREW) - GetFiles(Path.c_str(), FileTypes, Create_Homebrew_List, false); - } - CloseConfigs(); - if(!this->empty() && !DBName.empty()) /* Write a new Cache */ - CCache(*this, DBName, SAVE); -} - -static inline bool IsFileSupported(const char *File, const vector& FileTypes) -{ - for(vector::const_iterator cmp = FileTypes.begin(); cmp != FileTypes.end(); ++cmp) - { - if(strcasecmp(File, cmp->c_str()) == 0) - return true; - } - return false; -} - -const char *NewFileName = NULL; -char *FullPathChar = NULL; -dirent *pent = NULL; -DIR *pdir = NULL; -void GetFiles(const char *Path, const vector& FileTypes, - FileAdder AddFile, bool CompareFolders, u32 max_depth, u32 depth) -{ - vector SubPaths; - - pdir = opendir(Path); - if(pdir == NULL) - return; - while((pent = readdir(pdir)) != NULL) - { - if(pent->d_name[0] == '.') - continue; - FullPathChar = fmt("%s/%s", Path, pent->d_name); - if(pent->d_type == DT_DIR) - { - if(CompareFolders && IsFileSupported(pent->d_name, FileTypes)) - { - AddFile(FullPathChar); - continue; - } - else if(depth < max_depth) //thanks libntfs (fail opendir) and thanks seekdir (slowass speed) - SubPaths.push_back(FullPathChar); - } - else if(pent->d_type == DT_REG) - { - NewFileName = strrchr(pent->d_name, '.'); - if(NewFileName == NULL) NewFileName = pent->d_name; - if(IsFileSupported(NewFileName, FileTypes)) - { - AddFile(FullPathChar); - continue; - } - } - } - closedir(pdir); - for(vector::const_iterator p = SubPaths.begin(); p != SubPaths.end(); ++p) - GetFiles(p->c_str(), FileTypes, AddFile, CompareFolders, max_depth, depth + 1); - SubPaths.clear(); -} +/**************************************************************************** + * Copyright (C) 2012 FIX94 + * + * 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 . + ****************************************************************************/ +#include +#include +#include "ListGenerator.hpp" +#include "cache.hpp" +#include "channel/channels.h" +#include "devicemounter/DeviceHandler.hpp" +#include "fileOps/fileOps.h" +#include "gui/coverflow.hpp" +#include "gui/text.hpp" + +ListGenerator m_gameList; +Config CustomTitles; +GameTDB gameTDB; + +dir_discHdr ListElement; +void ListGenerator::Init(const char *settingsDir, const char *Language) +{ + if(settingsDir != NULL) + { + gameTDB_Path = fmt("%s/wiitdb.xml", settingsDir); + CustomTitlesPath = fmt("%s/" CTITLES_FILENAME, settingsDir); + } + if(Language != NULL) gameTDB_Language = Language; +} + +void ListGenerator::OpenConfigs() +{ + gameTDB.OpenFile(gameTDB_Path.c_str()); + if(gameTDB.IsLoaded()) + gameTDB.SetLanguageCode(gameTDB_Language.c_str()); + CustomTitles.load(CustomTitlesPath.c_str()); +} + +void ListGenerator::CloseConfigs() +{ + if(gameTDB.IsLoaded()) + gameTDB.CloseFile(); + if(CustomTitles.loaded()) + CustomTitles.unload(); +} + +/* +static const u32 LIST_TMP_SIZE = 5000; +dir_discHdr *tmpList = NULL; +u32 tmpListPos = 0; +static void AddToList(const dir_discHdr *element) +{ + +} +*/ +static void AddISO(const char *GameID, const char *GameTitle, const char *GamePath, + u32 GameColor, u8 Type) +{ + memset((void*)&ListElement, 0, sizeof(dir_discHdr)); + ListElement.index = m_gameList.size(); + if(GameID != NULL) strncpy(ListElement.id, GameID, 6); + if(GamePath != NULL) strncpy(ListElement.path, GamePath, sizeof(ListElement.path) - 1); + ListElement.casecolor = CustomTitles.getColor("COVERS", ListElement.id, GameColor).intVal(); + const char *CustomTitle = CustomTitles.getString("TITLES", ListElement.id).c_str(); + if(gameTDB.IsLoaded()) + { + if(ListElement.casecolor == GameColor) + ListElement.casecolor = gameTDB.GetCaseColor(ListElement.id); + ListElement.wifi = gameTDB.GetWifiPlayers(ListElement.id); + ListElement.players = gameTDB.GetPlayers(ListElement.id); + if(CustomTitle == NULL || CustomTitle[0] == '\0') + gameTDB.GetTitle(ListElement.id, CustomTitle); + } + if(!ValidColor(ListElement.casecolor)) + ListElement.casecolor = CoverFlow.InternalCoverColor(ListElement.id, GameColor); + + if(CustomTitle != NULL && CustomTitle[0] != '\0') + mbstowcs(ListElement.title, CustomTitle, 63); + else if(GameTitle != NULL) + mbstowcs(ListElement.title, GameTitle, 63); + Asciify(ListElement.title); + + ListElement.type = Type; + m_gameList.push_back(ListElement); +} + +static void Create_Wii_WBFS_List(wbfs_t *handle) +{ + for(u32 i = 0; i < wbfs_count_discs(handle); i++) + { + memset((void*)&wii_hdr, 0, sizeof(discHdr)); + s32 ret = wbfs_get_disc_info(handle, i, (u8*)&wii_hdr, sizeof(discHdr), NULL); + if(ret == 0 && wii_hdr.magic == WII_MAGIC) + AddISO((const char*)wii_hdr.id, (const char*)wii_hdr.title, + NULL, 0xFFFFFF, TYPE_WII_GAME); + } +} + +static void Create_Wii_EXT_List(char *FullPath) +{ + FILE *fp = fopen(FullPath, "rb"); + if(fp) + { + fseek(fp, strcasestr(FullPath, ".wbfs") != NULL ? 512 : 0, SEEK_SET); + fread((void*)&wii_hdr, 1, sizeof(discHdr), fp); + if(wii_hdr.magic == WII_MAGIC) + AddISO((const char*)wii_hdr.id, (const char*)wii_hdr.title, + FullPath, 0xFFFFFF, TYPE_WII_GAME); + fclose(fp); + } +} + +u8 gc_disc[1]; +const char *FST_APPEND = "sys/boot.bin"; +const u8 FST_APPEND_SIZE = strlen(FST_APPEND); +static void Create_GC_List(char *FullPath) +{ + FILE *fp = fopen(FullPath, "rb"); + if(!fp && strstr(FullPath, "/root") != NULL) //fst folder + { + *(strstr(FullPath, "/root") + 1) = '\0'; + if(strlen(FullPath) + FST_APPEND_SIZE < MAX_MSG_SIZE) strcat(FullPath, FST_APPEND); + fp = fopen(FullPath, "rb"); + } + if(fp) + { + fread((void*)&gc_hdr, 1, sizeof(gc_discHdr), fp); + if(gc_hdr.magic == GC_MAGIC) + { + AddISO((const char*)gc_hdr.id, (const char*)gc_hdr.title, + FullPath, 0x000000, TYPE_GC_GAME); + /* Check for disc 2 */ + fseek(fp, 6, SEEK_SET); + fread(gc_disc, 1, 1, fp); + if(gc_disc[0]) + { + wcslcat(m_gameList.back().title, L" disc 2", 63); + m_gameList.back().settings[0] = 1; + } + } + fclose(fp); + } +} + +const char *FolderTitle = NULL; +static void Create_Plugin_List(char *FullPath) +{ + memset((void*)&ListElement, 0, sizeof(dir_discHdr)); + + strncpy(ListElement.path, FullPath, sizeof(ListElement.path) - 1); + strncpy(ListElement.id, "PLUGIN", 6); + + FolderTitle = strrchr(FullPath, '/') + 1; + *strrchr(FolderTitle, '.') = '\0'; + + char PluginMagicWord[9]; + memset(PluginMagicWord, 0, sizeof(PluginMagicWord)); + strncpy(PluginMagicWord, fmt("%08x", m_gameList.Magic), 8); + const char *CustomTitle = CustomTitles.getString(PluginMagicWord, FolderTitle).c_str(); + if(CustomTitle != NULL && CustomTitle[0] != '\0') + mbstowcs(ListElement.title, CustomTitle, 63); + else + mbstowcs(ListElement.title, FolderTitle, 63); + Asciify(ListElement.title); + + ListElement.settings[0] = m_gameList.Magic; //Plugin magic + ListElement.casecolor = m_gameList.Color; + ListElement.type = TYPE_PLUGIN; + m_gameList.push_back(ListElement); +} + +static void Create_Homebrew_List(char *FullPath) +{ + if(strcasestr(FullPath, "boot.") == NULL) + return; + memset((void*)&ListElement, 0, sizeof(dir_discHdr)); + ListElement.index = m_gameList.size(); + *strrchr(FullPath, '/') = '\0'; + strncpy(ListElement.path, FullPath, sizeof(ListElement.path) - 1); + strncpy(ListElement.id, "HB_APP", 6); + + FolderTitle = strrchr(FullPath, '/') + 1; + ListElement.casecolor = CustomTitles.getColor("COVERS", FolderTitle, 0xFFFFFF).intVal(); + const string &CustomTitle = CustomTitles.getString("TITLES", FolderTitle); + if(CustomTitle.size() > 0) + mbstowcs(ListElement.title, CustomTitle.c_str(), 63); + else + mbstowcs(ListElement.title, FolderTitle, 63); + Asciify(ListElement.title); + + ListElement.type = TYPE_HOMEBREW; + m_gameList.push_back(ListElement); +} + +Channel *chan = NULL; +static void Create_Channel_List() +{ + for(u32 i = 0; i < ChannelHandle.Count(); i++) + { + chan = ChannelHandle.GetChannel(i); + if(chan->id == NULL) + continue; // Skip invalid channels + memset((void*)&ListElement, 0, sizeof(dir_discHdr)); + ListElement.index = m_gameList.size(); + ListElement.settings[0] = TITLE_UPPER(chan->title); + ListElement.settings[1] = TITLE_LOWER(chan->title); + strncpy(ListElement.id, chan->id, 4); + ListElement.casecolor = CustomTitles.getColor("COVERS", ListElement.id, 0xFFFFFF).intVal(); + const char *CustomTitle = CustomTitles.getString("TITLES", ListElement.id).c_str(); + if(gameTDB.IsLoaded()) + { + if(ListElement.casecolor == 0xFFFFFF) + ListElement.casecolor = gameTDB.GetCaseColor(ListElement.id); + ListElement.wifi = gameTDB.GetWifiPlayers(ListElement.id); + ListElement.players = gameTDB.GetPlayers(ListElement.id); + if(CustomTitle == NULL || CustomTitle[0] == '\0') + gameTDB.GetTitle(ListElement.id, CustomTitle); + } + if(CustomTitle != NULL && CustomTitle[0] != '\0') + mbstowcs(ListElement.title, CustomTitle, 63); + else + wcsncpy(ListElement.title, chan->name, 64); + ListElement.type = TYPE_CHANNEL; + m_gameList.push_back(ListElement); + } +} + +void ListGenerator::CreateList(u32 Flow, u32 Device, const string& Path, const vector& FileTypes, + const string& DBName, bool UpdateCache) +{ + if(!DBName.empty()) + { + if(UpdateCache) + fsop_deleteFile(DBName.c_str()); + else + { + CCache(*this, DBName, LOAD); + if(!this->empty()) + return; + fsop_deleteFile(DBName.c_str()); + } + } + //if(Flow != COVERFLOW_PLUGIN) + OpenConfigs(); + if(Flow == COVERFLOW_WII) + { + if(DeviceHandle.GetFSType(Device) == PART_FS_WBFS) + Create_Wii_WBFS_List(DeviceHandle.GetWbfsHandle(Device)); + else + GetFiles(Path.c_str(), FileTypes, Create_Wii_EXT_List, false); + } + else if(Flow == COVERFLOW_CHANNEL) + { + ChannelHandle.Init(gameTDB_Language); + Create_Channel_List(); + } + else if(DeviceHandle.GetFSType(Device) != PART_FS_WBFS) + { + if(Flow == COVERFLOW_GAMECUBE) + GetFiles(Path.c_str(), FileTypes, Create_GC_List, true); + else if(Flow == COVERFLOW_PLUGIN) + GetFiles(Path.c_str(), FileTypes, Create_Plugin_List, false, 30); + else if(Flow == COVERFLOW_HOMEBREW) + GetFiles(Path.c_str(), FileTypes, Create_Homebrew_List, false); + } + CloseConfigs(); + if(!this->empty() && !DBName.empty()) /* Write a new Cache */ + CCache(*this, DBName, SAVE); +} + +static inline bool IsFileSupported(const char *File, const vector& FileTypes) +{ + for(vector::const_iterator cmp = FileTypes.begin(); cmp != FileTypes.end(); ++cmp) + { + if(strcasecmp(File, cmp->c_str()) == 0) + return true; + } + return false; +} + +const char *NewFileName = NULL; +char *FullPathChar = NULL; +dirent *pent = NULL; +DIR *pdir = NULL; +void GetFiles(const char *Path, const vector& FileTypes, + FileAdder AddFile, bool CompareFolders, u32 max_depth, u32 depth) +{ + vector SubPaths; + + pdir = opendir(Path); + if(pdir == NULL) + return; + while((pent = readdir(pdir)) != NULL) + { + if(pent->d_name[0] == '.') + continue; + FullPathChar = fmt("%s/%s", Path, pent->d_name); + if(pent->d_type == DT_DIR) + { + if(CompareFolders && IsFileSupported(pent->d_name, FileTypes)) + { + AddFile(FullPathChar); + continue; + } + else if(depth < max_depth) //thanks libntfs (fail opendir) and thanks seekdir (slowass speed) + SubPaths.push_back(FullPathChar); + } + else if(pent->d_type == DT_REG) + { + NewFileName = strrchr(pent->d_name, '.'); + if(NewFileName == NULL) NewFileName = pent->d_name; + if(IsFileSupported(NewFileName, FileTypes)) + { + AddFile(FullPathChar); + continue; + } + } + } + closedir(pdir); + for(vector::const_iterator p = SubPaths.begin(); p != SubPaths.end(); ++p) + GetFiles(p->c_str(), FileTypes, AddFile, CompareFolders, max_depth, depth + 1); + SubPaths.clear(); +} diff --git a/source/menu/menu.cpp b/source/menu/menu.cpp index aaae7ade..ba0d07f4 100644 --- a/source/menu/menu.cpp +++ b/source/menu/menu.cpp @@ -70,7 +70,7 @@ CMenu::CMenu() m_base_font_size = 0; m_wbf1_font = NULL; m_wbf2_font = NULL; - m_current_view = COVERFLOW_USB; + m_current_view = COVERFLOW_WII; m_Emulator_boot = false; m_music_info = true; m_prevBg = NULL; @@ -325,7 +325,7 @@ void CMenu::init() break; } if (DeviceHandle.IsInserted(i) - && ((m_current_view == COVERFLOW_USB && DeviceHandle.GetFSType(i) == PART_FS_WBFS) + && ((m_current_view == COVERFLOW_WII && DeviceHandle.GetFSType(i) == PART_FS_WBFS) || stat(fmt(checkDir, DeviceName[i]), &dummy) == 0)) { gprintf("Setting Emu NAND to Partition: %i\n",currentPartition); @@ -2256,10 +2256,10 @@ bool CMenu::_loadList(void) for(vector::iterator tmp_itr = m_gameList.begin(); tmp_itr != m_gameList.end(); tmp_itr++) combinedList.push_back(*tmp_itr); } - if((m_current_view == COVERFLOW_USB && !m_cfg.has(WII_DOMAIN, "source")) || + if((m_current_view == COVERFLOW_WII && !m_cfg.has(WII_DOMAIN, "source")) || m_cfg.getBool(WII_DOMAIN, "source")) { - m_current_view = COVERFLOW_USB; + m_current_view = COVERFLOW_WII; _loadGameList(); if(m_combined_view) for(vector::iterator tmp_itr = m_gameList.begin(); tmp_itr != m_gameList.end(); tmp_itr++) @@ -2274,10 +2274,10 @@ bool CMenu::_loadList(void) for(vector::iterator tmp_itr = m_gameList.begin(); tmp_itr != m_gameList.end(); tmp_itr++) combinedList.push_back(*tmp_itr); } - if((m_current_view == COVERFLOW_DML && !m_cfg.has(GC_DOMAIN, "source")) || + if((m_current_view == COVERFLOW_GAMECUBE && !m_cfg.has(GC_DOMAIN, "source")) || m_cfg.getBool(GC_DOMAIN, "source")) { - m_current_view = COVERFLOW_DML; + m_current_view = COVERFLOW_GAMECUBE; _loadDmlList(); if(m_combined_view) for(vector::iterator tmp_itr = m_gameList.begin(); tmp_itr != m_gameList.end(); tmp_itr++) @@ -2316,7 +2316,7 @@ bool CMenu::_loadGameList(void) string gameDir(fmt(wii_games_dir, DeviceName[currentPartition])); string cacheDir(fmt("%s/%s_wii.db", m_listCacheDir.c_str(), DeviceName[currentPartition])); bool updateCache = m_cfg.getBool(WII_DOMAIN, "update_cache"); - m_gameList.CreateList(COVERFLOW_USB, currentPartition, gameDir, stringToVector(".wbfs|.iso", '|'), cacheDir, updateCache); + m_gameList.CreateList(COVERFLOW_WII, currentPartition, gameDir, stringToVector(".wbfs|.iso", '|'), cacheDir, updateCache); WBFS_Close(); m_cfg.remove(WII_DOMAIN, "update_cache"); return true; @@ -2347,7 +2347,7 @@ bool CMenu::_loadDmlList() string gameDir(fmt(currentPartition == SD ? DML_DIR : m_DMLgameDir.c_str(), DeviceName[currentPartition])); string cacheDir(fmt("%s/%s_gamecube.db", m_listCacheDir.c_str(), DeviceName[currentPartition])); bool updateCache = m_cfg.getBool(GC_DOMAIN, "update_cache"); - m_gameList.CreateList(COVERFLOW_DML, currentPartition, gameDir, + m_gameList.CreateList(COVERFLOW_GAMECUBE, currentPartition, gameDir, stringToVector(".iso|root", '|'),cacheDir, updateCache); m_cfg.remove(GC_DOMAIN, "update_cache"); return true; @@ -2381,10 +2381,9 @@ bool CMenu::_loadEmuList() if(m_plugin_cfg.loaded()) { m_plugin.AddPlugin(m_plugin_cfg); - const char *MagicNumber = m_plugin_cfg.getString(PLUGIN_INI_DEF,"magic").c_str(); - if(!m_cfg.getBool("PLUGIN", MagicNumber, false)) + u32 MagicWord = strtoul(m_plugin_cfg.getString(PLUGIN_INI_DEF,"magic").c_str(), NULL, 16); + if(!m_plugin.GetEnableStatus(m_cfg, MagicWord)) continue; - u32 MagicWord = strtoul(MagicNumber, NULL, 16); if(m_plugin_cfg.getString(PLUGIN_INI_DEF,"romDir").find("scummvm.ini") == string::npos) { string gameDir(fmt("%s:/%s", DeviceName[currentPartition], m_plugin_cfg.getString(PLUGIN_INI_DEF,"romDir").c_str())); @@ -2616,7 +2615,7 @@ const char *CMenu::_domainFromView() return CHANNEL_DOMAIN; case COVERFLOW_HOMEBREW: return HOMEBREW_DOMAIN; - case COVERFLOW_DML: + case COVERFLOW_GAMECUBE: return GC_DOMAIN; case COVERFLOW_PLUGIN: return PLUGIN_DOMAIN; @@ -2630,9 +2629,9 @@ void CMenu::UpdateCache(u32 view) { if(view == COVERFLOW_MAX) { - UpdateCache(COVERFLOW_USB); + UpdateCache(COVERFLOW_WII); UpdateCache(COVERFLOW_HOMEBREW); - UpdateCache(COVERFLOW_DML); + UpdateCache(COVERFLOW_GAMECUBE); UpdateCache(COVERFLOW_PLUGIN); UpdateCache(COVERFLOW_CHANNEL); return; @@ -2645,7 +2644,7 @@ void CMenu::UpdateCache(u32 view) case COVERFLOW_HOMEBREW: m_cfg.setBool(HOMEBREW_DOMAIN, "update_cache", true); break; - case COVERFLOW_DML: + case COVERFLOW_GAMECUBE: m_cfg.setBool(GC_DOMAIN, "update_cache", true); break; case COVERFLOW_PLUGIN: diff --git a/source/menu/menu_categories.cpp b/source/menu/menu_categories.cpp index 387cf928..218952f7 100644 --- a/source/menu/menu_categories.cpp +++ b/source/menu/menu_categories.cpp @@ -115,16 +115,16 @@ void CMenu::_getIDCats(void) switch(hdr->type) { case TYPE_CHANNEL: - catDomain = "NAND"; + catDomain = "CHANNELS"; break; case TYPE_HOMEBREW: catDomain = "HOMEBREW"; break; case TYPE_GC_GAME: - catDomain = "DML"; + catDomain = "GAMECUBE"; break; case TYPE_WII_GAME: - catDomain = "GAMES"; + catDomain = "WII"; break; default: catDomain = (m_plugin.GetPluginName(m_plugin.GetPluginPosition(hdr->settings[0]))).toUTF8(); diff --git a/source/menu/menu_config3.cpp b/source/menu/menu_config3.cpp index 46419c52..d1de326b 100644 --- a/source/menu/menu_config3.cpp +++ b/source/menu/menu_config3.cpp @@ -12,7 +12,7 @@ void CMenu::_hideConfig3(bool instant) { _hideConfigCommon(instant); - if(m_current_view != COVERFLOW_DML) + if(m_current_view != COVERFLOW_GAMECUBE) { m_btnMgr.hide(m_config3LblGameLanguage, instant); m_btnMgr.hide(m_config3LblLanguage, instant); @@ -49,7 +49,7 @@ void CMenu::_showConfig3(void) { _showConfigCommon(m_config3Bg, g_curPage); - if(m_current_view != COVERFLOW_DML) + if(m_current_view != COVERFLOW_GAMECUBE) { m_btnMgr.show(m_config3LblGameLanguage); m_btnMgr.show(m_config3LblLanguage); @@ -84,7 +84,7 @@ void CMenu::_showConfig3(void) int i; - if(m_current_view != COVERFLOW_DML) + if(m_current_view != COVERFLOW_GAMECUBE) { i = min(max(0, m_cfg.getInt("GENERAL", "video_mode", 0)), (int)ARRAY_SIZE(CMenu::_GlobalVideoModes) - 1); m_btnMgr.setText(m_config3LblVideo, _t(CMenu::_GlobalVideoModes[i].id, CMenu::_GlobalVideoModes[i].text)); diff --git a/source/menu/menu_main.cpp b/source/menu/menu_main.cpp index c5354b9b..f190834d 100644 --- a/source/menu/menu_main.cpp +++ b/source/menu/menu_main.cpp @@ -67,7 +67,7 @@ start_main: switch(m_current_view) { - case COVERFLOW_DML: + case COVERFLOW_GAMECUBE: if(show_channel) m_btnMgr.show(m_mainBtnChannel); else if(show_emu) @@ -117,8 +117,8 @@ start_main: { switch(m_current_view) { - case COVERFLOW_USB: - case COVERFLOW_DML: + case COVERFLOW_WII: + case COVERFLOW_GAMECUBE: m_btnMgr.setText(m_mainLblInit, _t("main2", L"Welcome to WiiFlow. I have not found any games. Click Install to install games, or Select partition to select your partition type.")); m_btnMgr.show(m_mainBtnInit); m_btnMgr.show(m_mainBtnInit2); @@ -354,9 +354,9 @@ int CMenu::main(void) { u8 lastView = m_current_view; if(BTN_UP_PRESSED) - m_current_view = COVERFLOW_USB; + m_current_view = COVERFLOW_WII; else if(BTN_DOWN_PRESSED && (m_show_dml || m_devo_installed || m_nintendont_installed)) - m_current_view = COVERFLOW_DML; + m_current_view = COVERFLOW_GAMECUBE; else if(BTN_LEFT_PRESSED && show_emu) m_current_view = COVERFLOW_PLUGIN; else if(BTN_RIGHT_PRESSED && show_channel) @@ -366,10 +366,10 @@ int CMenu::main(void) _clearSources(); switch(m_current_view) { - case COVERFLOW_USB: + case COVERFLOW_WII: m_cfg.setBool(WII_DOMAIN, "source", true); break; - case COVERFLOW_DML: + case COVERFLOW_GAMECUBE: m_cfg.setBool(GC_DOMAIN, "source", true); break; case COVERFLOW_CHANNEL: @@ -412,25 +412,25 @@ int CMenu::main(void) } else if(m_btnMgr.selected(m_mainBtnChannel) || m_btnMgr.selected(m_mainBtnUsb) || m_btnMgr.selected(m_mainBtnDML) || m_btnMgr.selected(m_mainBtnHomebrew) || m_btnMgr.selected(m_mainBtnEmu)) { - if(m_current_view == COVERFLOW_USB) - m_current_view = (m_show_dml || m_devo_installed || m_nintendont_installed) ? COVERFLOW_DML : + if(m_current_view == COVERFLOW_WII) + m_current_view = (m_show_dml || m_devo_installed || m_nintendont_installed) ? COVERFLOW_GAMECUBE : (show_channel ? COVERFLOW_CHANNEL : (show_emu ? COVERFLOW_PLUGIN : - ((show_homebrew && (parental_homebrew || !m_locked)) ? COVERFLOW_HOMEBREW : COVERFLOW_USB))); - else if(m_current_view == COVERFLOW_DML) - m_current_view = show_channel ? COVERFLOW_CHANNEL : ((show_emu ? COVERFLOW_PLUGIN : (show_homebrew && (parental_homebrew || !m_locked)) ? COVERFLOW_HOMEBREW : COVERFLOW_USB)); + ((show_homebrew && (parental_homebrew || !m_locked)) ? COVERFLOW_HOMEBREW : COVERFLOW_WII))); + else if(m_current_view == COVERFLOW_GAMECUBE) + m_current_view = show_channel ? COVERFLOW_CHANNEL : ((show_emu ? COVERFLOW_PLUGIN : (show_homebrew && (parental_homebrew || !m_locked)) ? COVERFLOW_HOMEBREW : COVERFLOW_WII)); else if(m_current_view == COVERFLOW_CHANNEL) - m_current_view = (show_emu ? COVERFLOW_PLUGIN : (show_homebrew && (parental_homebrew || !m_locked)) ? COVERFLOW_HOMEBREW : COVERFLOW_USB); + m_current_view = (show_emu ? COVERFLOW_PLUGIN : (show_homebrew && (parental_homebrew || !m_locked)) ? COVERFLOW_HOMEBREW : COVERFLOW_WII); else if(m_current_view == COVERFLOW_PLUGIN) - m_current_view = (show_homebrew && (parental_homebrew || !m_locked)) ? COVERFLOW_HOMEBREW : COVERFLOW_USB; + m_current_view = (show_homebrew && (parental_homebrew || !m_locked)) ? COVERFLOW_HOMEBREW : COVERFLOW_WII; else if(m_current_view == COVERFLOW_HOMEBREW || m_current_view == COVERFLOW_MAX) - m_current_view = COVERFLOW_USB; + m_current_view = COVERFLOW_WII; _clearSources(); switch(m_current_view) { - case COVERFLOW_USB: + case COVERFLOW_WII: m_cfg.setBool(WII_DOMAIN, "source", true); break; - case COVERFLOW_DML: + case COVERFLOW_GAMECUBE: m_cfg.setBool(GC_DOMAIN, "source", true); break; case COVERFLOW_CHANNEL: @@ -829,7 +829,7 @@ int CMenu::main(void) { switch(m_current_view) { - case COVERFLOW_DML: + case COVERFLOW_GAMECUBE: if(show_channel) m_btnMgr.show(m_mainBtnChannel); else if(show_emu) @@ -1186,7 +1186,7 @@ void CMenu::_setPartition(s8 direction) m_cfg.setBool(CHANNEL_DOMAIN, "disable", false); switch_to_real = false; } - bool NeedFAT = m_current_view == COVERFLOW_CHANNEL || m_current_view == COVERFLOW_DML; + bool NeedFAT = m_current_view == COVERFLOW_CHANNEL || m_current_view == COVERFLOW_GAMECUBE; u8 limiter = 0; do @@ -1198,7 +1198,7 @@ void CMenu::_setPartition(s8 direction) limiter++; } while(limiter < 12 && (!DeviceHandle.IsInserted(currentPartition) || - (m_current_view != COVERFLOW_USB && FS_Type == PART_FS_WBFS) || + (m_current_view != COVERFLOW_WII && FS_Type == PART_FS_WBFS) || (NeedFAT && FS_Type != PART_FS_FAT))); if(m_current_view == COVERFLOW_CHANNEL && FS_Type == -1) @@ -1226,7 +1226,7 @@ void CMenu::_setPartition(s8 direction) char PluginMagicWord[9]; memset(PluginMagicWord, 0, sizeof(PluginMagicWord)); strncpy(PluginMagicWord, fmt("%08x", m_plugin.getPluginMagic(i)), 8); - m_cfg.setInt("PLUGINS/PARTITION", PluginMagicWord, currentPartition); + m_cfg.setInt("PLUGINS_PARTITION", PluginMagicWord, currentPartition); } } } diff --git a/source/menu/menu_nandemu.cpp b/source/menu/menu_nandemu.cpp index 96bba097..26ab0aff 100644 --- a/source/menu/menu_nandemu.cpp +++ b/source/menu/menu_nandemu.cpp @@ -112,7 +112,7 @@ int CMenu::_FindEmuPart(string &emuPath, bool skipchecks) m_cfg.setString(CHANNEL_DOMAIN, "path", STDEMU_DIR); } } - else if(m_current_view == COVERFLOW_USB) + else if(m_current_view == COVERFLOW_WII) { emuPart = m_cfg.getInt(WII_DOMAIN, "savepartition", -1); if(emuPart == -1) @@ -241,7 +241,7 @@ void CMenu::_showNandEmu(void) if(nandemuPage == 1) { int i; - if(((m_current_view == COVERFLOW_CHANNEL && !m_cfg.getBool(CHANNEL_DOMAIN, "disable", true)) || m_current_view == COVERFLOW_USB)) + if(((m_current_view == COVERFLOW_CHANNEL && !m_cfg.getBool(CHANNEL_DOMAIN, "disable", true)) || m_current_view == COVERFLOW_WII)) { m_btnMgr.show(m_nandemuLblEmulation); m_btnMgr.show(m_nandemuLblEmulationVal); @@ -249,7 +249,7 @@ void CMenu::_showNandEmu(void) m_btnMgr.show(m_nandemuBtnEmulationM); } - if((m_current_view == COVERFLOW_CHANNEL || m_current_view == COVERFLOW_USB)) + if((m_current_view == COVERFLOW_CHANNEL || m_current_view == COVERFLOW_WII)) { m_btnMgr.show(m_nandemuLblSaveDump); m_btnMgr.show(m_nandemuBtnAll); @@ -261,7 +261,7 @@ void CMenu::_showNandEmu(void) i = min(max(0, m_cfg.getInt(CHANNEL_DOMAIN, "emulation", 0)), (int)ARRAY_SIZE(CMenu::_NandEmu) - 1); m_btnMgr.setText(m_nandemuLblEmulationVal, _t(CMenu::_NandEmu[i].id, CMenu::_NandEmu[i].text)); } - else if (m_current_view == COVERFLOW_USB) + else if (m_current_view == COVERFLOW_WII) { i = min(max(0, m_cfg.getInt(WII_DOMAIN, "save_emulation", 0)), (int)ARRAY_SIZE(CMenu::_GlobalSaveEmu) - 1); m_btnMgr.setText(m_nandemuLblEmulationVal, _t(CMenu::_GlobalSaveEmu[i].id, CMenu::_GlobalSaveEmu[i].text)); @@ -375,7 +375,7 @@ int CMenu::_NandEmuCfg(void) s8 direction = m_btnMgr.selected(m_nandemuBtnEmulationP) ? 1 : -1; if(m_current_view == COVERFLOW_CHANNEL) m_cfg.setInt(CHANNEL_DOMAIN, "emulation", (int)loopNum((u32)m_cfg.getInt(CHANNEL_DOMAIN, "emulation", 0) + direction, ARRAY_SIZE(CMenu::_NandEmu))); - else if(m_current_view == COVERFLOW_USB) + else if(m_current_view == COVERFLOW_WII) m_cfg.setInt(WII_DOMAIN, "save_emulation", (int)loopNum((u32)m_cfg.getInt(WII_DOMAIN, "save_emulation", 0) + direction, ARRAY_SIZE(CMenu::_GlobalSaveEmu))); _showNandEmu(); } @@ -459,7 +459,7 @@ int CMenu::_NandEmuCfg(void) { _hideNandEmu(true); u8 tmpView = m_current_view; - m_current_view = COVERFLOW_USB; + m_current_view = COVERFLOW_WII; string emuPath; _FindEmuPart(emuPath, true); path = _FolderExplorer(NandHandle.GetPath()); @@ -804,7 +804,7 @@ int CMenu::_AutoCreateNand(void) } else if(m_btnMgr.selected(m_nandemuBtnPartition)) { - if(m_current_view == COVERFLOW_USB) + if(m_current_view == COVERFLOW_WII) { m_tempView = true; m_current_view = COVERFLOW_CHANNEL; @@ -813,7 +813,7 @@ int CMenu::_AutoCreateNand(void) _config(1); if(m_tempView) { - m_current_view = COVERFLOW_USB; + m_current_view = COVERFLOW_WII; m_tempView = false; return 0; } diff --git a/source/menu/menu_source.cpp b/source/menu/menu_source.cpp index 8edea1cf..d2d50ea6 100644 --- a/source/menu/menu_source.cpp +++ b/source/menu/menu_source.cpp @@ -113,7 +113,8 @@ void CMenu::_updateSourceBtns(void) { magicNums.clear(); magicNums = m_source.getStrings(fmt("BUTTON_%i", i), "magic", ','); - if(m_cfg.getBool(PLUGIN_DOMAIN, "source", false) && m_cfg.getBool("PLUGIN", magicNums.at(0), false)) + u32 magic = strtoul(magicNums.at(0).c_str(), NULL, 16); + if(m_cfg.getBool(PLUGIN_DOMAIN, "source", false) && m_plugin.GetEnableStatus(m_cfg, magic)) { sourceBtn = i; selectedBtns++; @@ -256,13 +257,13 @@ void CMenu::_sourceFlow() _clearSources(); if(source == "wii") { - m_current_view = COVERFLOW_USB; + m_current_view = COVERFLOW_WII; m_cfg.setBool(WII_DOMAIN, "source", true); m_catStartPage = m_source.getInt(btn_selected, "cat_page", 1); } else if(source == "dml") { - m_current_view = COVERFLOW_DML; + m_current_view = COVERFLOW_GAMECUBE; m_cfg.setBool(GC_DOMAIN, "source", true); m_catStartPage = m_source.getInt(btn_selected, "cat_page", 1); } @@ -312,7 +313,7 @@ void CMenu::_sourceFlow() m_plugin.SetEnablePlugin(m_cfg, exist, 2); if(plugin_magic_nums == 1) { - currentPartition = m_cfg.getInt("PLUGINS/PARTITION", itr->c_str(), 1); + currentPartition = m_cfg.getInt("PLUGINS_PARTITION", itr->c_str(), 1); m_cfg.setInt(PLUGIN_DOMAIN, "partition", currentPartition); } } @@ -476,7 +477,7 @@ bool CMenu::_Source() char PluginMagicWord[9]; memset(PluginMagicWord, 0, sizeof(PluginMagicWord)); strncpy(PluginMagicWord, fmt("%08x", m_plugin.getPluginMagic(i)), 8); - currentPartition = m_cfg.getInt("PLUGINS/PARTITION", PluginMagicWord, 1); + currentPartition = m_cfg.getInt("PLUGINS_PARTITION", PluginMagicWord, 1); m_cfg.setInt(PLUGIN_DOMAIN, "partition", currentPartition); } u8 sourceCount = 0; @@ -669,7 +670,7 @@ bool CMenu::_Source() m_plugin.SetEnablePlugin(m_cfg, exist, 2); if(plugin_magic_nums == 1) { - currentPartition = m_cfg.getInt("PLUGINS/PARTITION", itr->c_str(), 1); + currentPartition = m_cfg.getInt("PLUGINS_PARTITION", itr->c_str(), 1); m_cfg.setInt(PLUGIN_DOMAIN, "partition", currentPartition); } } diff --git a/source/menu/menu_wbfs.cpp b/source/menu/menu_wbfs.cpp index 3440fe5b..28aa18b9 100644 --- a/source/menu/menu_wbfs.cpp +++ b/source/menu/menu_wbfs.cpp @@ -511,9 +511,9 @@ bool CMenu::_wbfsOp(CMenu::WBFS_OP op) //m_gameList.SetLanguage(m_loc.getString(m_curLanguage, "gametdb_code", "EN").c_str()); _showWaitMessage(); if(upd_dml) - UpdateCache(COVERFLOW_DML); + UpdateCache(COVERFLOW_GAMECUBE); if(upd_usb) - UpdateCache(COVERFLOW_USB); + UpdateCache(COVERFLOW_WII); if(upd_emu) UpdateCache(COVERFLOW_PLUGIN); if(upd_chan) @@ -531,9 +531,9 @@ bool CMenu::_wbfsOp(CMenu::WBFS_OP op) { if(done && op == WO_COPY_GAME) { - UpdateCache(COVERFLOW_DML); + UpdateCache(COVERFLOW_GAMECUBE); currentPartition = SD; - UpdateCache(COVERFLOW_DML); + UpdateCache(COVERFLOW_GAMECUBE); } _loadList(); _initCF(); diff --git a/source/plugin/plugin.cpp b/source/plugin/plugin.cpp index 74d8254b..ed1f35ee 100644 --- a/source/plugin/plugin.cpp +++ b/source/plugin/plugin.cpp @@ -1,313 +1,313 @@ -/**************************************************************************** - * Copyright (C) 2012 FIX94 - * - * 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 . - ****************************************************************************/ -#include -#include -#include -#include -#include -#include -#include "plugin.hpp" -#include "fileOps/fileOps.h" -#include "gui/text.hpp" -#include "gecko/gecko.hpp" -#include "devicemounter/PartitionHandle.h" -#include "devicemounter/DeviceHandler.hpp" -#include "types.h" -#include "crc32.h" - -Plugin m_plugin; -void Plugin::init(const string& m_pluginsDir) -{ - PluginMagicWord[8] = '\0'; - pluginsDir = m_pluginsDir; - //Ready to add plugins - adding = true; -} - -static bool PluginOptions_cmp(PluginOptions lhs, PluginOptions rhs) -{ - const wchar_t *first = lhs.DisplayName.c_str(); - const wchar_t *second = rhs.DisplayName.c_str(); - return wchar_cmp(first, second, wcslen(first), wcslen(second)); -} - -void Plugin::EndAdd() -{ - std::sort(Plugins.begin(), Plugins.end(), PluginOptions_cmp); - adding = false; -} - -void Plugin::Cleanup() -{ - Plugins.clear(); - adding = true; -} - -bool Plugin::AddPlugin(Config &plugin) -{ - if(!adding) - return false; - - PluginOptions NewPlugin; - NewPlugin.DolName = plugin.getString(PLUGIN_INI_DEF, "dolFile"); - NewPlugin.coverFolder = plugin.getString(PLUGIN_INI_DEF, "coverFolder"); - NewPlugin.magicWord = strtoul(plugin.getString(PLUGIN_INI_DEF, "magic").c_str(), NULL, 16); - NewPlugin.caseColor = strtoul(plugin.getString(PLUGIN_INI_DEF, "coverColor").c_str(), NULL, 16); - NewPlugin.Args = plugin.getStrings(PLUGIN_INI_DEF, "arguments", '|'); - string PluginName = plugin.getString(PLUGIN_INI_DEF, "displayname"); - if(PluginName.size() < 2) - { - PluginName = NewPlugin.DolName; - PluginName.erase(PluginName.end() - 4, PluginName.end()); - } - NewPlugin.DisplayName.fromUTF8(PluginName.c_str()); - NewPlugin.consoleCoverID = plugin.getString(PLUGIN_INI_DEF,"consoleCoverID"); - - const string &bannerfilepath = sfmt("%s/%s", pluginsDir.c_str(), plugin.getString(PLUGIN_INI_DEF,"bannerSound").c_str()); - fsop_GetFileSizeBytes(bannerfilepath.c_str(), &NewPlugin.BannerSoundSize); - if(NewPlugin.BannerSoundSize > 0) - NewPlugin.BannerSound = bannerfilepath; - Plugins.push_back(NewPlugin); - return false; -} - -s8 Plugin::GetPluginPosition(u32 magic) -{ - for(u8 pos = 0; pos < Plugins.size(); pos++) - { - if(magic == Plugins[pos].magicWord) - return pos; - } - return -1; -} - -u8* Plugin::GetBannerSound(u32 magic) -{ - if((Plugin_Pos = GetPluginPosition(magic)) >= 0) - { - u32 size = 0; - return fsop_ReadFile(Plugins[Plugin_Pos].BannerSound.c_str(), &size); - } - return NULL; -} - -u32 Plugin::GetBannerSoundSize() -{ - //We call that directly after GetBannerSound, so no need to search for the magic again - if(Plugin_Pos >= 0) - return Plugins[Plugin_Pos].BannerSoundSize; - return 0; -} - -const char *Plugin::GetDolName(u32 magic) -{ - if((Plugin_Pos = GetPluginPosition(magic)) >= 0) - return Plugins[Plugin_Pos].DolName.c_str(); - return NULL; -} - -const char *Plugin::GetCoverFolderName(u32 magic) -{ - if((Plugin_Pos = GetPluginPosition(magic)) >= 0) - return Plugins[Plugin_Pos].coverFolder.c_str(); - return NULL; -} - -bool Plugin::PluginExist(u8 pos) -{ - if(pos < Plugins.size()) - return true; - return false; -} - -wstringEx Plugin::GetPluginName(u8 pos) -{ - return Plugins[pos].DisplayName; -} - -void Plugin::SetEnablePlugin(Config &cfg, u8 pos, u8 ForceMode) -{ - if(pos < Plugins.size()) - { - strncpy(PluginMagicWord, fmt("%08x", Plugins[pos].magicWord), 8); - if(ForceMode == 1) - cfg.setBool(PLUGIN_INI_DEF, PluginMagicWord, false); - else if(ForceMode == 2) - cfg.setBool(PLUGIN_INI_DEF, PluginMagicWord, true); - else - cfg.setBool(PLUGIN_INI_DEF, PluginMagicWord, cfg.getBool(PLUGIN_INI_DEF, PluginMagicWord) ? false : true); - } -} - -bool Plugin::GetEnableStatus(Config &cfg, u32 magic) -{ - if((Plugin_Pos = GetPluginPosition(magic)) >= 0) - { - strncpy(PluginMagicWord, fmt("%08x", magic), 8); - return cfg.getBool(PLUGIN_INI_DEF, PluginMagicWord, true); - } - return false; -} - -const vector &Plugin::GetEnabledPlugins(Config &cfg, u8 *num) -{ - enabledPlugins.clear(); - u8 enabledPluginsNumber = 0; - for(u8 i = 0; i < Plugins.size(); i++) - { - strncpy(PluginMagicWord, fmt("%08x", Plugins[i].magicWord), 8); - if(cfg.getBool(PLUGIN_INI_DEF, PluginMagicWord, true)) - { - enabledPluginsNumber++; - enabledPlugins.push_back(true); - } - else - enabledPlugins.push_back(false); - } - if(enabledPluginsNumber == Plugins.size()) - enabledPlugins.clear(); - if(num != NULL) - *num = enabledPluginsNumber; - return enabledPlugins; -} - -u32 Plugin::getPluginMagic(u8 pos) -{ - return Plugins[pos].magicWord; -} - -vector Plugin::ParseScummvmINI(Config &ini, const char *Device, u32 MagicWord) -{ - gprintf("Parsing scummvm.ini\n"); - vector gameHeader; - if(!ini.loaded()) - return gameHeader; - - const char *GameDomain = ini.firstDomain().c_str(); - dir_discHdr ListElement; - while(1) - { - if(strlen(GameDomain) < 2) - break; - const char *GameName = ini.getString(GameDomain, "description").c_str(); - if(strlen(GameName) < 2 || strncasecmp(Device, ini.getString(GameDomain, "path").c_str(), 2) != 0) - { - GameDomain = ini.nextDomain().c_str(); - continue; - } - memset((void*)&ListElement, 0, sizeof(dir_discHdr)); - strncpy(ListElement.id, PLUGIN_INI_DEF, 6); - ListElement.casecolor = Plugins.back().caseColor; - mbstowcs(ListElement.title, GameName, 63); - strncpy(ListElement.path, GameDomain, sizeof(ListElement.path)); - gprintf("Found: %s\n", GameDomain); - ListElement.settings[0] = MagicWord; - ListElement.type = TYPE_PLUGIN; - gameHeader.push_back(ListElement); - GameDomain = ini.nextDomain().c_str(); - } - return gameHeader; -} - -vector Plugin::CreateArgs(const char *device, const char *path, - const char *title, const char *loader, u32 title_len_no_ext, u32 magic) -{ - vector args; - Plugin_Pos = GetPluginPosition(magic); - if(Plugin_Pos < 0) - return args; - for(vector::const_iterator arg = Plugins[Plugin_Pos].Args.begin(); - arg != Plugins[Plugin_Pos].Args.end(); ++arg) - { - string Argument(*arg); - if(Argument.find(PLUGIN_DEV) != string::npos) - Argument.replace(Argument.find(PLUGIN_DEV), strlen(PLUGIN_DEV), device); - if(Argument.find(PLUGIN_PATH) != string::npos) - Argument.replace(Argument.find(PLUGIN_PATH), strlen(PLUGIN_PATH), path); - if(Argument.find(PLUGIN_NAME) != string::npos) - Argument.replace(Argument.find(PLUGIN_NAME), strlen(PLUGIN_NAME), title); - if(Argument.find(PLUGIN_LDR) != string::npos) - Argument.replace(Argument.find(PLUGIN_LDR), strlen(PLUGIN_LDR), loader); - if(Argument.find(PLUGIN_NOEXT) != string::npos) - Argument.replace(Argument.find(PLUGIN_NOEXT), strlen(PLUGIN_NOEXT), title, title_len_no_ext); - args.push_back(Argument); - } - return args; -} - -string Plugin::GenerateCoverLink(dir_discHdr gameHeader, const string& constURL, Config &Checksums) -{ - string url(constURL); - Plugin_Pos = GetPluginPosition(gameHeader.settings[0]); - - if(url.find(TAG_LOC) != url.npos) - url.replace(url.find(TAG_LOC), strlen(TAG_LOC), "EN"); - - if(url.find(TAG_CONSOLE) != url.npos) - url.replace(url.find(TAG_CONSOLE), strlen(TAG_CONSOLE), (Plugins[Plugin_Pos].consoleCoverID.size() ? Plugins[Plugin_Pos].consoleCoverID.c_str() : "nintendo")); - - char gamePath[256]; - if(string(gameHeader.path).find_last_of("/") != string::npos) - strncpy(gamePath, &gameHeader.path[string(gameHeader.path).find_last_of("/")+1], sizeof(gamePath)); - else - strncpy(gamePath, gameHeader.path, sizeof(gamePath)); - const string& cachedCRC = Checksums.getString("CHECKSUMS", gamePath); - char crc_string[9]; - crc_string[8] = '\0'; - if(cachedCRC.size() == 8) - { - gprintf("CRC32 of %s is cached\n", gamePath); - strncpy(crc_string, cachedCRC.c_str(), 8); - } - else - { - gprintf("Generating CRC32 for %s\n", gamePath); - u32 buffer; - ifstream infile; - if(strstr(gameHeader.path, ".zip") != NULL) - { - infile.open(gameHeader.path, ios::binary); - infile.seekg(0x0e, ios::beg); - infile.read((char*)&buffer, 8); - infile.close(); - strncpy(crc_string, fmt("%08x", (u32)__builtin_bswap32(buffer)), 8); - } - else if(strstr(gameHeader.path, ".7z") != NULL) - { - infile.open(gameHeader.path, ios::binary); - infile.seekg(-8, ios::end); - while(infile.tellg()) - { - infile.read((char*)&buffer, 8); - if(buffer == 0x00050111) - break; - infile.seekg(-9, ios::cur); - } - infile.seekg(-13, ios::cur); - infile.read((char*)&buffer, 8); - infile.close(); - strncpy(crc_string, fmt("%08x", (u32)__builtin_bswap32(buffer)), 8); - } - else - strncpy(crc_string, fmt("%08x", crc32file(gameHeader.path)), 8); - Checksums.setString("CHECKSUMS", gamePath, crc_string); - Checksums.save(); - } - url.replace(url.find(TAG_GAME_ID), strlen(TAG_GAME_ID), upperCase(crc_string).c_str()); - gprintf("URL: %s\n", url.c_str()); - return url; -} +/**************************************************************************** + * Copyright (C) 2012 FIX94 + * + * 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 . + ****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include "plugin.hpp" +#include "fileOps/fileOps.h" +#include "gui/text.hpp" +#include "gecko/gecko.hpp" +#include "devicemounter/PartitionHandle.h" +#include "devicemounter/DeviceHandler.hpp" +#include "types.h" +#include "crc32.h" + +Plugin m_plugin; +void Plugin::init(const string& m_pluginsDir) +{ + PluginMagicWord[8] = '\0'; + pluginsDir = m_pluginsDir; + //Ready to add plugins + adding = true; +} + +static bool PluginOptions_cmp(PluginOptions lhs, PluginOptions rhs) +{ + const wchar_t *first = lhs.DisplayName.c_str(); + const wchar_t *second = rhs.DisplayName.c_str(); + return wchar_cmp(first, second, wcslen(first), wcslen(second)); +} + +void Plugin::EndAdd() +{ + std::sort(Plugins.begin(), Plugins.end(), PluginOptions_cmp); + adding = false; +} + +void Plugin::Cleanup() +{ + Plugins.clear(); + adding = true; +} + +bool Plugin::AddPlugin(Config &plugin) +{ + if(!adding) + return false; + + PluginOptions NewPlugin; + NewPlugin.DolName = plugin.getString(PLUGIN_INI_DEF, "dolFile"); + NewPlugin.coverFolder = plugin.getString(PLUGIN_INI_DEF, "coverFolder"); + NewPlugin.magicWord = strtoul(plugin.getString(PLUGIN_INI_DEF, "magic").c_str(), NULL, 16); + NewPlugin.caseColor = strtoul(plugin.getString(PLUGIN_INI_DEF, "coverColor").c_str(), NULL, 16); + NewPlugin.Args = plugin.getStrings(PLUGIN_INI_DEF, "arguments", '|'); + string PluginName = plugin.getString(PLUGIN_INI_DEF, "displayname"); + if(PluginName.size() < 2) + { + PluginName = NewPlugin.DolName; + PluginName.erase(PluginName.end() - 4, PluginName.end()); + } + NewPlugin.DisplayName.fromUTF8(PluginName.c_str()); + NewPlugin.consoleCoverID = plugin.getString(PLUGIN_INI_DEF,"consoleCoverID"); + + const string &bannerfilepath = sfmt("%s/%s", pluginsDir.c_str(), plugin.getString(PLUGIN_INI_DEF,"bannerSound").c_str()); + fsop_GetFileSizeBytes(bannerfilepath.c_str(), &NewPlugin.BannerSoundSize); + if(NewPlugin.BannerSoundSize > 0) + NewPlugin.BannerSound = bannerfilepath; + Plugins.push_back(NewPlugin); + return false; +} + +s8 Plugin::GetPluginPosition(u32 magic) +{ + for(u8 pos = 0; pos < Plugins.size(); pos++) + { + if(magic == Plugins[pos].magicWord) + return pos; + } + return -1; +} + +u8* Plugin::GetBannerSound(u32 magic) +{ + if((Plugin_Pos = GetPluginPosition(magic)) >= 0) + { + u32 size = 0; + return fsop_ReadFile(Plugins[Plugin_Pos].BannerSound.c_str(), &size); + } + return NULL; +} + +u32 Plugin::GetBannerSoundSize() +{ + //We call that directly after GetBannerSound, so no need to search for the magic again + if(Plugin_Pos >= 0) + return Plugins[Plugin_Pos].BannerSoundSize; + return 0; +} + +const char *Plugin::GetDolName(u32 magic) +{ + if((Plugin_Pos = GetPluginPosition(magic)) >= 0) + return Plugins[Plugin_Pos].DolName.c_str(); + return NULL; +} + +const char *Plugin::GetCoverFolderName(u32 magic) +{ + if((Plugin_Pos = GetPluginPosition(magic)) >= 0) + return Plugins[Plugin_Pos].coverFolder.c_str(); + return NULL; +} + +bool Plugin::PluginExist(u8 pos) +{ + if(pos < Plugins.size()) + return true; + return false; +} + +wstringEx Plugin::GetPluginName(u8 pos) +{ + return Plugins[pos].DisplayName; +} + +void Plugin::SetEnablePlugin(Config &cfg, u8 pos, u8 ForceMode) +{ + if(pos < Plugins.size()) + { + strncpy(PluginMagicWord, fmt("%08x", Plugins[pos].magicWord), 8); + if(ForceMode == 1) + cfg.setBool(PLUGIN_ENABLED, PluginMagicWord, false); + else if(ForceMode == 2) + cfg.setBool(PLUGIN_ENABLED, PluginMagicWord, true); + else + cfg.setBool(PLUGIN_ENABLED, PluginMagicWord, cfg.getBool(PLUGIN_ENABLED, PluginMagicWord) ? false : true); + } +} + +bool Plugin::GetEnableStatus(Config &cfg, u32 magic) +{ + if((Plugin_Pos = GetPluginPosition(magic)) >= 0) + { + strncpy(PluginMagicWord, fmt("%08x", magic), 8); + return cfg.getBool(PLUGIN_ENABLED, PluginMagicWord, true); + } + return false; +} + +const vector &Plugin::GetEnabledPlugins(Config &cfg, u8 *num) +{ + enabledPlugins.clear(); + u8 enabledPluginsNumber = 0; + for(u8 i = 0; i < Plugins.size(); i++) + { + strncpy(PluginMagicWord, fmt("%08x", Plugins[i].magicWord), 8); + if(cfg.getBool(PLUGIN_ENABLED, PluginMagicWord, true)) + { + enabledPluginsNumber++; + enabledPlugins.push_back(true); + } + else + enabledPlugins.push_back(false); + } + if(enabledPluginsNumber == Plugins.size()) + enabledPlugins.clear(); + if(num != NULL) + *num = enabledPluginsNumber; + return enabledPlugins; +} + +u32 Plugin::getPluginMagic(u8 pos) +{ + return Plugins[pos].magicWord; +} + +vector Plugin::ParseScummvmINI(Config &ini, const char *Device, u32 MagicWord) +{ + gprintf("Parsing scummvm.ini\n"); + vector gameHeader; + if(!ini.loaded()) + return gameHeader; + + const char *GameDomain = ini.firstDomain().c_str(); + dir_discHdr ListElement; + while(1) + { + if(strlen(GameDomain) < 2) + break; + const char *GameName = ini.getString(GameDomain, "description").c_str(); + if(strlen(GameName) < 2 || strncasecmp(Device, ini.getString(GameDomain, "path").c_str(), 2) != 0) + { + GameDomain = ini.nextDomain().c_str(); + continue; + } + memset((void*)&ListElement, 0, sizeof(dir_discHdr)); + strncpy(ListElement.id, PLUGIN_INI_DEF, 6); + ListElement.casecolor = Plugins.back().caseColor; + mbstowcs(ListElement.title, GameName, 63); + strncpy(ListElement.path, GameDomain, sizeof(ListElement.path)); + gprintf("Found: %s\n", GameDomain); + ListElement.settings[0] = MagicWord; + ListElement.type = TYPE_PLUGIN; + gameHeader.push_back(ListElement); + GameDomain = ini.nextDomain().c_str(); + } + return gameHeader; +} + +vector Plugin::CreateArgs(const char *device, const char *path, + const char *title, const char *loader, u32 title_len_no_ext, u32 magic) +{ + vector args; + Plugin_Pos = GetPluginPosition(magic); + if(Plugin_Pos < 0) + return args; + for(vector::const_iterator arg = Plugins[Plugin_Pos].Args.begin(); + arg != Plugins[Plugin_Pos].Args.end(); ++arg) + { + string Argument(*arg); + if(Argument.find(PLUGIN_DEV) != string::npos) + Argument.replace(Argument.find(PLUGIN_DEV), strlen(PLUGIN_DEV), device); + if(Argument.find(PLUGIN_PATH) != string::npos) + Argument.replace(Argument.find(PLUGIN_PATH), strlen(PLUGIN_PATH), path); + if(Argument.find(PLUGIN_NAME) != string::npos) + Argument.replace(Argument.find(PLUGIN_NAME), strlen(PLUGIN_NAME), title); + if(Argument.find(PLUGIN_LDR) != string::npos) + Argument.replace(Argument.find(PLUGIN_LDR), strlen(PLUGIN_LDR), loader); + if(Argument.find(PLUGIN_NOEXT) != string::npos) + Argument.replace(Argument.find(PLUGIN_NOEXT), strlen(PLUGIN_NOEXT), title, title_len_no_ext); + args.push_back(Argument); + } + return args; +} + +string Plugin::GenerateCoverLink(dir_discHdr gameHeader, const string& constURL, Config &Checksums) +{ + string url(constURL); + Plugin_Pos = GetPluginPosition(gameHeader.settings[0]); + + if(url.find(TAG_LOC) != url.npos) + url.replace(url.find(TAG_LOC), strlen(TAG_LOC), "EN"); + + if(url.find(TAG_CONSOLE) != url.npos) + url.replace(url.find(TAG_CONSOLE), strlen(TAG_CONSOLE), (Plugins[Plugin_Pos].consoleCoverID.size() ? Plugins[Plugin_Pos].consoleCoverID.c_str() : "nintendo")); + + char gamePath[256]; + if(string(gameHeader.path).find_last_of("/") != string::npos) + strncpy(gamePath, &gameHeader.path[string(gameHeader.path).find_last_of("/")+1], sizeof(gamePath)); + else + strncpy(gamePath, gameHeader.path, sizeof(gamePath)); + const string& cachedCRC = Checksums.getString("CHECKSUMS", gamePath); + char crc_string[9]; + crc_string[8] = '\0'; + if(cachedCRC.size() == 8) + { + gprintf("CRC32 of %s is cached\n", gamePath); + strncpy(crc_string, cachedCRC.c_str(), 8); + } + else + { + gprintf("Generating CRC32 for %s\n", gamePath); + u32 buffer; + ifstream infile; + if(strstr(gameHeader.path, ".zip") != NULL) + { + infile.open(gameHeader.path, ios::binary); + infile.seekg(0x0e, ios::beg); + infile.read((char*)&buffer, 8); + infile.close(); + strncpy(crc_string, fmt("%08x", (u32)__builtin_bswap32(buffer)), 8); + } + else if(strstr(gameHeader.path, ".7z") != NULL) + { + infile.open(gameHeader.path, ios::binary); + infile.seekg(-8, ios::end); + while(infile.tellg()) + { + infile.read((char*)&buffer, 8); + if(buffer == 0x00050111) + break; + infile.seekg(-9, ios::cur); + } + infile.seekg(-13, ios::cur); + infile.read((char*)&buffer, 8); + infile.close(); + strncpy(crc_string, fmt("%08x", (u32)__builtin_bswap32(buffer)), 8); + } + else + strncpy(crc_string, fmt("%08x", crc32file(gameHeader.path)), 8); + Checksums.setString("CHECKSUMS", gamePath, crc_string); + Checksums.save(); + } + url.replace(url.find(TAG_GAME_ID), strlen(TAG_GAME_ID), upperCase(crc_string).c_str()); + gprintf("URL: %s\n", url.c_str()); + return url; +} diff --git a/source/plugin/plugin.hpp b/source/plugin/plugin.hpp index 2b64268b..2ce06ec3 100644 --- a/source/plugin/plugin.hpp +++ b/source/plugin/plugin.hpp @@ -1,87 +1,88 @@ -/**************************************************************************** - * Copyright (C) 2012 FIX94 - * - * 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 . - ****************************************************************************/ -#ifndef _PLUGIN_HPP_ -#define _PLUGIN_HPP_ - -#include -#include -#include -#include - -#include "config/config.hpp" -#include "loader/disc.h" - -using namespace std; - -#define TAG_GAME_ID "{gameid}" -#define TAG_LOC "{loc}" -#define TAG_CONSOLE "{console}" - -#define PLUGIN_INI_DEF "PLUGIN" -#define PLUGIN_DEV "{device}" -#define PLUGIN_PATH "{path}" -#define PLUGIN_NAME "{name}" -#define PLUGIN_NOEXT "{name_no_ext}" -#define PLUGIN_LDR "{loader}" - -struct PluginOptions -{ - u32 magicWord; - u32 caseColor; - string DolName; - string coverFolder; - string consoleCoverID; - string BannerSound; - u32 BannerSoundSize; - vector Args; - wstringEx DisplayName; -}; - -class Plugin -{ -public: - bool AddPlugin(Config &plugin); - u8 *GetBannerSound(u32 magic); - u32 GetBannerSoundSize(); - const char *GetDolName(u32 magic); - const char *GetCoverFolderName(u32 magic); - bool GetEnableStatus(Config &cfg, u32 magic); - string GenerateCoverLink(dir_discHdr gameHeader, const string& constURL, Config &Checksums); - wstringEx GetPluginName(u8 pos); - u32 getPluginMagic(u8 pos); - bool PluginExist(u8 pos); - void SetEnablePlugin(Config &cfg, u8 pos, u8 ForceMode = 0); - const vector &GetEnabledPlugins(Config &cfg, u8 *num); - vector CreateArgs(const char *device, const char *path, - const char *title, const char *loader, u32 title_len_no_ext, u32 magic); - void init(const string& m_pluginsDir); - void Cleanup(); - void EndAdd(); - vector ParseScummvmINI(Config &ini, const char *Device, u32 MagicWord); - s8 GetPluginPosition(u32 magic); -private: - vector Plugins; - vector enabledPlugins; - char PluginMagicWord[9]; - s8 Plugin_Pos; - string pluginsDir; - bool adding; -}; - -extern Plugin m_plugin; - -#endif +/**************************************************************************** + * Copyright (C) 2012 FIX94 + * + * 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 . + ****************************************************************************/ +#ifndef _PLUGIN_HPP_ +#define _PLUGIN_HPP_ + +#include +#include +#include +#include + +#include "config/config.hpp" +#include "loader/disc.h" + +using namespace std; + +#define TAG_GAME_ID "{gameid}" +#define TAG_LOC "{loc}" +#define TAG_CONSOLE "{console}" + +#define PLUGIN_INI_DEF "PLUGIN" +#define PLUGIN_ENABLED "PLUGINS_ENABLED" +#define PLUGIN_DEV "{device}" +#define PLUGIN_PATH "{path}" +#define PLUGIN_NAME "{name}" +#define PLUGIN_NOEXT "{name_no_ext}" +#define PLUGIN_LDR "{loader}" + +struct PluginOptions +{ + u32 magicWord; + u32 caseColor; + string DolName; + string coverFolder; + string consoleCoverID; + string BannerSound; + u32 BannerSoundSize; + vector Args; + wstringEx DisplayName; +}; + +class Plugin +{ +public: + bool AddPlugin(Config &plugin); + u8 *GetBannerSound(u32 magic); + u32 GetBannerSoundSize(); + const char *GetDolName(u32 magic); + const char *GetCoverFolderName(u32 magic); + bool GetEnableStatus(Config &cfg, u32 magic); + string GenerateCoverLink(dir_discHdr gameHeader, const string& constURL, Config &Checksums); + wstringEx GetPluginName(u8 pos); + u32 getPluginMagic(u8 pos); + bool PluginExist(u8 pos); + void SetEnablePlugin(Config &cfg, u8 pos, u8 ForceMode = 0); + const vector &GetEnabledPlugins(Config &cfg, u8 *num); + vector CreateArgs(const char *device, const char *path, + const char *title, const char *loader, u32 title_len_no_ext, u32 magic); + void init(const string& m_pluginsDir); + void Cleanup(); + void EndAdd(); + vector ParseScummvmINI(Config &ini, const char *Device, u32 MagicWord); + s8 GetPluginPosition(u32 magic); +private: + vector Plugins; + vector enabledPlugins; + char PluginMagicWord[9]; + s8 Plugin_Pos; + string pluginsDir; + bool adding; +}; + +extern Plugin m_plugin; + +#endif diff --git a/source/types.h b/source/types.h index 33458b98..73ee9df0 100644 --- a/source/types.h +++ b/source/types.h @@ -1,56 +1,56 @@ - -#ifndef _TYPES_H_ -#define _TYPES_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -enum { - COVERFLOW_USB = 0, - COVERFLOW_DML, - COVERFLOW_CHANNEL, - COVERFLOW_PLUGIN, - COVERFLOW_HOMEBREW, - COVERFLOW_MAX -}; - -enum -{ - TYPE_WII_DISC = 0, - TYPE_WII_WBFS, - TYPE_WII_WBFS_EXT, -}; - -enum -{ - TYPE_WII_GAME = 0, - TYPE_GC_GAME, - TYPE_CHANNEL, - TYPE_PLUGIN, - TYPE_HOMEBREW, - TYPE_SOURCE, - TYPE_END -}; -#define NoGameID(x) (x == TYPE_PLUGIN || x == TYPE_HOMEBREW || x == TYPE_SOURCE) - -enum -{ - IOS_TYPE_D2X = 0, - IOS_TYPE_WANIN, - IOS_TYPE_HERMES, - IOS_TYPE_KWIIRK, - IOS_TYPE_NEEK2O, - IOS_TYPE_NORMAL_IOS, - IOS_TYPE_STUB, -}; -#define CustomIOS(x) (x != IOS_TYPE_NORMAL_IOS && x != IOS_TYPE_STUB) - -#define ValidColor(x) (x == 0xFFFFFF || x == 0xFF0000 || x == 0x000000 || \ - x == 0xFCFF00 || x == 0x01A300 || x == 0x00E360) - -#ifdef __cplusplus -} -#endif - + +#ifndef _TYPES_H_ +#define _TYPES_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +enum { + COVERFLOW_WII = 0, + COVERFLOW_GAMECUBE, + COVERFLOW_CHANNEL, + COVERFLOW_PLUGIN, + COVERFLOW_HOMEBREW, + COVERFLOW_MAX +}; + +enum +{ + TYPE_WII_DISC = 0, + TYPE_WII_WBFS, + TYPE_WII_WBFS_EXT, +}; + +enum +{ + TYPE_WII_GAME = 0, + TYPE_GC_GAME, + TYPE_CHANNEL, + TYPE_PLUGIN, + TYPE_HOMEBREW, + TYPE_SOURCE, + TYPE_END +}; +#define NoGameID(x) (x == TYPE_PLUGIN || x == TYPE_HOMEBREW || x == TYPE_SOURCE) + +enum +{ + IOS_TYPE_D2X = 0, + IOS_TYPE_WANIN, + IOS_TYPE_HERMES, + IOS_TYPE_KWIIRK, + IOS_TYPE_NEEK2O, + IOS_TYPE_NORMAL_IOS, + IOS_TYPE_STUB, +}; +#define CustomIOS(x) (x != IOS_TYPE_NORMAL_IOS && x != IOS_TYPE_STUB) + +#define ValidColor(x) (x == 0xFFFFFF || x == 0xFF0000 || x == 0x000000 || \ + x == 0xFCFF00 || x == 0x01A300 || x == 0x00E360) + +#ifdef __cplusplus +} +#endif + #endif \ No newline at end of file