GameListCtrl: fixes progress bar for extracting multiple files (cant mix ascii with unicode wxstring:format)
use appropriate extensions extracting compressed wii discs check for tmd+tik for each title and list titles correctly for sysmenu versions <=0xE0 this will allow viewing of installed channels but they will not launch until ES_Launch is emulated so far I have not been able to determine why later sysmenu versions do not display channels correctly switching between system menu versions is as simple as rightclicking a system menu wad in the gamelist and installing to wiimenu than restarting git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@5524 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
parent
99d9aa0613
commit
ffc0c37365
|
@ -79,6 +79,16 @@ bool CWII_IPC_HLE_Device_es::Open(u32 _CommandAddress, u32 _Mode)
|
||||||
if (m_pContentLoader->IsValid())
|
if (m_pContentLoader->IsValid())
|
||||||
{
|
{
|
||||||
m_TitleID = m_pContentLoader->GetTitleID();
|
m_TitleID = m_pContentLoader->GetTitleID();
|
||||||
|
// System menu versions about 0xE0 will indicate that system files are corrupted if there is more than one title
|
||||||
|
// TODO: fix System menu versions above this and remove this check
|
||||||
|
if (m_pContentLoader->GetTitleVersion() <= 0xE0)
|
||||||
|
{
|
||||||
|
DiscIO::cUIDsys::AccessInstance().GetTitleIDs(m_TitleIDs);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_TitleIDs.push_back(0x0000000100000002ULL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (VolumeHandler::IsValid())
|
else if (VolumeHandler::IsValid())
|
||||||
{
|
{
|
||||||
|
@ -92,18 +102,6 @@ bool CWII_IPC_HLE_Device_es::Open(u32 _CommandAddress, u32 _Mode)
|
||||||
m_TitleID = ((u64)0x00010000 << 32) | 0xF00DBEEF;
|
m_TitleID = ((u64)0x00010000 << 32) | 0xF00DBEEF;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: when dev/fs IOCTLV_GETUSAGE is correct (wii doesnt report fs as corrupt) uncomment this line
|
|
||||||
// title ids are all listed in sys/uid.sys - lpfaint99
|
|
||||||
//DiscIO::cUIDsys::AccessInstance().GetTitleIDs(m_TitleIDs);
|
|
||||||
|
|
||||||
m_TitleIDs.push_back(0x0000000100000002ULL);
|
|
||||||
//m_TitleIDs.push_back(0x0001000248414741ULL);
|
|
||||||
//m_TitleIDs.push_back(0x0001000248414341ULL);
|
|
||||||
//m_TitleIDs.push_back(0x0001000248414241ULL);
|
|
||||||
//m_TitleIDs.push_back(0x0001000248414141ULL);
|
|
||||||
// scan for the title ids listed in TMDs within /title/
|
|
||||||
//FindValidTitleIDs();
|
|
||||||
|
|
||||||
INFO_LOG(WII_IPC_ES, "Set default title to %08x/%08x", (u32)(m_TitleID>>32), (u32)m_TitleID);
|
INFO_LOG(WII_IPC_ES, "Set default title to %08x/%08x", (u32)(m_TitleID>>32), (u32)m_TitleID);
|
||||||
|
|
||||||
Memory::Write_U32(GetDeviceID(), _CommandAddress+4);
|
Memory::Write_U32(GetDeviceID(), _CommandAddress+4);
|
||||||
|
@ -772,36 +770,3 @@ std::string CWII_IPC_HLE_Device_es::CreateTitleContentPath(u64 _TitleID) const
|
||||||
return TicketFilename;
|
return TicketFilename;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CWII_IPC_HLE_Device_es::FindValidTitleIDs()
|
|
||||||
{
|
|
||||||
m_TitleIDs.clear();
|
|
||||||
char TitlePath[1024];
|
|
||||||
|
|
||||||
sprintf(TitlePath, "%stitle", File::GetUserPath(D_WIIUSER_IDX));
|
|
||||||
File::FSTEntry ParentEntry;
|
|
||||||
(void)ScanDirectoryTree(TitlePath, ParentEntry);
|
|
||||||
for(std::vector<File::FSTEntry>::iterator Level1 = ParentEntry.children.begin(); Level1 != ParentEntry.children.end(); ++Level1)
|
|
||||||
{
|
|
||||||
if (Level1->isDirectory)
|
|
||||||
{
|
|
||||||
for(std::vector<File::FSTEntry>::iterator Level2 = Level1->children.begin(); Level2 != Level1->children.end(); ++Level2)
|
|
||||||
{
|
|
||||||
if (Level2->isDirectory)
|
|
||||||
{
|
|
||||||
// finally at /title/*/*/
|
|
||||||
// ...get titleID from content/title.tmd
|
|
||||||
std::string CurrentTMD(Level2->physicalName + DIR_SEP + "content" + DIR_SEP + "title.tmd");
|
|
||||||
if (File::Exists(CurrentTMD.c_str()))
|
|
||||||
{
|
|
||||||
FILE* pTMDFile = fopen(CurrentTMD.c_str(), "rb");
|
|
||||||
u64 TitleID = 0xDEADBEEFDEADBEEFULL;
|
|
||||||
fseek(pTMDFile, 0x18C, SEEK_SET);
|
|
||||||
fread(&TitleID, 8, 1, pTMDFile);
|
|
||||||
m_TitleIDs.push_back(Common::swap64(TitleID));
|
|
||||||
fclose(pTMDFile);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -144,7 +144,6 @@ private:
|
||||||
|
|
||||||
std::string CreateTicketFileName(u64 _TitleID) const;
|
std::string CreateTicketFileName(u64 _TitleID) const;
|
||||||
std::string CreateTitleContentPath(u64 _TitleID) const;
|
std::string CreateTitleContentPath(u64 _TitleID) const;
|
||||||
void FindValidTitleIDs();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -34,8 +34,9 @@ cUIDsys cUIDsys::m_Instance;
|
||||||
|
|
||||||
CSharedContent::CSharedContent()
|
CSharedContent::CSharedContent()
|
||||||
{
|
{
|
||||||
sprintf(contentMap, "%sshared1/content.map", File::GetUserPath(D_WIIUSER_IDX));
|
|
||||||
lastID = 0;
|
lastID = 0;
|
||||||
|
sprintf(contentMap, "%sshared1/content.map", File::GetUserPath(D_WIIUSER_IDX));
|
||||||
|
|
||||||
if (File::Exists(contentMap))
|
if (File::Exists(contentMap))
|
||||||
{
|
{
|
||||||
FILE* pFile = fopen(contentMap, "rb");
|
FILE* pFile = fopen(contentMap, "rb");
|
||||||
|
@ -267,6 +268,7 @@ bool CNANDContentLoader::CreateFromDirectory(const std::string& _rPath)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ERROR_LOG(DISCIO, "NANDContentLoader: error opening %s", szFilename);
|
ERROR_LOG(DISCIO, "NANDContentLoader: error opening %s", szFilename);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -378,6 +380,8 @@ cUIDsys::cUIDsys()
|
||||||
{
|
{
|
||||||
sprintf(uidSys, "%ssys/uid.sys", File::GetUserPath(D_WIIUSER_IDX));
|
sprintf(uidSys, "%ssys/uid.sys", File::GetUserPath(D_WIIUSER_IDX));
|
||||||
lastUID = 0x00001000;
|
lastUID = 0x00001000;
|
||||||
|
bool validTMD;
|
||||||
|
bool validTIK;
|
||||||
if (File::Exists(uidSys))
|
if (File::Exists(uidSys))
|
||||||
{
|
{
|
||||||
FILE* pFile = fopen(uidSys, "rb");
|
FILE* pFile = fopen(uidSys, "rb");
|
||||||
|
@ -386,10 +390,13 @@ cUIDsys::cUIDsys()
|
||||||
SElement Element;
|
SElement Element;
|
||||||
if (fread(&Element, sizeof(SElement), 1, pFile) == 1)
|
if (fread(&Element, sizeof(SElement), 1, pFile) == 1)
|
||||||
{
|
{
|
||||||
if (CheckValidTitle(Common::swap64(Element.titleID)))
|
validTMD = CheckTitleTMD(Common::swap64(Element.titleID));
|
||||||
|
validTIK = CheckTitleTIK(Common::swap64(Element.titleID));
|
||||||
|
if (validTMD && validTIK)
|
||||||
{
|
{
|
||||||
|
*(u32*)&(Element.UID) = Common::swap32(lastUID++);
|
||||||
m_Elements.push_back(Element);
|
m_Elements.push_back(Element);
|
||||||
lastUID++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -397,7 +404,18 @@ cUIDsys::cUIDsys()
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
SElement Element;
|
||||||
|
*(u64*)&(Element.titleID) = Common::swap64(0x0000000100000002ull);
|
||||||
|
*(u32*)&(Element.UID) = Common::swap32(lastUID++);
|
||||||
|
|
||||||
File::CreateFullPath(uidSys);
|
File::CreateFullPath(uidSys);
|
||||||
|
FILE* pFile = fopen(uidSys, "wb");
|
||||||
|
if (pFile)
|
||||||
|
{
|
||||||
|
if (fwrite(&Element, sizeof(SElement), 1, pFile) != 1)
|
||||||
|
ERROR_LOG(DISCIO, "fwrite failed");
|
||||||
|
fclose(pFile);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -424,9 +442,8 @@ bool cUIDsys::AddTitle(u64 _TitleID)
|
||||||
{
|
{
|
||||||
SElement Element;
|
SElement Element;
|
||||||
*(u64*)&(Element.titleID) = Common::swap64(_TitleID);
|
*(u64*)&(Element.titleID) = Common::swap64(_TitleID);
|
||||||
*(u32*)&(Element.UID) = Common::swap32(lastUID);
|
*(u32*)&(Element.UID) = Common::swap32(lastUID++);
|
||||||
m_Elements.push_back(Element);
|
m_Elements.push_back(Element);
|
||||||
lastUID++;
|
|
||||||
FILE* pFile = fopen(uidSys, "ab");
|
FILE* pFile = fopen(uidSys, "ab");
|
||||||
if (pFile)
|
if (pFile)
|
||||||
{
|
{
|
||||||
|
@ -447,7 +464,7 @@ void cUIDsys::GetTitleIDs(std::vector<u64>& _TitleIDs)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool cUIDsys::CheckValidTitle(u64 _TitleID)
|
bool cUIDsys::CheckTitleTMD(u64 _TitleID)
|
||||||
{
|
{
|
||||||
char TitlePath[1024];
|
char TitlePath[1024];
|
||||||
sprintf(TitlePath, "%stitle/%08x/%08x/content/title.tmd", File::GetUserPath(D_WIIUSER_IDX),
|
sprintf(TitlePath, "%stitle/%08x/%08x/content/title.tmd", File::GetUserPath(D_WIIUSER_IDX),
|
||||||
|
@ -466,6 +483,30 @@ bool cUIDsys::CheckValidTitle(u64 _TitleID)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
INFO_LOG(DISCIO, "Invalid or no tmd for title %08x %08x", (u32)(_TitleID >> 32), (u32)(_TitleID & 0xFFFFFFFF));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool cUIDsys::CheckTitleTIK(u64 _TitleID)
|
||||||
|
{
|
||||||
|
char TitlePath[1024];
|
||||||
|
sprintf(TitlePath, "%sticket/%08x/%08x.tik", File::GetUserPath(D_WIIUSER_IDX),
|
||||||
|
(u32)(_TitleID >> 32), (u32)(_TitleID & 0xFFFFFFFF));
|
||||||
|
|
||||||
|
if (File::Exists(TitlePath))
|
||||||
|
{
|
||||||
|
FILE* pTIKFile = fopen(TitlePath, "rb");
|
||||||
|
if(pTIKFile)
|
||||||
|
{
|
||||||
|
u64 TitleID = 0xDEADBEEFDEADBEEFULL;
|
||||||
|
fseek(pTIKFile, 0x1dC, SEEK_SET);
|
||||||
|
fread(&TitleID, 8, 1, pTIKFile);
|
||||||
|
fclose(pTIKFile);
|
||||||
|
if (_TitleID == Common::swap64(TitleID))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
INFO_LOG(DISCIO, "Invalid or no tik for title %08x %08x", (u32)(_TitleID >> 32), (u32)(_TitleID & 0xFFFFFFFF));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -132,7 +132,8 @@ public:
|
||||||
|
|
||||||
u32 GetUIDFromTitle(u64 _Title);
|
u32 GetUIDFromTitle(u64 _Title);
|
||||||
bool AddTitle(u64 _Title);
|
bool AddTitle(u64 _Title);
|
||||||
bool CheckValidTitle(u64 _TitleID);
|
bool cUIDsys::CheckTitleTMD(u64 _TitleID);
|
||||||
|
bool cUIDsys::CheckTitleTIK(u64 _TitleID);
|
||||||
void GetTitleIDs(std::vector<u64>& _TitleIDs);
|
void GetTitleIDs(std::vector<u64>& _TitleIDs);
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
|
|
@ -1078,8 +1078,7 @@ void CGameListCtrl::OnInstallWAD(wxCommandEvent& WXUNUSED (event))
|
||||||
void CGameListCtrl::MultiCompressCB(const char* text, float percent, void* arg)
|
void CGameListCtrl::MultiCompressCB(const char* text, float percent, void* arg)
|
||||||
{
|
{
|
||||||
percent = (((float)m_currentItem) + percent) / (float)m_numberItem;
|
percent = (((float)m_currentItem) + percent) / (float)m_numberItem;
|
||||||
|
wxString textString(StringFromFormat("%s (%i/%i) - %s", m_currentFilename.c_str(), (int)m_currentItem+1, (int)m_numberItem, text).c_str(), *wxConvCurrent);
|
||||||
wxString textString(wxString::Format(wxT("%s (%i/%i) - %s"), m_currentFilename.c_str(), (int)m_currentItem+1, (int)m_numberItem, text));
|
|
||||||
|
|
||||||
((wxProgressDialog*)arg)->Update((int)(percent*1000), textString);
|
((wxProgressDialog*)arg)->Update((int)(percent*1000), textString);
|
||||||
}
|
}
|
||||||
|
@ -1141,7 +1140,14 @@ void CGameListCtrl::CompressSelection(bool _compress)
|
||||||
std::string FileName;
|
std::string FileName;
|
||||||
SplitPath(iso->GetFileName(), NULL, &FileName, NULL);
|
SplitPath(iso->GetFileName(), NULL, &FileName, NULL);
|
||||||
m_currentFilename = FileName;
|
m_currentFilename = FileName;
|
||||||
FileName.append(".gcm");
|
if (iso->GetPlatform() == GameListItem::WII_DISC)
|
||||||
|
{
|
||||||
|
FileName.append(".iso");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
FileName.append(".gcm");
|
||||||
|
}
|
||||||
|
|
||||||
std::string OutputFileName;
|
std::string OutputFileName;
|
||||||
BuildCompleteFilename(OutputFileName, (const char *)browseDialog.GetPath().mb_str(wxConvUTF8), FileName);
|
BuildCompleteFilename(OutputFileName, (const char *)browseDialog.GetPath().mb_str(wxConvUTF8), FileName);
|
||||||
|
@ -1164,19 +1170,28 @@ void CGameListCtrl::OnCompressGCM(wxCommandEvent& WXUNUSED (event))
|
||||||
if (!iso)
|
if (!iso)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
wxString path;
|
wxString path, Ext;
|
||||||
|
|
||||||
std::string FileName;
|
std::string FileName;
|
||||||
SplitPath(iso->GetFileName(), NULL, &FileName, NULL);
|
SplitPath(iso->GetFileName(), NULL, &FileName, NULL);
|
||||||
|
|
||||||
if (iso->IsCompressed())
|
if (iso->IsCompressed())
|
||||||
{
|
{
|
||||||
|
if (iso->GetPlatform() == GameListItem::WII_DISC)
|
||||||
|
{
|
||||||
|
Ext = wxT("*.iso");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Ext = wxT("*.gcm");
|
||||||
|
}
|
||||||
path = wxFileSelector(
|
path = wxFileSelector(
|
||||||
_T("Save decompressed ISO"),
|
_T("Save decompressed ISO"),
|
||||||
wxEmptyString, wxString(FileName.c_str(), *wxConvCurrent), wxEmptyString,
|
wxEmptyString, wxString(FileName.c_str(), *wxConvCurrent), wxEmptyString,
|
||||||
wxString::Format
|
wxString::Format
|
||||||
(
|
(
|
||||||
_T("All GC/Wii ISO files (gcm)|*.gcm|All files (%s)|%s"),
|
_T("All GC/Wii ISO files (%s)|%s|All files (%s)|%s"),
|
||||||
|
Ext.After('.'), Ext,
|
||||||
wxFileSelectorDefaultWildcardStr,
|
wxFileSelectorDefaultWildcardStr,
|
||||||
wxFileSelectorDefaultWildcardStr
|
wxFileSelectorDefaultWildcardStr
|
||||||
),
|
),
|
||||||
|
|
Loading…
Reference in New Issue