-FINALLY rewrote the game list creator code, the new one is faster

and smaller, I cant promise its bugfree though :P
-fixed wiiflow autoboot feature (for programs like crap)
This commit is contained in:
fix94.1 2012-10-03 21:34:37 +00:00
parent f6e7fd2332
commit 17b9e10a16
20 changed files with 477 additions and 861 deletions

View File

@ -0,0 +1,305 @@
/****************************************************************************
* 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 <http://www.gnu.org/licenses/>.
****************************************************************************/
#include <dirent.h>
#include <unistd.h>
#include "ListGenerator.hpp"
#include "cache.hpp"
#include "channel/channels.h"
#include "devicemounter/DeviceHandler.hpp"
#include "fileOps/fileOps.h"
#include "gui/text.hpp"
void ListGenerator::Init(string settingsDir, string Language)
{
gameTDB_Path = fmt("%s/wiitdb.xml", settingsDir.c_str());
CustomTitlesPath = fmt("%s/" CTITLES_FILENAME, settingsDir.c_str());
gameTDB_Language = Language;
}
void ListGenerator::Cleanup()
{
this->clear(); //clear gamelist
}
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();
}
void ListGenerator::CreateList(u32 Flow, u32 Device, string Path, vector<string> FileTypes,
string DBName, bool UpdateCache, u32 Color, u32 Magic)
{
Cleanup();
if(UpdateCache)
{
gprintf("Force Update Cache\n");
fsop_deleteFile(DBName.c_str());
}
else
{
CCache(*this, DBName, LOAD);
if(!this->empty())
return;
fsop_deleteFile(DBName.c_str());
}
OpenConfigs();
if(Flow == COVERFLOW_USB)
{
if(DeviceHandle.GetFSType(Device) == PART_FS_WBFS)
Create_Wii_WBFS_List(DeviceHandle.GetWbfsHandle(Device));
else
Create_Wii_EXT_List(Path, FileTypes);
}
else if(Flow == COVERFLOW_CHANNEL)
CreateChannelList();
else if(DeviceHandle.GetFSType(Device) != PART_FS_WBFS)
{
if(Flow == COVERFLOW_DML)
Create_GC_List(Path, FileTypes);
else if(Flow == COVERFLOW_PLUGIN)
Create_Plugin_List(Path, FileTypes, Color, Magic);
else if(Flow == COVERFLOW_HOMEBREW)
Create_Homebrew_List(Path, FileTypes);
}
CloseConfigs();
if(!this->empty()) /* Write a new Cache */
CCache(*this, DBName, SAVE);
}
void ListGenerator::Create_Wii_WBFS_List(wbfs_t *handle)
{
discHdr Header;
for(u32 i = 0; i < wbfs_count_discs(handle); i++)
{
memset((void*)&Header, 0, sizeof(discHdr));
s32 ret = wbfs_get_disc_info(handle, i, (u8*)&Header, sizeof(discHdr), NULL);
if(ret == 0 && Header.magic == WII_MAGIC)
AddISO((const char*)Header.id, (const char*)Header.title, " ", 1, TYPE_WII_GAME);
}
}
void ListGenerator::Create_Wii_EXT_List(string Path, vector<string> FileTypes)
{
vector<string> FileList;
GetFiles(Path.c_str(), FileTypes, &FileList);
discHdr Header;
for(vector<string>::iterator Name = FileList.begin(); Name != FileList.end(); Name++)
{
memset((void*)&Header, 0, sizeof(discHdr));
FILE *fp = fopen(Name->c_str(), "rb");
if(fp)
{
fseek(fp, strcasestr(Name->c_str(), ".wbfs") != NULL ? 512 : 0, SEEK_SET);
fread((void*)&Header, 1, sizeof(discHdr), fp);
if(Header.magic == WII_MAGIC)
AddISO((const char*)Header.id, (const char*)Header.title, Name->c_str(), 1, TYPE_WII_GAME);
fclose(fp);
}
}
FileList.clear();
}
void ListGenerator::Create_GC_List(string Path, vector<string> FileTypes)
{
vector<string> FileList;
GetFiles(Path.c_str(), FileTypes, &FileList, true);
gc_discHdr Header;
for(vector<string>::iterator Name = FileList.begin(); Name != FileList.end(); Name++)
{
memset((void*)&Header, 0, sizeof(gc_discHdr));
FILE *fp = fopen(Name->c_str(), "rb");
if(fp)
{
fread((void*)&Header, 1, sizeof(gc_discHdr), fp);
if(Header.magic == GC_MAGIC)
AddISO((const char*)Header.id, (const char*)Header.title, Name->c_str(), 0, TYPE_GC_GAME);
fclose(fp);
}
}
FileList.clear();
}
void ListGenerator::Create_Plugin_List(string Path, vector<string> FileTypes, u32 Color, u32 Magic)
{
dir_discHdr ListElement;
vector<string> FileList;
GetFiles(Path.c_str(), FileTypes, &FileList, false, 20);
for(vector<string>::iterator Name = FileList.begin(); Name != FileList.end(); Name++)
{
memset((void*)&ListElement, 0, sizeof(dir_discHdr));
ListElement.index = this->size();
strncpy(ListElement.path, Name->c_str(), sizeof(ListElement.path));
strncpy(ListElement.id, "PLUGIN", 6);
string Title(Name->begin() + Name->find_last_of('/') + 1, Name->begin() + Name->find_last_of('.'));
mbstowcs(ListElement.title, Title.c_str(), 63);
Asciify(ListElement.title);
ListElement.settings[0] = Magic; //Plugin magic
ListElement.casecolor = Color;
ListElement.type = TYPE_PLUGIN;
this->push_back(ListElement);
}
FileList.clear();
}
void ListGenerator::Create_Homebrew_List(string Path, vector<string> FileTypes)
{
dir_discHdr ListElement;
vector<string> FileList;
GetFiles(Path.c_str(), FileTypes, &FileList, false, 4);
for(vector<string>::iterator Name = FileList.begin(); Name != FileList.end(); Name++)
{
if(Name->find("boot.") == string::npos)
continue;
memset((void*)&ListElement, 0, sizeof(dir_discHdr));
ListElement.index = this->size();
Name->erase(Name->begin() + Name->find_last_of('/'), Name->end());
strncpy(ListElement.path, Name->c_str(), sizeof(ListElement.path));
strncpy(ListElement.id, "HB_APP", 6);
string FolderTitle(Name->begin() + Name->find_last_of('/') + 1, Name->end());
ListElement.casecolor = CustomTitles.getColor("COVERS", FolderTitle.c_str(), 1).intVal();
string CustomTitle = CustomTitles.getString("TITLES", FolderTitle.c_str());
if(CustomTitle.size() > 0)
mbstowcs(ListElement.title, CustomTitle.c_str(), 63);
else
mbstowcs(ListElement.title, FolderTitle.c_str(), 63);
Asciify(ListElement.title);
ListElement.type = TYPE_HOMEBREW;
this->push_back(ListElement);
continue;
}
}
void ListGenerator::CreateChannelList()
{
u32 GameColor = 1;
Channels ChannelHandle;
dir_discHdr ListElement;
ChannelHandle.Init(0, gameTDB_Language, true);
u32 count = ChannelHandle.Count();
this->reserve(count);
for(u32 i = 0; i < count; ++i)
{
Channel *chan = ChannelHandle.GetChannel(i);
if(chan->id == NULL)
continue; // Skip invalid channels
memset((void*)&ListElement, 0, sizeof(dir_discHdr));
ListElement.index = this->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, GameColor).intVal();
string CustomTitle = CustomTitles.getString("TITLES", ListElement.id);
if(gameTDB.IsLoaded())
{
if(ListElement.casecolor == GameColor)
ListElement.casecolor = gameTDB.GetCaseColor(ListElement.id);
if(CustomTitle.size() == 0)
gameTDB.GetTitle(ListElement.id, CustomTitle);
ListElement.wifi = gameTDB.GetWifiPlayers(ListElement.id);
ListElement.players = gameTDB.GetPlayers(ListElement.id);
}
if(CustomTitle.size() > 0)
mbstowcs(ListElement.title, CustomTitle.c_str(), 63);
else
wcsncpy(ListElement.title, chan->name, 64);
ListElement.type = TYPE_CHANNEL;
this->push_back(ListElement);
}
}
void ListGenerator::AddISO(const char *GameID, const char *GameTitle, const char *GamePath, u32 GameColor, u8 Type)
{
dir_discHdr ListElement;
memset((void*)&ListElement, 0, sizeof(dir_discHdr));
ListElement.index = this->size();
strncpy(ListElement.id, GameID, 6);
strncpy(ListElement.path, GamePath, sizeof(ListElement.path));
ListElement.casecolor = CustomTitles.getColor("COVERS", ListElement.id, GameColor).intVal();
string CustomTitle = CustomTitles.getString("TITLES", ListElement.id);
if(gameTDB.IsLoaded())
{
if(ListElement.casecolor == GameColor)
ListElement.casecolor = gameTDB.GetCaseColor(ListElement.id);
if(CustomTitle.size() == 0)
gameTDB.GetTitle(ListElement.id, CustomTitle);
ListElement.wifi = gameTDB.GetWifiPlayers(ListElement.id);
ListElement.players = gameTDB.GetPlayers(ListElement.id);
}
if(CustomTitle.size() > 0)
mbstowcs(ListElement.title, CustomTitle.c_str(), 63);
else
mbstowcs(ListElement.title, GameTitle, 63);
Asciify(ListElement.title);
ListElement.type = Type;
this->push_back(ListElement); //I am a vector! :P
}
void ListGenerator::GetFiles(const char *Path, vector<string> FileTypes,
vector<string> *FileList, bool gc, u32 max_depth, u32 depth)
{
struct dirent *pent = NULL;
vector<string> SubPaths;
DIR *pdir = opendir(Path);
if(pdir == NULL)
return;
while((pent = readdir(pdir)) != NULL)
{
if(strcmp(pent->d_name, ".") == 0 || strcmp(pent->d_name, "..") == 0)
continue;
string CurrentItem = sfmt("%s/%s", Path, pent->d_name);
if(pent->d_type == DT_DIR)
{
if(gc && depth == 2 && strcasecmp(pent->d_name, "root") == 0) //fst
FileList->push_back(CurrentItem);
else if(depth < max_depth)
SubPaths.push_back(CurrentItem); //thanks to libntfs for a complicated way
}
else if(pent->d_type == DT_REG)
{
const char *FileName = strstr(pent->d_name, ".");
if(FileName == NULL) FileName = pent->d_name;
for(vector<string>::iterator cmp = FileTypes.begin(); cmp != FileTypes.end(); cmp++)
{
if(strcasecmp(FileName, cmp->c_str()) == 0)
{
FileList->push_back(CurrentItem);
break;
}
}
}
}
closedir(pdir);
for(vector<string>::iterator SubPath = SubPaths.begin(); SubPath != SubPaths.end(); SubPath++)
GetFiles(SubPath->c_str(), FileTypes, FileList, gc, max_depth, depth + 1);
SubPaths.clear();
}

View File

@ -0,0 +1,58 @@
/****************************************************************************
* 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 <http://www.gnu.org/licenses/>.
****************************************************************************/
#ifndef _LISTGENERATOR_HPP_
#define _LISTGENERATOR_HPP_
#include <string>
#include <vector>
#include <stdio.h>
#include "types.h"
#include "config/config.hpp"
#include "loader/wbfs.h"
#include "loader/disc.h"
#include "gui/GameTDB.hpp"
using namespace std;
class ListGenerator : public vector<dir_discHdr>
{
public:
void Init(string settingsDir, string Language);
void Cleanup();
void CreateList(u32 Flow, u32 Device, string Path, vector<string> FileTypes,
string DBName, bool UpdateCache, u32 Color = 0, u32 Magic = 0);
private:
void Create_Wii_WBFS_List(wbfs_t *handle);
void Create_Wii_EXT_List(string Path, vector<string> FileTypes);
void Create_GC_List(string Path, vector<string> FileTypes);
void Create_Plugin_List(string Path, vector<string> FileTypes, u32 Color, u32 Magic);
void Create_Homebrew_List(string Path, vector<string> FileTypes);
void CreateChannelList();
void GetFiles(const char *Path, vector<string> FileTypes, vector<string> *FileList,
bool gc = false, u32 max_depth = 2, u32 depth = 1);
void AddISO(const char *GameID, const char *GameTitle, const char *GamePath, u32 GameColor, u8 Type);
void OpenConfigs();
void CloseConfigs();
string gameTDB_Path;
string CustomTitlesPath;
string gameTDB_Language;
GameTDB gameTDB;
Config CustomTitles;
};
#endif /*_LISTGENERATOR_HPP_*/

View File

@ -1,165 +0,0 @@
#include "cachedlist.hpp"
#include <typeinfo>
void CachedList::Load(string path, string containing, string m_lastLanguage, Config &m_plugin) /* Load All */
{
const char* partition = DeviceName[DeviceHandle.PathToDriveType(path.c_str())];
//gprintf("\nLoading files containing %s in %s\n", containing.c_str(), path.c_str());
m_loaded = false;
if(m_plugin.loaded())
m_database = sfmt("%s/%s_%s.db", m_cacheDir.c_str(), partition, lowerCase(m_plugin.getString("PLUGIN","magic")).c_str());
else
m_database = sfmt("%s/%s.db", m_cacheDir.c_str(), (make_db_name(path)).c_str());
m_wbfsFS = strncasecmp(DeviceHandle.PathToFSName(path.c_str()), "WBFS", 4) == 0;
bool update_games = false;
bool update_homebrew = false;
bool update_dml = false;
bool update_emu = false;
bool ditimes = false;
if(!m_wbfsFS)
{
//gprintf("Database file: %s\n", m_database.c_str());
update_games = strcasestr(path.c_str(), "wbfs") != NULL && force_update[COVERFLOW_USB];
update_homebrew = strcasestr(path.c_str(), "apps") != NULL && force_update[COVERFLOW_HOMEBREW];
update_emu = m_plugin.loaded() && force_update[COVERFLOW_EMU];
update_dml = strcasestr(path.c_str(), fmt(strncmp(partition, "sd", 2) != 0 ? m_DMLgameDir.c_str() : "%s:/games", partition)) != NULL && force_update[COVERFLOW_DML];
//gprintf("update_games=%d update_homebrew=%d update_dml=%d, update_emu=%d\n", update_games, update_homebrew, update_dml, update_emu);
if(update_games || update_homebrew || update_dml || update_emu)
remove(m_database.c_str());
m_discinf = sfmt("%s/disc.info", path.c_str());
struct stat filestat, discinfo, cache;
//gprintf("%s\n", path.c_str());
if(stat(path.c_str(), &filestat) == -1)
return;
bool update_lang = m_lastLanguage != m_curLanguage;
bool noDB = stat(m_database.c_str(), &cache) == -1;
bool mtimes = filestat.st_mtime > cache.st_mtime;
if(strcasestr(m_discinf.c_str(), "wbfs") != NULL && stat(m_discinf.c_str(), &discinfo) != -1)
ditimes = discinfo.st_mtime > cache.st_mtime;
m_update = update_lang || noDB || (!m_skipcheck && (mtimes || ditimes));
/*if(m_update)
gprintf("Cache of %s is being updated because:\n", path.c_str());
if(update_lang)
gprintf("Languages are different!\nOld language string: %s\nNew language string: %s\n", m_lastLanguage.c_str(), m_curLanguage.c_str());
if(noDB)
gprintf("A database was not found!\n");
if(!m_skipcheck && (mtimes || ditimes))
gprintf("The WBFS folder was modified!\nCache date: %i\nFolder date: %i\n", cache.st_mtime, filestat.st_mtime);
*/
if(m_extcheck && !m_update && !m_skipcheck)
{
bool m_chupdate = false;
DIR *dir = opendir(path.c_str());
struct dirent *entry;
while((entry = readdir(dir)) != NULL)
{
m_discinf = sfmt("%s/%s", path.c_str(), entry->d_name);
if(stat(m_discinf.c_str(), &discinfo) != -1)
m_chupdate = discinfo.st_mtime > cache.st_mtime;
if(m_chupdate)
break;
}
m_update = m_chupdate;
}
}
if(update_games)
force_update[COVERFLOW_USB] = false;
if(update_homebrew)
force_update[COVERFLOW_HOMEBREW] = false;
if(update_dml)
force_update[COVERFLOW_DML] = false;
if(m_update || m_wbfsFS)
{
gprintf("Updating Cache\n");
vector<string> pathlist;
list.GetPaths(pathlist, containing, path, m_wbfsFS, (update_dml || (m_update && strcasestr(path.c_str(), ":/games") != NULL)), !update_emu);
list.GetHeaders(pathlist, *this, m_settingsDir, m_curLanguage, m_DMLgameDir, m_plugin);
path.append("/touch.db");
FILE *file = fopen(path.c_str(), "wb");
fclose(file);
remove(path.c_str());
m_loaded = true;
m_update = false;
if(pathlist.size() > 0)
Save();
pathlist.clear();
}
else
{
CCache(*this, m_database, LOAD);
m_loaded = true;
}
}
void CachedList::LoadChannels(string path, u32 channelType, string m_lastLanguage) /* Load All */
{
m_loaded = false;
m_update = true;
bool emu = !path.empty();
if(emu)
{
m_database = sfmt("%s/%s.db", m_cacheDir.c_str(), make_db_name(sfmt("%s/emu", path.c_str())).c_str());
size_t find = m_database.find("//");
if(find != string::npos)
m_database.replace(find, 2, "/");
if(force_update[COVERFLOW_CHANNEL])
remove(m_database.c_str());
//gprintf("%s\n", m_database.c_str());
struct stat filestat, cache;
/*** Removed that stupid check overhere! ***/
/*** Will replace it soon with something better!! ***/
m_update = force_update[COVERFLOW_CHANNEL] || m_lastLanguage != m_curLanguage || stat(m_database.c_str(), &cache) == -1 || filestat.st_mtime > cache.st_mtime;
}
force_update[COVERFLOW_CHANNEL] = false;
if(m_update)
{
gprintf("Updating channels\n");
list.GetChannels(*this, m_settingsDir, channelType, m_curLanguage);
m_loaded = true;
m_update = false;
if(this->size() > 0 && emu) Save();
}
else
CCache(*this, m_database, LOAD);
m_loaded = true;
}
string CachedList::make_db_name(string path)
{
string buffer = path;
size_t find = buffer.find(":/");
if(find != string::npos)
buffer.replace(find, 2, "_");
find = buffer.find("/");
while(find != string::npos)
{
buffer[find] = '_';
find = buffer.find("/");
}
return buffer;
}

View File

@ -1,85 +0,0 @@
#ifndef CACHEDLIST
#define CACHEDLIST
#include "list.hpp"
#include "cache.hpp"
#include "config/config.hpp"
#include "gecko/gecko.h"
using namespace std;
enum {
COVERFLOW_USB,
COVERFLOW_DML,
COVERFLOW_CHANNEL,
COVERFLOW_EMU,
COVERFLOW_HOMEBREW,
COVERFLOW_MAX
};
class CachedList : public vector<dir_discHdr>
{
public:
void Init(string cachedir, string settingsDir, string curLanguage, string DMLgameDir, bool extcheck, bool skipcheck) /* Initialize Private Variables */
{
m_cacheDir = cachedir;
m_settingsDir = settingsDir;
m_curLanguage = m_lastLanguage = curLanguage;
m_loaded = false;
m_database = "";
m_update = false;
m_extcheck = extcheck;
m_skipcheck = skipcheck;
m_DMLgameDir = DMLgameDir;
for(u32 i = 0; i < COVERFLOW_MAX; i++)
force_update[i] = false;
}
void Update(u32 view = COVERFLOW_MAX) /* Force db update on next load */
{
if(view == COVERFLOW_MAX)
for(u32 i = 0; i < COVERFLOW_MAX; i++)
{
force_update[i] = true;
gprintf("force_update[%d] = true\n", i);
}
else
{
force_update[view] = true;
gprintf("force_update[%d] = true\n", view);
}
}
void Load(string path, string containing, string m_lastLanguage, Config &m_plugin);
void LoadChannels(string path, u32 channelType, string m_lastLanguage);
void Unload(){if(m_loaded) {this->clear(); m_loaded = false; m_database = "";}};
void Save() {if(m_loaded) CCache(*this, m_database, SAVE);} /* Save All */
void Get(dir_discHdr tmp, u32 index) {if(m_loaded) CCache(tmp, m_database, index, LOAD);} /* Load One */
void Set(dir_discHdr tmp, u32 index) {if(m_loaded) CCache(tmp, m_database, index, SAVE);} /* Save One */
void Add(dir_discHdr tmp) {if(m_loaded) CCache(*this, m_database, tmp, ADD);} /* Add One */
void Remove(u32 index) {if(m_loaded) CCache(*this, m_database, index, REMOVE);} /* Remove One */
void SetLanguage(string curLanguage) { m_curLanguage = curLanguage; }
private:
string make_db_name(string path);
bool m_loaded;
bool m_update;
bool m_wbfsFS;
bool m_extcheck;
bool m_skipcheck;
u8 force_update[COVERFLOW_MAX];
CList<dir_discHdr> list;
string m_database;
string m_cacheDir;
string m_settingsDir;
string m_curLanguage;
string m_lastLanguage;
string m_discinf;
string m_DMLgameDir;
};
#endif

View File

@ -1,474 +0,0 @@
#include "list.hpp"
#include "types.h"
#include "channel/channels.h"
#include "config/config.hpp"
#include "fileOps/fileOps.h"
#include "gecko/gecko.h"
#include "gc/gc.hpp"
#include "gui/GameTDB.hpp"
template <typename T>
void CList<T>::GetPaths(vector<string> &pathlist, string containing, string directory, bool wbfs_fs, bool dml, bool depth_limit)
{
if (!wbfs_fs)
{
/* Open primary directory */
DIR *dir_itr = opendir(directory.c_str());
if (!dir_itr) return;
vector<string> compares = stringToVector(containing, '|');
vector<string> temp_pathlist;
struct dirent *ent;
/* Read primary entries */
while((ent = readdir(dir_itr)) != NULL)
{
if(ent->d_name[0] == '.')
continue;
if(ent->d_type == DT_REG)
{
for(vector<string>::iterator compare = compares.begin(); compare != compares.end(); compare++)
{
if (strcasestr(ent->d_name, (*compare).c_str()) != NULL)
{
//gprintf("Pushing %s to the list.\n", sfmt("%s/%s", directory.c_str(), ent->d_name).c_str());
pathlist.push_back(sfmt("%s/%s", directory.c_str(), ent->d_name));
break;
}
}
}
else
temp_pathlist.push_back(sfmt("%s/%s", directory.c_str(), ent->d_name));
}
closedir(dir_itr);
while(temp_pathlist.size())
{
while((dir_itr = opendir(temp_pathlist[0].c_str())) && !dir_itr)
temp_pathlist.erase(temp_pathlist.begin());
/* Read subdirectory */
while((ent = readdir(dir_itr)) != NULL)
{
if(ent->d_name[0] == '.')
continue;
if(ent->d_type == DT_REG)
{
for(vector<string>::iterator compare = compares.begin(); compare != compares.end(); compare++)
{
if(strcasestr(ent->d_name, (*compare).c_str()) != NULL)
{
//gprintf("Pushing %s to the list.\n", sfmt("%s/%s", temp_pathlist[0].c_str(), ent->d_name).c_str());
pathlist.push_back(sfmt("%s/%s", temp_pathlist[0].c_str(), ent->d_name));
break;
}
}
}
else
{
if(!depth_limit)
temp_pathlist.push_back(sfmt("%s/%s", temp_pathlist[0].c_str(), ent->d_name));
else if(dml && strncasecmp(ent->d_name, "sys", 3) == 0 && fsop_DirExist(fmt("%s/root", temp_pathlist[0].c_str())))
{
//gprintf("Pushing %s to the list.\n", sfmt("%s/%s/boot.bin", temp_pathlist[0].c_str(), ent->d_name).c_str());
pathlist.push_back(sfmt("%s/%s/boot.bin", temp_pathlist[0].c_str(), ent->d_name));
}
}
}
closedir(dir_itr);
/* Finished reading subdirectory, erase it */
temp_pathlist.erase(temp_pathlist.begin());
}
}
else
{
if(strcasestr(containing.c_str(), ".dol") != 0)
return;
int partition = DeviceHandle.PathToDriveType(directory.c_str());
wbfs_t* handle = DeviceHandle.GetWbfsHandle(partition);
if(!handle)
return;
u32 count = wbfs_count_discs(handle);
for(u32 i = 0; i < count; i++)
pathlist.push_back(directory);
}
}
template <>
void CList<dir_discHdr>::GetHeaders(vector<string> pathlist, vector<dir_discHdr> &headerlist, string settingsDir, string curLanguage, string DMLgameUSBDir, Config &plugin)
{
if(pathlist.size() < 1)
return;
headerlist.reserve(pathlist.size() + headerlist.size());
//gprintf("Getting headers for paths in pathlist (%d)\n", pathlist.size());
vector<char*> GC_SD_IDs;
bool GC_SD_IDs_loaded = false;
discHdr gc_hdr;
dir_discHdr tmp;
u32 count = 0;
string GTitle;
Config custom_titles;
if(settingsDir.size() > 0)
{
string custom_titles_path = sfmt("%s/" CTITLES_FILENAME, settingsDir.c_str());
custom_titles.load(custom_titles_path.c_str());
}
GameTDB gameTDB;
if(settingsDir.size() > 0)
{
gameTDB.OpenFile(fmt("%s/wiitdb.xml", settingsDir.c_str()));
if(curLanguage.size() == 0) curLanguage = "EN";
gameTDB.SetLanguageCode(curLanguage.c_str());
}
for(vector<string>::iterator itr = pathlist.begin(); itr != pathlist.end(); itr++)
{
memset(&tmp, 0, sizeof(tmp));
strncpy(tmp.path, (*itr).c_str(), sizeof(tmp.path));
tmp.index = headerlist.size();
tmp.casecolor = 1;
bool wbfs = (*itr).rfind(".wbfs") != string::npos || (*itr).rfind(".WBFS") != string::npos;
if(plugin.loaded())
{
vector<string> types = plugin.getStrings("PLUGIN","fileTypes",'|');
if (types.size() > 0)
{
for(vector<string>::iterator type_itr = types.begin(); type_itr != types.end(); type_itr++)
{
if(lowerCase(*itr).rfind((*type_itr).c_str()) != string::npos)
{
strncpy(tmp.path, (*itr).c_str(), sizeof(tmp.path));
strncpy(tmp.id, "PLUGIN", sizeof(tmp.id));
tmp.casecolor = strtoul(plugin.getString("PLUGIN","coverColor","").c_str(), NULL, 16);
char tempname[64];
(*itr).assign(&(*itr)[(*itr).find_last_of('/') + 1]);
if((*itr).find_last_of('.') != string::npos)
(*itr).erase((*itr).find_last_of('.'), (*itr).size() - (*itr).find_last_of('.'));
strncpy(tempname, (*itr).c_str(), sizeof(tempname));
wstringEx tmpString;
tmpString.fromUTF8(tempname);
wcsncpy(tmp.title, tmpString.c_str(), 64);
Asciify(tmp.title);
//gprintf("Found: %ls\n", tmp.title);
tmp.settings[0] = strtoul(plugin.getString("PLUGIN","magic","").c_str(), NULL, 16); //Plugin magic
tmp.type = TYPE_PLUGIN;
headerlist.push_back(tmp);
break;
}
}
}
continue;
}
else if(wbfs || (*itr).rfind(".iso") != string::npos || (*itr).rfind(".ISO") != string::npos
|| (*itr).rfind(".bin") != string::npos || (*itr).rfind(".BIN") != string::npos)
{
char* filename = &(*itr)[(*itr).find_last_of('/')+1];
const char* dml_partition = DeviceName[DeviceHandle.PathToDriveType((*itr).c_str())];
if(strcasecmp(filename, "game.iso") == 0 || strcasecmp(filename, "gam1.iso") == 0 || strcasecmp(filename, "boot.bin") == 0)
{
FILE *fp = fopen((*itr).c_str(), "rb");
if(fp)
{
u8 gc_disc[1];
fseek(fp, 6, SEEK_SET);
fread(gc_disc, 1, 1, fp);
memset(&gc_hdr, 0, sizeof(discHdr));
fseek(fp, 0, SEEK_SET);
fread(&gc_hdr, sizeof(discHdr), 1, fp);
fclose(fp);
if(gc_hdr.gc_magic == GC_MAGIC)
{
strcpy(tmp.path, (*itr).c_str());
strncpy(tmp.id, (char*)gc_hdr.id, 6);
(*itr)[(*itr).find_last_of('/')] = 0;
if(strcasecmp(filename, "boot.bin") == 0)
(*itr)[(*itr).find_last_of('/')] = 0;
(*itr).assign(&(*itr)[(*itr).find_last_of('/') + 1]);
GTitle = custom_titles.getString("TITLES", tmp.id);
tmp.casecolor = 0;
int ccolor = custom_titles.getColor("COVERS", tmp.id, tmp.casecolor).intVal();
wstringEx tmpString;
if(GTitle.size() > 0 || (gameTDB.IsLoaded() && gameTDB.GetTitle(tmp.id, GTitle)))
{
tmpString.fromUTF8(GTitle.c_str());
tmp.casecolor = ccolor != 0 ? ccolor : gameTDB.GetCaseColor(tmp.id);
}
else
{
tmpString.fromUTF8(gc_hdr.title);
tmp.casecolor = ccolor;
}
wcsncpy(tmp.title, tmpString.c_str(), 64);
if(gc_disc[0])
wcslcat(tmp.title, L" disc 2", sizeof(tmp.title));
if(strncmp(dml_partition, "sd", 2) != 0)
{
if(!GC_SD_IDs_loaded)
{
CList<dir_discHdr> tmplist;
vector<string> pathlist;
tmplist.GetPaths(pathlist, ".iso|.bin", "sd:/games", false, true);
vector<dir_discHdr> tmpGameList;
tmplist.GetHeaders(pathlist, tmpGameList, settingsDir, curLanguage, DMLgameUSBDir, plugin);
for(u8 i = 0; i < tmpGameList.size(); i++)
GC_SD_IDs.push_back(tmpGameList.at(i).id);
GC_SD_IDs_loaded = true;
}
tmp.settings[0] = 0;
for(u8 i = 0; i < GC_SD_IDs.size(); i++)
{
if(strncasecmp(GC_SD_IDs.at(i), tmp.id, 6) == 0)
{
tmp.settings[0] = 1; //Later Checks can use this as easy information
wcslcat(tmp.title, L" \n(on SD)", sizeof(tmp.title));
break;
}
}
}
Asciify(tmp.title);
//gprintf("Found: %ls\n", tmp.title);
tmp.type = TYPE_GC_GAME;
headerlist.push_back(tmp);
continue;
}
}
continue;
}
Check_For_ID(tmp.id, (*itr).c_str(), "[", "]"); /* [GAMEID] Title, [GAMEID]_Title, Title [GAMEID], Title_[GAMEID] */
if(tmp.id[0] == 0)
{
Check_For_ID(tmp.id, (*itr).c_str(), "/", "."); /* GAMEID.wbfs, GAMEID.iso */
if(tmp.id[0] == 0)
{
Check_For_ID(tmp.id, (*itr).c_str(), "/", "_"); /* GAMEID_Title */
if(tmp.id[0] == 0)
{
Check_For_ID(tmp.id, (*itr).c_str(), "_", "."); /* Title_GAMEID */ // <-- Unsafe?
if(tmp.id[0] == 0)
Check_For_ID(tmp.id, (*itr).c_str(), " ", "."); /* Title GAMEID */ //<-- Unsafe?
}
}
}
if(!isalnum(tmp.id[0]) || tmp.id[0] == 0 || memcmp(tmp.id, "__CFG_", sizeof tmp.id) == 0)
{
gprintf("Skipping file: '%s'\n", (*itr).c_str());
continue;
}
discHdr wii_hdr;
FILE *fp = fopen((*itr).c_str(), "rb");
if(fp)
{
fseek(fp, wbfs ? 512 : 0, SEEK_SET);
fread(&wii_hdr, sizeof(discHdr), 1, fp);
fclose(fp);
}
if(wii_hdr.magic == WII_MAGIC)
{
strncpy(tmp.id, (char*)wii_hdr.id, 6);
GTitle = custom_titles.getString("TITLES", tmp.id);
int ccolor = custom_titles.getColor("COVERS", tmp.id, tmp.casecolor).intVal();
wstringEx tmpString;
if(GTitle.size() > 0 || (gameTDB.IsLoaded() && gameTDB.GetTitle(tmp.id, GTitle)))
{
tmpString.fromUTF8(GTitle.c_str());
tmp.wifi = gameTDB.GetWifiPlayers(tmp.id);
tmp.players = gameTDB.GetPlayers(tmp.id);
tmp.casecolor = ccolor != 1 ? ccolor : gameTDB.GetCaseColor(tmp.id);
}
else
{
tmpString.fromUTF8(wii_hdr.title);
tmp.casecolor = ccolor;
}
wcsncpy(tmp.title, tmpString.c_str(), 64);
Asciify(tmp.title);
//gprintf("Found: %ls\n", tmp.title);
tmp.type = TYPE_WII_GAME;
headerlist.push_back(tmp);
continue;
}
}
else if(strncasecmp(DeviceHandle.PathToFSName((*itr).c_str()), "WBFS", 4) == 0)
{
u8 partition = DeviceHandle.PathToDriveType((*itr).c_str());
wbfs_t* handle = DeviceHandle.GetWbfsHandle(partition);
if(!handle)
return;
discHdr wbfs_hdr;
s32 ret = wbfs_get_disc_info(handle, count, (u8 *)&wbfs_hdr, sizeof(struct discHdr), NULL);
count++;
if(ret != 0)
continue;
if(wbfs_hdr.magic == WII_MAGIC)
{
strncpy(tmp.id, (char*)wbfs_hdr.id, 6);
GTitle = custom_titles.getString("TITLES", tmp.id);
int ccolor = custom_titles.getColor("COVERS", tmp.id, tmp.casecolor).intVal();
wstringEx tmpString;
if(GTitle.size() > 0 || (gameTDB.IsLoaded() && gameTDB.GetTitle(tmp.id, GTitle)))
{
tmpString.fromUTF8(GTitle.c_str());
tmp.wifi = gameTDB.GetWifiPlayers(tmp.id);
tmp.players = gameTDB.GetPlayers(tmp.id);
tmp.casecolor = ccolor != 1 ? ccolor : gameTDB.GetCaseColor(tmp.id);
}
else
{
tmpString.fromUTF8((const char *)wbfs_hdr.title);
tmp.casecolor = ccolor;
}
wcsncpy(tmp.title, tmpString.c_str(), 64);
Asciify(tmp.title);
//gprintf("Found: %ls\n", tmp.title);
tmp.type = TYPE_WII_GAME;
headerlist.push_back(tmp);
}
continue;
}
else if((*itr).rfind(".dol") != string::npos || (*itr).rfind(".DOL") != string::npos
|| (*itr).rfind(".elf") != string::npos || (*itr).rfind(".ELF") != string::npos)
{
char *filename = &(*itr)[(*itr).find_last_of('/')+1];
if(strcasecmp(filename, "boot.dol") != 0 && strcasecmp(filename, "boot.elf") != 0)
continue;
strncpy(tmp.id, "HB_APP", sizeof(tmp.id));
(*itr)[(*itr).find_last_of('/')] = 0;
strncpy(tmp.path, (*itr).c_str(), sizeof(tmp.path));
(*itr).assign(&(*itr)[(*itr).find_last_of('/') + 1]);
char homebrewtitle[64];
strncpy(homebrewtitle, (*itr).c_str(), sizeof(homebrewtitle));
tmp.casecolor = custom_titles.getColor("COVERS", homebrewtitle, tmp.casecolor).intVal();
wstringEx tmpString;
GTitle = custom_titles.getString("TITLES", homebrewtitle);
if(GTitle.size() > 0)
tmpString.fromUTF8(GTitle.c_str());
else
tmpString.fromUTF8(homebrewtitle);
wcsncpy(tmp.title, tmpString.c_str(), 64);
Asciify(tmp.title);
//gprintf("Found: %ls\n", tmp.title);
tmp.type = TYPE_HOMEBREW;
headerlist.push_back(tmp);
continue;
}
}
if(gameTDB.IsLoaded())
gameTDB.CloseFile();
}
template <>
void CList<dir_discHdr>::GetChannels(vector<dir_discHdr> &headerlist, string settingsDir, u32 channelType, string curLanguage)
{
Channels m_channels;
m_channels.Init(channelType, curLanguage, true);
Config custom_titles;
if (settingsDir.size() > 0)
{
string custom_titles_path = sfmt("%s/" CTITLES_FILENAME, settingsDir.c_str());
custom_titles.load(custom_titles_path.c_str());
}
GameTDB gameTDB;
if (settingsDir.size() > 0)
{
gameTDB.OpenFile(fmt("%s/wiitdb.xml", settingsDir.c_str()));
if(curLanguage.size() == 0) curLanguage = "EN";
gameTDB.SetLanguageCode(curLanguage.c_str());
}
u32 count = m_channels.Count();
headerlist.reserve(count);
for (u32 i = 0; i < count; ++i)
{
Channel *chan = m_channels.GetChannel(i);
if(chan->id == NULL)
continue; // Skip invalid channels
dir_discHdr tmp;
bzero(&tmp, sizeof(dir_discHdr));
tmp.index = headerlist.size();
tmp.casecolor = 1;
tmp.settings[0] = TITLE_UPPER(chan->title);
tmp.settings[1] = TITLE_LOWER(chan->title);
strncpy(tmp.id, chan->id, 4);
int ccolor = custom_titles.getColor("COVERS", tmp.id, tmp.casecolor).intVal();
wstringEx tmpString;
string GTitle = custom_titles.getString("TITLES", tmp.id);
if(GTitle.size() > 0 || (gameTDB.IsLoaded() && gameTDB.GetTitle(tmp.id, GTitle)))
{
tmpString.fromUTF8(GTitle.c_str());
tmp.casecolor = ccolor != 1 ? ccolor : gameTDB.GetCaseColor(tmp.id);
tmp.wifi = gameTDB.GetWifiPlayers(tmp.id);
tmp.players = gameTDB.GetPlayers(tmp.id);
}
else
{
tmpString = chan->name;
tmp.casecolor = ccolor;
}
wcsncpy(tmp.title, tmpString.c_str(), 64);
Asciify(tmp.title);
//gprintf("Found: %ls\n", tmp.title);
tmp.type = TYPE_CHANNEL;
headerlist.push_back(tmp);
}
if(gameTDB.IsLoaded())
gameTDB.CloseFile();
}
template <typename T>
void CList<T>::Check_For_ID(char *id, string path, string one, string two)
{
memset(id, 0, sizeof(id));
size_t idstart = path.find_last_of(one);
size_t idend = path.find_last_of(two);
if (idend != string::npos && idstart != string::npos && idend - idstart == 7)
for(u8 pos = 0; pos < 6; pos++)
id[pos] = toupper(path[idstart + 1 + pos]);
}
template class CList<dir_discHdr>;
template class CList<string>;

View File

@ -1,31 +0,0 @@
#ifndef CLIST
#define CLIST
#include <ogcsys.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/param.h>
#include <sys/stat.h>
#include <unistd.h>
#include "cache.hpp"
#include "config/config.hpp"
#include "devicemounter/DeviceHandler.hpp"
#include "gui/text.hpp"
#include "loader/disc.h"
#include "loader/wbfs_ext.h"
#include "libwbfs/libwbfs.h"
template <typename T>
class CList
{
public:
CList(){};
~CList(){};
void GetPaths(vector<string> &pathlist, string containing, string directory, bool wbfs_fs = false, bool dml = false, bool depth_limit = true);
void GetHeaders(vector<string> pathlist, vector<T> &headerlist, string, string, string, Config &plugin);
void GetChannels(vector<T> &headerlist, string, u32, string);
private:
void Check_For_ID(char *id, string path, string one, string two);
};
#endif

View File

@ -417,11 +417,9 @@ void CMenu::init(void)
m_curLanguage = CMenu::_translations[0]; m_curLanguage = CMenu::_translations[0];
m_loc.load(fmt("%s/%s.ini", m_languagesDir.c_str(), m_curLanguage.c_str())); m_loc.load(fmt("%s/%s.ini", m_languagesDir.c_str(), m_curLanguage.c_str()));
} }
bool extcheck = m_cfg.getBool("GENERAL", "extended_list_check", false);
bool skipcheck = m_cfg.getBool("GENERAL", "skip_list_check", true);
m_tempView = false; m_tempView = false;
m_gameList.Init(m_listCacheDir, m_settingsDir, m_loc.getString(m_curLanguage, "gametdb_code", "EN"), m_DMLgameDir, extcheck, skipcheck); m_gameList.Init(m_settingsDir, m_loc.getString(m_curLanguage, "gametdb_code", "EN"));
m_aa = 3; m_aa = 3;
@ -648,9 +646,9 @@ float CMenu::_getCFFloat(const string &domain, const string &key, float def, boo
void CMenu::_loadCFLayout(int version, bool forceAA, bool otherScrnFmt) void CMenu::_loadCFLayout(int version, bool forceAA, bool otherScrnFmt)
{ {
bool homebrew = m_current_view == COVERFLOW_HOMEBREW; bool homebrew = m_current_view == COVERFLOW_HOMEBREW;
bool smallbox = (homebrew || m_current_view == COVERFLOW_EMU) && m_cfg.getBool(_domainFromView(), "smallbox", true); bool smallbox = (homebrew || m_current_view == COVERFLOW_PLUGIN) && m_cfg.getBool(_domainFromView(), "smallbox", true);
string domain(homebrew ? fmt("_BREWFLOW_%i", version) : m_current_view == COVERFLOW_EMU ? fmt("_EMUFLOW_%i", version) : fmt("_COVERFLOW_%i", version)); string domain(homebrew ? fmt("_BREWFLOW_%i", version) : m_current_view == COVERFLOW_PLUGIN ? fmt("_EMUFLOW_%i", version) : fmt("_COVERFLOW_%i", version));
string domainSel(homebrew ? fmt("_BREWFLOW_%i_S", version) : m_current_view == COVERFLOW_EMU ? fmt("_EMUFLOW_%i_S", version) : fmt("_COVERFLOW_%i_S", version)); string domainSel(homebrew ? fmt("_BREWFLOW_%i_S", version) : m_current_view == COVERFLOW_PLUGIN ? fmt("_EMUFLOW_%i_S", version) : fmt("_COVERFLOW_%i_S", version));
bool sf = otherScrnFmt; bool sf = otherScrnFmt;
int max_fsaa = m_theme.getInt(domain, "max_fsaa", 3); int max_fsaa = m_theme.getInt(domain, "max_fsaa", 3);
@ -1523,7 +1521,7 @@ void CMenu::_initCF(void)
m_cf.reserve(m_gameList.size()); m_cf.reserve(m_gameList.size());
vector<bool> EnabledPlugins; vector<bool> EnabledPlugins;
if(m_current_view == COVERFLOW_EMU) if(m_current_view == COVERFLOW_PLUGIN)
EnabledPlugins = m_plugin.GetEnabledPlugins(m_cfg); EnabledPlugins = m_plugin.GetEnabledPlugins(m_cfg);
bool dumpGameLst = m_cfg.getBool(domain, "dump_list", true); bool dumpGameLst = m_cfg.getBool(domain, "dump_list", true);
@ -1548,7 +1546,7 @@ void CMenu::_initCF(void)
// check for single plugin selected // check for single plugin selected
u8 pos = 0; u8 pos = 0;
u8 enabledPluginsCount = 0; u8 enabledPluginsCount = 0;
if(m_current_view == COVERFLOW_EMU && EnabledPlugins.size() != 0) if(m_current_view == COVERFLOW_PLUGIN && EnabledPlugins.size() != 0)
{ {
char PluginMagicWord[9]; char PluginMagicWord[9];
for(u8 i = 0; i < EnabledPlugins.size(); i++) for(u8 i = 0; i < EnabledPlugins.size(); i++)
@ -2171,9 +2169,10 @@ bool CMenu::_loadChannelList(void)
if(Nand::Instance()->EmulationEnabled() || disable_emu) if(Nand::Instance()->EmulationEnabled() || disable_emu)
{ {
m_gameList.LoadChannels(disable_emu ? "" : nandpath, 0, m_cfg.getString("NAND", "lastlanguage", "EN").c_str()); string cacheDir(fmt("%s/%s_channels.db", m_cacheDir.c_str(), disable_emu ? "nand" : DeviceName[currentPartition]));
m_cfg.setString("NAND", "lastlanguage", m_loc.getString(m_curLanguage, "gametdb_code", "EN")); bool updateCache = disable_emu ? true : m_cfg.getBool(_domainFromView(), "update_cache");
m_cfg.save(); m_gameList.CreateList(m_current_view, currentPartition, std::string(),
stringToVector(std::string(), '|'), cacheDir, updateCache);
} }
lastPartition = currentPartition; lastPartition = currentPartition;
@ -2185,7 +2184,6 @@ bool CMenu::_loadChannelList(void)
bool CMenu::_loadList(void) bool CMenu::_loadList(void)
{ {
m_cf.clear(); m_cf.clear();
m_gameList.clear();
if((m_current_view == COVERFLOW_CHANNEL && m_cfg.getBool("NAND", "disable", true)) if((m_current_view == COVERFLOW_CHANNEL && m_cfg.getBool("NAND", "disable", true))
|| (m_current_view != COVERFLOW_CHANNEL && Nand::Instance()->EmulationEnabled())) || (m_current_view != COVERFLOW_CHANNEL && Nand::Instance()->EmulationEnabled()))
{ {
@ -2193,8 +2191,6 @@ bool CMenu::_loadList(void)
Nand::Instance()->Disable_Emu(); Nand::Instance()->Disable_Emu();
_TempLoadIOS(IOS_TYPE_NORMAL_IOS); _TempLoadIOS(IOS_TYPE_NORMAL_IOS);
} }
if(m_cfg.getBool(_domainFromView(), "update_cache"))
m_gameList.Update(m_current_view);
gprintf("Switching Views\n"); gprintf("Switching Views\n");
bool retval; bool retval;
@ -2209,7 +2205,7 @@ bool CMenu::_loadList(void)
case COVERFLOW_DML: case COVERFLOW_DML:
retval = _loadDmlList(); retval = _loadDmlList();
break; break;
case COVERFLOW_EMU: case COVERFLOW_PLUGIN:
retval = _loadEmuList(); retval = _loadEmuList();
break; break;
default: default:
@ -2224,67 +2220,65 @@ bool CMenu::_loadList(void)
bool CMenu::_loadGameList(void) bool CMenu::_loadGameList(void)
{ {
currentPartition = m_cfg.getInt("GAMES", "partition", 1); currentPartition = m_cfg.getInt("GAMES", "partition", USB1);
if(!DeviceHandle.IsInserted(currentPartition)) if(!DeviceHandle.IsInserted(currentPartition))
return false; return false;
Config tmpcfg;
DeviceHandle.OpenWBFS(currentPartition); DeviceHandle.OpenWBFS(currentPartition);
m_gameList.Load(sfmt(GAMES_DIR, DeviceName[currentPartition]), ".wbfs|.iso", m_cfg.getString("GAMES", "lastlanguage", "EN").c_str(), tmpcfg); string gameDir(fmt(GAMES_DIR, DeviceName[currentPartition]));
m_cfg.setString("GAMES", "lastlanguage", m_loc.getString(m_curLanguage, "gametdb_code", "EN")); string cacheDir(fmt("%s/%s_wii.db", m_cacheDir.c_str(), DeviceName[currentPartition]));
m_cfg.save(); bool updateCache = m_cfg.getBool(_domainFromView(), "update_cache");
m_gameList.CreateList(m_current_view, currentPartition, gameDir, stringToVector(".wbfs|.iso", '|'), cacheDir, updateCache);
WBFS_Close(); WBFS_Close();
return m_gameList.size() > 0 ? true : false; return m_gameList.size() > 0 ? true : false;
} }
bool CMenu::_loadHomebrewList() bool CMenu::_loadHomebrewList()
{ {
currentPartition = m_cfg.getInt("HOMEBREW", "partition", DeviceHandle.PathToDriveType(m_appDir.c_str())); currentPartition = m_cfg.getInt("HOMEBREW", "partition", SD);
if(!DeviceHandle.IsInserted(currentPartition)) if(!DeviceHandle.IsInserted(currentPartition))
return false; return false;
Config tmpcfg; string gameDir(fmt(HOMEBREW_DIR, DeviceName[currentPartition]));
m_gameList.Load(sfmt(HOMEBREW_DIR, DeviceName[currentPartition]), ".dol|.elf", m_cfg.getString("HOMEBREW", "lastlanguage", "EN").c_str(), tmpcfg); string cacheDir(fmt("%s/%s_homebrew.db", m_cacheDir.c_str(), DeviceName[currentPartition]));
m_cfg.setString("HOMEBREW", "lastlanguage", m_loc.getString(m_curLanguage, "gametdb_code", "EN")); bool updateCache = m_cfg.getBool(_domainFromView(), "update_cache");
m_cfg.save(); m_gameList.CreateList(m_current_view, currentPartition, gameDir, stringToVector(".dol|.elf", '|'), cacheDir, updateCache);
return m_gameList.size() > 0 ? true : false; return m_gameList.size() > 0 ? true : false;
} }
bool CMenu::_loadDmlList() bool CMenu::_loadDmlList()
{ {
currentPartition = m_cfg.getInt("DML", "partition", 0); currentPartition = m_cfg.getInt("DML", "partition", USB1);
if(!DeviceHandle.IsInserted(currentPartition)) if(!DeviceHandle.IsInserted(currentPartition))
return false; return false;
Config tmpcfg; string gameDir(fmt(currentPartition == SD ? DML_DIR : m_DMLgameDir.c_str(), DeviceName[currentPartition]));
if(currentPartition != SD) string cacheDir(fmt("%s/%s_gamecube.db", m_cacheDir.c_str(), DeviceName[currentPartition]));
m_gameList.Load(sfmt(m_DMLgameDir.c_str(), DeviceName[currentPartition]), "boot.bin|.iso", m_cfg.getString("DML", "lastlanguage", "EN").c_str(), tmpcfg); bool updateCache = m_cfg.getBool(_domainFromView(), "update_cache");
else m_gameList.CreateList(m_current_view, currentPartition, gameDir, stringToVector(".iso", '|'), cacheDir, updateCache);
m_gameList.Load(sfmt(DML_DIR, DeviceName[currentPartition]), "boot.bin|.iso", m_cfg.getString("DML", "lastlanguage", "EN").c_str(), tmpcfg);
m_cfg.setString("DML", "lastlanguage", m_loc.getString(m_curLanguage, "gametdb_code", "EN"));
m_cfg.save();
return m_gameList.size() > 0 ? true : false; return m_gameList.size() > 0 ? true : false;
} }
bool CMenu::_loadEmuList() bool CMenu::_loadEmuList()
{ {
currentPartition = m_cfg.getInt("EMULATOR", "partition", 0); currentPartition = m_cfg.getInt("EMULATOR", "partition", SD);
if(!DeviceHandle.IsInserted(currentPartition)) if(!DeviceHandle.IsInserted(currentPartition))
return false; return false;
bool updateCache = m_cfg.getBool(_domainFromView(), "update_cache");
DIR *pdir; DIR *pdir;
struct dirent *pent; struct dirent *pent;
pdir = opendir(m_pluginsDir.c_str());
vector<dir_discHdr> emuList; vector<dir_discHdr> emuList;
Config m_plugin_cfg; Config m_plugin_cfg;
while ((pent = readdir(pdir)) != NULL) pdir = opendir(m_pluginsDir.c_str());
while((pent = readdir(pdir)) != NULL)
{ {
// Skip it if(strcmp(pent->d_name, ".") == 0 || strcmp(pent->d_name, "..") == 0 || strcasecmp(pent->d_name, "scummvm.ini") == 0)
if (strcmp(pent->d_name, ".") == 0 || strcmp(pent->d_name, "..") == 0
|| strcasecmp(pent->d_name, "plugins.ini") == 0 || strcasecmp(pent->d_name, "scummvm.ini") == 0)
continue; continue;
if(strcasestr(pent->d_name, ".ini") != NULL) if(strcasestr(pent->d_name, ".ini") != NULL)
{ {
@ -2292,10 +2286,15 @@ bool CMenu::_loadEmuList()
if(m_plugin_cfg.loaded()) if(m_plugin_cfg.loaded())
{ {
m_plugin.AddPlugin(m_plugin_cfg); m_plugin.AddPlugin(m_plugin_cfg);
m_gameList.clear(); if(m_plugin_cfg.getString(PLUGIN_DOMAIN,"romDir").find("scummvm.ini") == string::npos)
if(m_plugin_cfg.getString("PLUGIN","romDir","").find("scummvm.ini") == string::npos)
{ {
m_gameList.Load(sfmt("%s:/%s", DeviceName[currentPartition], m_plugin_cfg.getString("PLUGIN","romDir","").c_str()), m_plugin_cfg.getString("PLUGIN","fileTypes","").c_str(), m_cfg.getString("EMULATOR", "lastlanguage", "EN").c_str(), m_plugin_cfg); string gameDir(fmt("%s:/%s", DeviceName[currentPartition], m_plugin_cfg.getString(PLUGIN_DOMAIN,"romDir").c_str()));
string cacheDir(fmt("%s/%s_%s.db", m_cacheDir.c_str(), DeviceName[currentPartition], m_plugin_cfg.getString(PLUGIN_DOMAIN,"magic").c_str()));
string FileTypes(m_plugin_cfg.getString(PLUGIN_DOMAIN,"fileTypes"));
u32 CaseColor = strtoul(m_plugin_cfg.getString(PLUGIN_DOMAIN,"coverColor").c_str(), NULL, 16);
u32 MagicWord = strtoul(m_plugin_cfg.getString(PLUGIN_DOMAIN,"magic").c_str(), NULL, 16);
m_gameList.CreateList(m_current_view, currentPartition, gameDir,
stringToVector(FileTypes, '|'), cacheDir, updateCache, CaseColor, MagicWord);
for(vector<dir_discHdr>::iterator tmp_itr = m_gameList.begin(); tmp_itr != m_gameList.end(); tmp_itr++) for(vector<dir_discHdr>::iterator tmp_itr = m_gameList.begin(); tmp_itr != m_gameList.end(); tmp_itr++)
emuList.push_back(*tmp_itr); emuList.push_back(*tmp_itr);
} }
@ -2319,8 +2318,6 @@ bool CMenu::_loadEmuList()
emuList.clear(); emuList.clear();
//If we return to the coverflow before wiiflow quit we dont need to reload plugins //If we return to the coverflow before wiiflow quit we dont need to reload plugins
m_plugin.EndAdd(); m_plugin.EndAdd();
m_cfg.setString("EMULATOR", "lastlanguage", m_loc.getString(m_curLanguage, "gametdb_code", "EN"));
m_cfg.save();
return m_gameList.size() > 0 ? true : false; return m_gameList.size() > 0 ? true : false;
} }
@ -2544,7 +2541,7 @@ const char *CMenu::_domainFromView()
return "HOMEBREW"; return "HOMEBREW";
case COVERFLOW_DML: case COVERFLOW_DML:
return "DML"; return "DML";
case COVERFLOW_EMU: case COVERFLOW_PLUGIN:
return "EMULATOR"; return "EMULATOR";
default: default:
return "GAMES"; return "GAMES";
@ -2559,7 +2556,7 @@ void CMenu::UpdateCache(u32 view)
UpdateCache(COVERFLOW_USB); UpdateCache(COVERFLOW_USB);
UpdateCache(COVERFLOW_HOMEBREW); UpdateCache(COVERFLOW_HOMEBREW);
UpdateCache(COVERFLOW_DML); UpdateCache(COVERFLOW_DML);
UpdateCache(COVERFLOW_EMU); UpdateCache(COVERFLOW_PLUGIN);
UpdateCache(COVERFLOW_CHANNEL); UpdateCache(COVERFLOW_CHANNEL);
return; return;
} }
@ -2576,7 +2573,7 @@ void CMenu::UpdateCache(u32 view)
case COVERFLOW_DML: case COVERFLOW_DML:
domain = "DML"; domain = "DML";
break; break;
case COVERFLOW_EMU: case COVERFLOW_PLUGIN:
domain = "EMULATOR"; domain = "EMULATOR";
break; break;
default: default:

View File

@ -17,7 +17,7 @@
#include "gui/cursor.hpp" #include "gui/cursor.hpp"
#include "gui/fanart.hpp" #include "gui/fanart.hpp"
#include "gui/gui.hpp" #include "gui/gui.hpp"
#include "list/cachedlist.hpp" #include "list/ListGenerator.hpp"
#include "loader/disc.h" #include "loader/disc.h"
#include "loader/gc_disc_dump.hpp" #include "loader/gc_disc_dump.hpp"
#include "loader/wbfs.h" #include "loader/wbfs.h"
@ -56,7 +56,7 @@ private:
CButtonsMgr m_btnMgr; CButtonsMgr m_btnMgr;
CCoverFlow m_cf; CCoverFlow m_cf;
CFanart m_fa; CFanart m_fa;
CachedList m_gameList; ListGenerator m_gameList;
Config m_cfg; Config m_cfg;
Config m_loc; Config m_loc;
Config m_cat; Config m_cat;
@ -976,7 +976,7 @@ private:
vector<dir_discHdr> _searchGamesByType(const char type); vector<dir_discHdr> _searchGamesByType(const char type);
vector<dir_discHdr> _searchGamesByRegion(const char region); */ vector<dir_discHdr> _searchGamesByRegion(const char region); */
public: public:
void directlaunch(const string &id); void directlaunch(const char *GameID);
private: private:
bool m_use_wifi_gecko; bool m_use_wifi_gecko;
void _reload_wifi_gecko(); void _reload_wifi_gecko();

View File

@ -150,7 +150,7 @@ void CMenu::_CategorySettings(bool fromGameSet)
catDomain = _domainFromView(); catDomain = _domainFromView();
u8 pos = 0; u8 pos = 0;
vector<bool> EnabledPlugins; vector<bool> EnabledPlugins;
if(m_current_view == COVERFLOW_EMU) if(m_current_view == COVERFLOW_PLUGIN)
{ {
EnabledPlugins = m_plugin.GetEnabledPlugins(m_cfg); EnabledPlugins = m_plugin.GetEnabledPlugins(m_cfg);
if(EnabledPlugins.size() != 0) if(EnabledPlugins.size() != 0)

View File

@ -554,7 +554,7 @@ const char *CMenu::_cfDomain(bool selected)
{ {
switch(m_current_view) switch(m_current_view)
{ {
case COVERFLOW_EMU: case COVERFLOW_PLUGIN:
return selected ? "_EMUFLOW_%i_S" : "_EMUFLOW_%i"; return selected ? "_EMUFLOW_%i_S" : "_EMUFLOW_%i";
case COVERFLOW_HOMEBREW: case COVERFLOW_HOMEBREW:
return selected ? "_BREWFLOW_%i_S" : "_BREWFLOW_%i"; return selected ? "_BREWFLOW_%i_S" : "_BREWFLOW_%i";

View File

@ -201,7 +201,7 @@ int CMenu::_config1(void)
_cfNeedsUpdate(); _cfNeedsUpdate();
m_cf.stopCoverLoader(true); m_cf.stopCoverLoader(true);
_hideConfig(); _hideConfig();
if(m_current_view != COVERFLOW_EMU) if(m_current_view != COVERFLOW_PLUGIN)
_NandEmuCfg(); _NandEmuCfg();
else else
_PluginSettings(); _PluginSettings();
@ -286,7 +286,7 @@ void CMenu::_textConfig(void)
m_btnMgr.setText(m_configBtnSetCode, _t("cfg7", L"Set code")); m_btnMgr.setText(m_configBtnSetCode, _t("cfg7", L"Set code"));
m_btnMgr.setText(m_configLblPartitionName, _t("cfgp1", L"Game Partition")); m_btnMgr.setText(m_configLblPartitionName, _t("cfgp1", L"Game Partition"));
m_btnMgr.setText(m_configBtnBack, _t("cfg10", L"Back")); m_btnMgr.setText(m_configBtnBack, _t("cfg10", L"Back"));
if(m_current_view != COVERFLOW_EMU) if(m_current_view != COVERFLOW_PLUGIN)
{ {
m_btnMgr.setText(m_configLblCfg4, _t("cfg13", L"NAND Emulation Settings")); m_btnMgr.setText(m_configLblCfg4, _t("cfg13", L"NAND Emulation Settings"));
m_btnMgr.setText(m_configBtnCfg4, _t("cfg14", L"Set")); m_btnMgr.setText(m_configBtnCfg4, _t("cfg14", L"Set"));

View File

@ -171,8 +171,8 @@ int CMenu::_configAdv(void)
_hideConfigAdv(); _hideConfigAdv();
if (m_gameList.empty() || lang_changed) if (m_gameList.empty() || lang_changed)
{ {
if(lang_changed) //if(lang_changed)
m_gameList.SetLanguage(m_loc.getString(m_curLanguage, "gametdb_code", "EN").c_str()); //m_gameList.SetLanguage(m_loc.getString(m_curLanguage, "gametdb_code", "EN").c_str());
_loadList(); _loadList();
} }

View File

@ -2054,7 +2054,7 @@ int CMenu::_gametdbDownloaderAsync()
remove(offsetspath.c_str()); remove(offsetspath.c_str());
// Update cache // Update cache
m_gameList.SetLanguage(m_loc.getString(m_curLanguage, "gametdb_code", "EN").c_str()); //m_gameList.SetLanguage(m_loc.getString(m_curLanguage, "gametdb_code", "EN").c_str());
UpdateCache(); UpdateCache();
LWP_MutexLock(m_mutex); LWP_MutexLock(m_mutex);

View File

@ -571,22 +571,21 @@ void CMenu::_game(bool launch)
!m_devo_installed || min((u32)m_gcfg2.getInt(hdr->id, "gc_loader", 0), ARRAY_SIZE(CMenu::_GCLoader) - 1u) == 1)) !m_devo_installed || min((u32)m_gcfg2.getInt(hdr->id, "gc_loader", 0), ARRAY_SIZE(CMenu::_GCLoader) - 1u) == 1))
{ {
bool foundOnSD = false; bool foundOnSD = false;
CList<dir_discHdr> tmplist; ListGenerator SD_List;
vector<string> pathlist; string gameDir(fmt(DML_DIR, DeviceName[SD]));
tmplist.GetPaths(pathlist, ".iso|.bin", "sd:/games", false, true); string cacheDir(fmt("%s/%s_gamecube.db", m_cacheDir.c_str(), DeviceName[SD]));
vector<dir_discHdr> tmpGameList; SD_List.CreateList(COVERFLOW_DML, SD, gameDir, stringToVector(".iso", '|'), cacheDir, false);
Config nullCfg; for(vector<dir_discHdr>::iterator List = SD_List.begin(); List != SD_List.end(); List++)
tmplist.GetHeaders(pathlist, tmpGameList, m_settingsDir, m_curLanguage, m_DMLgameDir, nullCfg);
for(u8 i = 0; i < tmpGameList.size(); i++)
{ {
if(strncasecmp(tmpGameList.at(i).id, hdr->id, 6) == 0) if(strncasecmp(hdr->id, List->id, 6) == 0)
{ {
foundOnSD = true; foundOnSD = true;
memset(hdr->path, 0, sizeof(hdr->path)); memset(hdr->path, 0, sizeof(hdr->path));
strncpy(hdr->path, tmpGameList.at(i).path, sizeof(hdr->path)); strncpy(hdr->path, List->path, sizeof(hdr->path));
break; break;
} }
} }
SD_List.clear();
if(!foundOnSD) if(!foundOnSD)
{ {
if(_wbfsOp(CMenu::WO_COPY_GAME)) if(_wbfsOp(CMenu::WO_COPY_GAME))
@ -749,30 +748,28 @@ void CMenu::_game(bool launch)
_hideGame(); _hideGame();
} }
void CMenu::directlaunch(const string &id) void CMenu::directlaunch(const char *GameID)
{ {
m_directLaunch = true; m_directLaunch = true;
for(currentPartition = SD; currentPartition < USB8; currentPartition++)
for (int i = USB1; i < USB8; i++)
{ {
if(!DeviceHandle.IsInserted(i)) continue; if(!DeviceHandle.IsInserted(currentPartition))
continue;
DeviceHandle.OpenWBFS(i); DeviceHandle.OpenWBFS(currentPartition);
CList<dir_discHdr> list; string gameDir(fmt(GAMES_DIR, DeviceName[currentPartition]));
string path = sfmt(GAMES_DIR, DeviceName[i]); string cacheDir(fmt("%s/%s_wii.db", m_cacheDir.c_str(), DeviceName[currentPartition]));
vector<string> pathlist; m_gameList.CreateList(COVERFLOW_USB, currentPartition, gameDir, stringToVector(".wbfs|.iso", '|'), cacheDir, false);
list.GetPaths(pathlist, id.c_str(), path, strncasecmp(DeviceHandle.PathToFSName(path.c_str()), "WBFS", 4) == 0);
m_gameList.clear();
Config nullCfg;
list.GetHeaders(pathlist, m_gameList, m_settingsDir, m_curLanguage, m_DMLgameDir, nullCfg);
if(m_gameList.size() > 0)
{
gprintf("Game found on partition #%i\n", i);
_launch(&m_gameList[0]); // Launch will exit wiiflow
}
WBFS_Close(); WBFS_Close();
for(u32 i = 0; i < m_gameList.size(); i++)
{
if(strncasecmp(GameID, m_gameList[i].id, 6) == 0)
{
_launchGame(&m_gameList[i], false); // Launch will exit wiiflow
break;
}
}
} }
error(sfmt("errgame1", L"Cannot find the game with ID: %s", id.c_str())); error(sfmt("errgame1", L"Cannot find the game with ID: %s", GameID));
} }
void CMenu::_launch(dir_discHdr *hdr) void CMenu::_launch(dir_discHdr *hdr)

View File

@ -48,7 +48,7 @@ bool CMenu::_Home(void)
} }
else if(m_btnMgr.selected(m_homeBtnReloadCache)) else if(m_btnMgr.selected(m_homeBtnReloadCache))
{ {
m_gameList.SetLanguage(m_loc.getString(m_curLanguage, "gametdb_code", "EN").c_str()); //m_gameList.SetLanguage(m_loc.getString(m_curLanguage, "gametdb_code", "EN").c_str());
UpdateCache(m_current_view); UpdateCache(m_current_view);
LoadView(); LoadView();
break; break;

View File

@ -115,7 +115,7 @@ void CMenu::_showMain(void)
case COVERFLOW_HOMEBREW: case COVERFLOW_HOMEBREW:
m_btnMgr.show(m_mainBtnUsb); m_btnMgr.show(m_mainBtnUsb);
break; break;
case COVERFLOW_EMU: case COVERFLOW_PLUGIN:
if (show_homebrew && (parental_homebrew || !m_locked)) if (show_homebrew && (parental_homebrew || !m_locked))
m_btnMgr.show(m_mainBtnHomebrew); m_btnMgr.show(m_mainBtnHomebrew);
else else
@ -168,7 +168,7 @@ void CMenu::_showMain(void)
m_btnMgr.show(m_mainBtnInit2); m_btnMgr.show(m_mainBtnInit2);
m_btnMgr.show(m_mainLblInit); m_btnMgr.show(m_mainLblInit);
break; break;
case COVERFLOW_EMU: case COVERFLOW_PLUGIN:
m_btnMgr.setText(m_mainLblInit, _t("main5", L"Welcome to WiiFlow. I have not found any plugins. Select partition to select your partition type."), true); m_btnMgr.setText(m_mainLblInit, _t("main5", L"Welcome to WiiFlow. I have not found any plugins. Select partition to select your partition type."), true);
m_btnMgr.show(m_mainBtnInit2); m_btnMgr.show(m_mainBtnInit2);
m_btnMgr.show(m_mainLblInit); m_btnMgr.show(m_mainLblInit);
@ -259,12 +259,12 @@ int CMenu::main(void)
m_gametdb.CloseFile(); m_gametdb.CloseFile();
} }
if(m_Emulator_boot) if(m_Emulator_boot)
m_current_view = COVERFLOW_EMU; m_current_view = COVERFLOW_PLUGIN;
if(m_cfg.getBool("GENERAL", "update_cache", false)) if(m_cfg.getBool("GENERAL", "update_cache", false))
{ {
UpdateCache(); UpdateCache();
m_gameList.Update(); //m_gameList.Update();
} }
LoadView(); LoadView();
if(m_cfg.getBool("GENERAL", "startup_menu", false)) if(m_cfg.getBool("GENERAL", "startup_menu", false))
@ -311,7 +311,7 @@ int CMenu::main(void)
else if(BTN_DOWN_PRESSED && (m_show_dml ||m_devo_installed)) else if(BTN_DOWN_PRESSED && (m_show_dml ||m_devo_installed))
m_current_view = COVERFLOW_DML; m_current_view = COVERFLOW_DML;
else if(BTN_LEFT_PRESSED && show_emu) else if(BTN_LEFT_PRESSED && show_emu)
m_current_view = COVERFLOW_EMU; m_current_view = COVERFLOW_PLUGIN;
else if(BTN_RIGHT_PRESSED && show_channel) else if(BTN_RIGHT_PRESSED && show_channel)
m_current_view = COVERFLOW_CHANNEL; m_current_view = COVERFLOW_CHANNEL;
if(lastView == m_current_view) if(lastView == m_current_view)
@ -346,12 +346,12 @@ 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)) 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) if(m_current_view == COVERFLOW_USB)
m_current_view = (m_show_dml || m_devo_installed) ? COVERFLOW_DML : (show_channel ? COVERFLOW_CHANNEL : (show_emu ? COVERFLOW_EMU : ((show_homebrew && (parental_homebrew || !m_locked)) ? COVERFLOW_HOMEBREW : COVERFLOW_USB))); m_current_view = (m_show_dml || m_devo_installed) ? COVERFLOW_DML : (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) else if(m_current_view == COVERFLOW_DML)
m_current_view = show_channel ? COVERFLOW_CHANNEL : ((show_emu ? COVERFLOW_EMU : (show_homebrew && (parental_homebrew || !m_locked)) ? COVERFLOW_HOMEBREW : COVERFLOW_USB)); m_current_view = show_channel ? COVERFLOW_CHANNEL : ((show_emu ? COVERFLOW_PLUGIN : (show_homebrew && (parental_homebrew || !m_locked)) ? COVERFLOW_HOMEBREW : COVERFLOW_USB));
else if(m_current_view == COVERFLOW_CHANNEL) else if(m_current_view == COVERFLOW_CHANNEL)
m_current_view = (show_emu ? COVERFLOW_EMU : (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_USB);
else if(m_current_view == COVERFLOW_EMU) 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_USB;
else if(m_current_view == COVERFLOW_HOMEBREW) else if(m_current_view == COVERFLOW_HOMEBREW)
m_current_view = COVERFLOW_USB; m_current_view = COVERFLOW_USB;
@ -651,7 +651,7 @@ int CMenu::main(void)
u8 limiter = 0; u8 limiter = 0;
currentPartition = loopNum(currentPartition + 1, (int)USB8); currentPartition = loopNum(currentPartition + 1, (int)USB8);
while(!DeviceHandle.IsInserted(currentPartition) || while(!DeviceHandle.IsInserted(currentPartition) ||
((m_current_view == COVERFLOW_CHANNEL || m_current_view == COVERFLOW_EMU) && (DeviceHandle.GetFSType(currentPartition) != PART_FS_FAT || ((m_current_view == COVERFLOW_CHANNEL || m_current_view == COVERFLOW_PLUGIN) && (DeviceHandle.GetFSType(currentPartition) != PART_FS_FAT ||
(!isD2XnewerThanV6 && DeviceHandle.PathToDriveType(m_appDir.c_str()) == currentPartition) || (!isD2XnewerThanV6 && DeviceHandle.PathToDriveType(m_appDir.c_str()) == currentPartition) ||
(!isD2XnewerThanV6 && DeviceHandle.PathToDriveType(m_dataDir.c_str()) == currentPartition))) || (!isD2XnewerThanV6 && DeviceHandle.PathToDriveType(m_dataDir.c_str()) == currentPartition))) ||
((m_current_view == COVERFLOW_HOMEBREW || m_current_view == COVERFLOW_DML) && DeviceHandle.GetFSType(currentPartition) == PART_FS_WBFS)) ((m_current_view == COVERFLOW_HOMEBREW || m_current_view == COVERFLOW_DML) && DeviceHandle.GetFSType(currentPartition) == PART_FS_WBFS))
@ -761,7 +761,7 @@ int CMenu::main(void)
else else
m_btnMgr.show(m_mainBtnUsb); m_btnMgr.show(m_mainBtnUsb);
break; break;
case COVERFLOW_EMU: case COVERFLOW_PLUGIN:
if(show_homebrew && (parental_homebrew || !m_locked)) if(show_homebrew && (parental_homebrew || !m_locked))
m_btnMgr.show(m_mainBtnHomebrew); m_btnMgr.show(m_mainBtnHomebrew);
else else

View File

@ -1,3 +1,5 @@
#include <dirent.h>
#include <unistd.h>
#include "menu.hpp" #include "menu.hpp"
#include "defines.h" #include "defines.h"

View File

@ -1,3 +1,6 @@
#include <dirent.h>
#include <unistd.h>
#include "menu.hpp" #include "menu.hpp"
#include "defines.h" #include "defines.h"
@ -253,7 +256,7 @@ bool CMenu::_Source()
if (!show_emu) _showSourceNotice(); if (!show_emu) _showSourceNotice();
else else
{ {
m_current_view = COVERFLOW_EMU; m_current_view = COVERFLOW_PLUGIN;
break; break;
} }
} }
@ -316,7 +319,7 @@ bool CMenu::_Source()
if (!show_emu) _showSourceNotice(); if (!show_emu) _showSourceNotice();
else else
{ {
m_current_view = COVERFLOW_EMU; m_current_view = COVERFLOW_PLUGIN;
imgSelected = true; imgSelected = true;
for (u8 j = 0; j < numPlugins; ++j) for (u8 j = 0; j < numPlugins; ++j)
@ -332,7 +335,7 @@ bool CMenu::_Source()
_showSourceNotice(); _showSourceNotice();
else else
{ {
m_current_view = COVERFLOW_EMU; m_current_view = COVERFLOW_PLUGIN;
imgSelected = true; imgSelected = true;
u32 sourceMagic = strtoul(m_source.getString(fmt("BUTTON_%i", i + j), "magic","").c_str(), NULL, 16); u32 sourceMagic = strtoul(m_source.getString(fmt("BUTTON_%i", i + j), "magic","").c_str(), NULL, 16);
for (u8 k = 0; k < numPlugins; ++k) for (u8 k = 0; k < numPlugins; ++k)

View File

@ -470,7 +470,7 @@ bool CMenu::_wbfsOp(CMenu::WBFS_OP op)
_hideWBFS(); _hideWBFS();
if (done && (op == CMenu::WO_REMOVE_GAME || op == CMenu::WO_ADD_GAME)) if (done && (op == CMenu::WO_REMOVE_GAME || op == CMenu::WO_ADD_GAME))
{ {
m_gameList.SetLanguage(m_loc.getString(m_curLanguage, "gametdb_code", "EN").c_str()); //m_gameList.SetLanguage(m_loc.getString(m_curLanguage, "gametdb_code", "EN").c_str());
if(upd_dml) if(upd_dml)
UpdateCache(COVERFLOW_DML); UpdateCache(COVERFLOW_DML);
@ -479,7 +479,7 @@ bool CMenu::_wbfsOp(CMenu::WBFS_OP op)
UpdateCache(COVERFLOW_USB); UpdateCache(COVERFLOW_USB);
if(upd_emu) if(upd_emu)
UpdateCache(COVERFLOW_EMU); UpdateCache(COVERFLOW_PLUGIN);
_loadList(); _loadList();
_initCF(); _initCF();
@ -487,7 +487,7 @@ bool CMenu::_wbfsOp(CMenu::WBFS_OP op)
} }
else if(done && op == CMenu::WO_COPY_GAME) else if(done && op == CMenu::WO_COPY_GAME)
{ {
m_gameList.SetLanguage(m_loc.getString(m_curLanguage, "gametdb_code", "EN").c_str()); //m_gameList.SetLanguage(m_loc.getString(m_curLanguage, "gametdb_code", "EN").c_str());
if(upd_dml) if(upd_dml)
{ {
UpdateCache(COVERFLOW_DML); UpdateCache(COVERFLOW_DML);

View File

@ -6,6 +6,15 @@
extern "C" { extern "C" {
#endif #endif
enum {
COVERFLOW_USB = 0,
COVERFLOW_DML,
COVERFLOW_CHANNEL,
COVERFLOW_PLUGIN,
COVERFLOW_HOMEBREW,
COVERFLOW_MAX
};
enum enum
{ {
TYPE_WII_DISC = 0, TYPE_WII_DISC = 0,