From 43b302a0001626e80540c0ebe1318bb8a4b7370e Mon Sep 17 00:00:00 2001 From: daco65 Date: Sun, 2 Nov 2008 23:25:21 +0000 Subject: [PATCH] Start of Iso list caching. its off on default but can be changed in the options/ini also, the banners get saved as png's in the Gameini folder. they dont delete on their own you'll have to do that for now ;_; git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@1052 8ced0084-cf51-0410-be5f-012b33b47a6e --- Source/Core/Core/Src/CoreParameter.h | 1 + Source/Core/DolphinWX/Src/Config.cpp | 2 + Source/Core/DolphinWX/Src/ConfigMain.cpp | 7 + Source/Core/DolphinWX/Src/ConfigMain.h | 2 + Source/Core/DolphinWX/Src/Frame.cpp | 6 +- Source/Core/DolphinWX/Src/GameListCtrl.cpp | 254 ++++++++++++++++----- Source/Core/DolphinWX/Src/GameListCtrl.h | 4 +- Source/Core/DolphinWX/Src/ISOFile.cpp | 1 - Source/Core/DolphinWX/Src/ISOFile.h | 2 +- 9 files changed, 218 insertions(+), 61 deletions(-) diff --git a/Source/Core/Core/Src/CoreParameter.h b/Source/Core/Core/Src/CoreParameter.h index e3176968be..f91d679b87 100644 --- a/Source/Core/Core/Src/CoreParameter.h +++ b/Source/Core/Core/Src/CoreParameter.h @@ -53,6 +53,7 @@ struct SCoreStartupParameter bool bLockThreads; bool bOptimizeQuantizers; bool bEnableCheats; + bool bEnableIsoCache; bool bRunCompareServer; bool bRunCompareClient; diff --git a/Source/Core/DolphinWX/Src/Config.cpp b/Source/Core/DolphinWX/Src/Config.cpp index 8cd9a758c4..ffab967204 100644 --- a/Source/Core/DolphinWX/Src/Config.cpp +++ b/Source/Core/DolphinWX/Src/Config.cpp @@ -73,6 +73,7 @@ void SConfig::SaveSettings() ini.Set("Core", "DVDRoot", m_LocalCoreStartupParameter.m_strDVDRoot); ini.Set("Core", "OptimizeQuantizers", m_LocalCoreStartupParameter.bOptimizeQuantizers); ini.Set("Core", "EnableCheats", m_LocalCoreStartupParameter.bEnableCheats); + ini.Set("Core", "EnableIsoCache",m_LocalCoreStartupParameter.bEnableIsoCache); ini.Set("Core", "SelectedLanguage", m_LocalCoreStartupParameter.SelectedLanguage); ini.Set("Core", "RunCompareServer", m_LocalCoreStartupParameter.bRunCompareServer); ini.Set("Core", "RunCompareClient", m_LocalCoreStartupParameter.bRunCompareClient); @@ -130,6 +131,7 @@ void SConfig::LoadSettings() ini.Get("Core", "DVDRoot", &m_LocalCoreStartupParameter.m_strDVDRoot); ini.Get("Core", "OptimizeQuantizers", &m_LocalCoreStartupParameter.bOptimizeQuantizers, true); ini.Get("Core", "EnableCheats", &m_LocalCoreStartupParameter.bEnableCheats, false); + ini.Get("Core", "EnableIsoCache", &m_LocalCoreStartupParameter.bEnableIsoCache, false); ini.Get("Core", "SelectedLanguage", &m_LocalCoreStartupParameter.SelectedLanguage, 0); ini.Get("Core", "RunCompareServer", &m_LocalCoreStartupParameter.bRunCompareServer, false); ini.Get("Core", "RunCompareClient", &m_LocalCoreStartupParameter.bRunCompareClient, false); diff --git a/Source/Core/DolphinWX/Src/ConfigMain.cpp b/Source/Core/DolphinWX/Src/ConfigMain.cpp index 9c26f86f3c..05b5849595 100644 --- a/Source/Core/DolphinWX/Src/ConfigMain.cpp +++ b/Source/Core/DolphinWX/Src/ConfigMain.cpp @@ -36,6 +36,7 @@ EVT_CHECKBOX(ID_LOCKTHREADS, CConfigMain::CoreSettingsChanged) EVT_CHECKBOX(ID_OPTIMIZEQUANTIZERS, CConfigMain::CoreSettingsChanged) EVT_CHECKBOX(ID_IDLESKIP, CConfigMain::CoreSettingsChanged) EVT_CHECKBOX(ID_ENABLECHEATS, CConfigMain::CoreSettingsChanged) +EVT_CHECKBOX(ID_ENABLEISOCACHE, CConfigMain::CoreSettingsChanged) EVT_CHOICE(ID_GC_SRAM_LNG, CConfigMain::GCSettingsChanged) EVT_CHOICE(ID_WII_BT_BAR, CConfigMain::WiiSettingsChanged) EVT_CHECKBOX(ID_WII_IPL_SSV, CConfigMain::WiiSettingsChanged) @@ -127,6 +128,8 @@ void CConfigMain::CreateGUIControls() SkipIdle->SetValue(SConfig::GetInstance().m_LocalCoreStartupParameter.bSkipIdle); EnableCheats = new wxCheckBox(GeneralPage, ID_ENABLECHEATS, wxT("Enable cheats"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); EnableCheats->SetValue(SConfig::GetInstance().m_LocalCoreStartupParameter.bEnableCheats); + EnableIsoCache = new wxCheckBox(GeneralPage, ID_ENABLEISOCACHE, wxT("Enable Iso Caching"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); + EnableIsoCache->SetValue(SConfig::GetInstance().m_LocalCoreStartupParameter.bEnableIsoCache); sbAdvanced = new wxStaticBoxSizer(wxVERTICAL, GeneralPage, wxT("Advanced Settings")); AllwaysHLEBIOS = new wxCheckBox(GeneralPage, ID_ALLWAYS_HLEBIOS, wxT("HLE the BIOS all the time"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); @@ -142,6 +145,7 @@ void CConfigMain::CreateGUIControls() sbBasic->Add(UseDualCore, 0, wxALL, 5); sbBasic->Add(SkipIdle, 0, wxALL, 5); sbBasic->Add(EnableCheats, 0, wxALL, 5); + sbBasic->Add(EnableIsoCache, 0, wxALL,5); sGeneral->Add(sbBasic, 0, wxEXPAND|wxALL, 5); sGeneral->AddStretchSpacer(); @@ -367,6 +371,9 @@ void CConfigMain::CoreSettingsChanged(wxCommandEvent& event) case ID_ENABLECHEATS: SConfig::GetInstance().m_LocalCoreStartupParameter.bEnableCheats = EnableCheats->IsChecked(); break; + case ID_ENABLEISOCACHE: + SConfig::GetInstance().m_LocalCoreStartupParameter.bEnableIsoCache = EnableIsoCache->IsChecked(); + break; } } diff --git a/Source/Core/DolphinWX/Src/ConfigMain.h b/Source/Core/DolphinWX/Src/ConfigMain.h index 46c5831c24..ea461c4054 100644 --- a/Source/Core/DolphinWX/Src/ConfigMain.h +++ b/Source/Core/DolphinWX/Src/ConfigMain.h @@ -84,6 +84,7 @@ class CConfigMain wxCheckBox* OptimizeQuantizers; wxCheckBox* SkipIdle; wxCheckBox* EnableCheats; + wxCheckBox* EnableIsoCache; wxArrayString arrayStringFor_GCSystemLang; wxStaticText* GCSystemLangText; wxChoice* GCSystemLang; @@ -200,6 +201,7 @@ class CConfigMain ID_OPTIMIZEQUANTIZERS, ID_IDLESKIP, ID_ENABLECHEATS, + ID_ENABLEISOCACHE, ID_GC_SRAM_LNG_TEXT, ID_GC_SRAM_LNG, ID_WII_BT_BAR_TEXT, diff --git a/Source/Core/DolphinWX/Src/Frame.cpp b/Source/Core/DolphinWX/Src/Frame.cpp index db95d887f7..bf92a4fe53 100644 --- a/Source/Core/DolphinWX/Src/Frame.cpp +++ b/Source/Core/DolphinWX/Src/Frame.cpp @@ -169,7 +169,7 @@ CFrame::CFrame(wxFrame* parent, CPluginManager::GetInstance().ScanForPlugins(this); - m_GameListCtrl->Update(); + m_GameListCtrl->Update(SConfig::GetInstance().m_LocalCoreStartupParameter.bEnableIsoCache); //sizerPanel->SetSizeHints(m_Panel); @@ -447,7 +447,7 @@ void CFrame::OnRefresh(wxCommandEvent& WXUNUSED (event)) { if (m_GameListCtrl) { - m_GameListCtrl->Update(); + m_GameListCtrl->Update(false); } } @@ -457,7 +457,7 @@ void CFrame::OnConfigMain(wxCommandEvent& WXUNUSED (event)) CConfigMain ConfigMain(this); ConfigMain.ShowModal(); if (ConfigMain.bRefreshList) - m_GameListCtrl->Update(); + m_GameListCtrl->Update(true); } diff --git a/Source/Core/DolphinWX/Src/GameListCtrl.cpp b/Source/Core/DolphinWX/Src/GameListCtrl.cpp index dc15ab5655..bdd2211a50 100644 --- a/Source/Core/DolphinWX/Src/GameListCtrl.cpp +++ b/Source/Core/DolphinWX/Src/GameListCtrl.cpp @@ -18,6 +18,7 @@ #include "Globals.h" #include + #include #include "FileSearch.h" @@ -115,11 +116,11 @@ void CGameListCtrl::BrowseForDirectory() std::string(dialog.GetPath().ToAscii()) ); SConfig::GetInstance().SaveSettings(); - Update(); + Update(false); } } -void CGameListCtrl::Update() +void CGameListCtrl::Update(bool Loadcache) { if (m_imageListSmall) { @@ -129,7 +130,7 @@ void CGameListCtrl::Update() Hide(); - ScanForISOs(); + ScanForISOs(Loadcache); ClearAll(); @@ -331,61 +332,206 @@ void CGameListCtrl::SetBackgroundColor() } } -void CGameListCtrl::ScanForISOs() +void CGameListCtrl::ScanForISOs(bool Loadcache) { - m_ISOFiles.clear(); - - CFileSearch::XStringVector Directories(SConfig::GetInstance().m_ISOFolder); - - CFileSearch::XStringVector Extensions; - Extensions.push_back("*.iso"); - Extensions.push_back("*.gcm"); - Extensions.push_back("*.gcz"); - - CFileSearch FileSearch(Extensions, Directories); - const CFileSearch::XStringVector& rFilenames = FileSearch.GetFileNames(); - - if (rFilenames.size() > 0) + FILE * CacheFile; + bool ScanIso = true; + if (Loadcache) { - wxProgressDialog dialog(_T("Scanning for ISOs"), - _T("Scanning..."), - rFilenames.size(), // range - this, // parent - wxPD_APP_MODAL | - // wxPD_AUTO_HIDE | -- try this as well - wxPD_ELAPSED_TIME | - wxPD_ESTIMATED_TIME | - wxPD_REMAINING_TIME | - wxPD_SMOOTH // - makes indeterminate mode bar on WinXP very small - ); - - dialog.CenterOnParent(); - - for (u32 i = 0; i < rFilenames.size(); i++) + ScanIso = false; + if((CacheFile = fopen ("DolphinWx.cache","rb")) == NULL) { - std::string FileName; - SplitPath(rFilenames[i], NULL, &FileName, NULL); - - wxString msg; - char tempstring[128]; - sprintf(tempstring,"Scanning %s", FileName.c_str()); - msg = wxString::FromAscii(tempstring); - - bool Cont = dialog.Update(i, msg); - - if (!Cont) + ScanIso = true; + if((CacheFile = fopen ("DolphinWx.cache","wb")) == NULL) { + PanicAlert("Unable to make or open the dolphin iso cache: is the directory write protected?"); + } + } + } + else + { + if((CacheFile = fopen ("DolphinWx.cache","wb")) == NULL) + { + //Normally the file should be made when it opens it so if it can't open the file it's + //write protected or something is stoping us from writing + PanicAlert("Unable to make or open the dolphin iso cache: is the directory write protected?"); + } + } + m_ISOFiles.clear(); + if (!ScanIso) + { + //TODO: complete cache loading here. this means ADDING THE BANNER >_< + char Buffer[257]; + char temp[257]; + std::string Filename = " "; + GameListItem ISOFile(Filename.c_str()); + //looping every line of the file + while (fgets(Buffer,256,CacheFile) !=NULL) + { + strncpy(temp,"",257); + int i = 0; + switch(Buffer[0]) + { + /*! = file name + I = Game ID + N = Game Name + D = Description + C = Country + O = company + S = file size + V = Volume Size*/ + case '!': + while (i < 256) + { + if (Buffer[1+i] != '\n') + temp[i] = Buffer[1+i]; + i++; + } + Filename = temp; + ISOFile.m_FileName = Filename.c_str(); + break; + case 'I': + memcpy(temp,&Buffer[1],6); + ISOFile.m_UniqueID = temp; + break; + case 'N': + while (i < 257) + { + if (Buffer[1+i] != '\n') + temp[i] = Buffer[1+i]; + i++; + } + ISOFile.m_Name = temp; + break; + case 'D': + while (i < 257) + { + if (Buffer[1+i] != '\n') + temp[i] = Buffer[1+i]; + i++; + } + ISOFile.m_Description = temp; + break; + case 'O': + while (i < 257) + { + if (Buffer[1+i] != '\n') + temp[i] = Buffer[1+i]; + i++; + } + ISOFile.m_Company = temp; + break; + case 'C': + memcpy(temp,&Buffer[1],3); + ISOFile.m_Country = (DiscIO::IVolume::ECountry) atoi (temp); + break; + case 'S': + memcpy(temp,&Buffer[1],11); + ISOFile.m_FileSize = atoi (temp); + break; + case 'V': + memcpy(temp,&Buffer[1],11); + ISOFile.m_VolumeSize = atoi (temp); + break; + case 'B': + memcpy(temp,&Buffer[1],1); + if (temp[0] == '1') + ISOFile.m_BlobCompressed = true; + else if(temp[0] == '0') + ISOFile.m_BlobCompressed = false; + else + PanicAlert("unknown Compressed value %c",temp[1]); + break; + case '$': + if(ISOFile.GetFileName().c_str() != NULL) + { + //TODO: it would be good to check if the iso is valid but this would mean adding + //the banner cache and fixing the ISOFile declaration to have the right file name + //from the start (not " " but the Filename from the '!' case) + /*if (ISOFile.IsValid()) + { + //PanicAlert("pushing %s in stack...",ISOFile.GetFileName().c_str()); + m_ISOFiles.push_back(ISOFile); + } + else + PanicAlert("Invalid ISO file %s", ISOFile.GetFileName().c_str());*/ + //TODO: stick the banners in 1 file ;_; + ISOFile.m_Image.LoadFile("GameIni\\" + ISOFile.GetUniqueID() + ".png",wxBITMAP_TYPE_PNG); + m_ISOFiles.push_back(ISOFile); + } + break; + default: + PanicAlert("Unknown Cache line Found:\n%s",Buffer); break; } - - GameListItem ISOFile(rFilenames[i]); - - if (ISOFile.IsValid()) - m_ISOFiles.push_back(ISOFile); - else - PanicAlert("Invalid ISO file %s", rFilenames[i].c_str()); } } + else + { + CFileSearch::XStringVector Directories(SConfig::GetInstance().m_ISOFolder); + + CFileSearch::XStringVector Extensions; + Extensions.push_back("*.iso"); + Extensions.push_back("*.gcm"); + Extensions.push_back("*.gcz"); + + CFileSearch FileSearch(Extensions, Directories); + const CFileSearch::XStringVector& rFilenames = FileSearch.GetFileNames(); + + if (rFilenames.size() > 0) + { + wxProgressDialog dialog(_T("Scanning for ISOs"), + _T("Scanning..."), + rFilenames.size(), // range + this, // parent + wxPD_APP_MODAL | + // wxPD_AUTO_HIDE | -- try this as well + wxPD_ELAPSED_TIME | + wxPD_ESTIMATED_TIME | + wxPD_REMAINING_TIME | + wxPD_SMOOTH // - makes indeterminate mode bar on WinXP very small + ); + dialog.CenterOnParent(); + + for (u32 i = 0; i < rFilenames.size(); i++) + { + std::string FileName; + SplitPath(rFilenames[i], NULL, &FileName, NULL); + + wxString msg; + char tempstring[128]; + sprintf(tempstring,"Scanning %s", FileName.c_str()); + msg = wxString::FromAscii(tempstring); + + bool Cont = dialog.Update(i, msg); + + if (!Cont) + { + break; + } + GameListItem ISOFile(rFilenames[i]); + if (ISOFile.IsValid()) + { + if(CacheFile) + { + fseek( CacheFile, 0L, SEEK_END ); + fprintf(CacheFile,"!%s\nI%s\nN%s\nD%s\nC%u\nO%s\nS%u\n",ISOFile.GetFileName().c_str(), + ISOFile.GetUniqueID().c_str(), ISOFile.GetName().c_str(), ISOFile.GetDescription().c_str() + ,ISOFile.GetCountry(), ISOFile.GetCompany().c_str(), ISOFile.GetFileSize()); + //why a new fprintf? cause volume size got writen as 0 for some bloody odd reason + fprintf(CacheFile,"V%u\nB%u\n$\n", ISOFile.GetVolumeSize(),ISOFile.IsCompressed()); + ISOFile.m_Image.SaveFile("Gameini\\" + ISOFile.GetUniqueID() + ".png",wxBITMAP_TYPE_PNG);//".JPG",wxBITMAP_TYPE_JPEG); + //TODO: add the banner saving TO 1 FILE AND JPG as well & make the cache MUCH better. + //this is ugly as fuck + } + m_ISOFiles.push_back(ISOFile); + } + else + PanicAlert("Invalid ISO file %s", rFilenames[i].c_str()); + } + } + fclose (CacheFile); + } std::sort(m_ISOFiles.begin(), m_ISOFiles.end()); } @@ -577,7 +723,7 @@ void CGameListCtrl::OnDeleteGCM(wxCommandEvent& WXUNUSED (event)) wxMessageBoxCaptionStr, wxYES_NO|wxICON_EXCLAMATION) == wxYES) { File::Delete(iso->GetFileName().c_str()); - Update(); + Update(false); } } else @@ -592,7 +738,7 @@ void CGameListCtrl::OnDeleteGCM(wxCommandEvent& WXUNUSED (event)) const GameListItem *iso = GetSelectedISO(); File::Delete(iso->GetFileName().c_str()); } - Update(); + Update(false); } } } @@ -681,7 +827,7 @@ void CGameListCtrl::CompressSelection(bool _compress) } m_currentItem++; } - Update(); + Update(false); } void CGameListCtrl::CompressCB(const char* text, float percent, void* arg) @@ -760,7 +906,7 @@ void CGameListCtrl::OnCompressGCM(wxCommandEvent& WXUNUSED (event)) else DiscIO::CompressFileToBlob(iso->GetFileName().c_str(), path.char_str(), 0, 16384, &CompressCB, &dialog); - Update(); + Update(false); } void CGameListCtrl::OnEditPatchFile(wxCommandEvent& WXUNUSED (event)) diff --git a/Source/Core/DolphinWX/Src/GameListCtrl.h b/Source/Core/DolphinWX/Src/GameListCtrl.h index c496116a63..9e0d70e164 100644 --- a/Source/Core/DolphinWX/Src/GameListCtrl.h +++ b/Source/Core/DolphinWX/Src/GameListCtrl.h @@ -31,7 +31,7 @@ public: CGameListCtrl(wxWindow* parent, const wxWindowID id, const wxPoint& pos, const wxSize& size, long style); ~CGameListCtrl(); - void Update(); + void Update(bool Loadcache); void BrowseForDirectory(); const GameListItem *GetSelectedISO(); const GameListItem *GetISO(int index) const; @@ -59,7 +59,7 @@ private: void InitBitmaps(); void InsertItemInReportView(long _Index); void SetBackgroundColor(); - void ScanForISOs(); + void ScanForISOs(bool Loadcache); DECLARE_EVENT_TABLE() diff --git a/Source/Core/DolphinWX/Src/ISOFile.cpp b/Source/Core/DolphinWX/Src/ISOFile.cpp index 44a6028474..4b4ea4ca1a 100644 --- a/Source/Core/DolphinWX/Src/ISOFile.cpp +++ b/Source/Core/DolphinWX/Src/ISOFile.cpp @@ -90,7 +90,6 @@ GameListItem::GameListItem(const std::string& _rFileName) delete pFileSystem; } - delete pVolume; m_Valid = true; diff --git a/Source/Core/DolphinWX/Src/ISOFile.h b/Source/Core/DolphinWX/Src/ISOFile.h index c9acdf4f06..916b285730 100644 --- a/Source/Core/DolphinWX/Src/ISOFile.h +++ b/Source/Core/DolphinWX/Src/ISOFile.h @@ -36,11 +36,11 @@ public: bool IsCompressed() const {return m_BlobCompressed;} u64 GetFileSize() const {return m_FileSize;} u64 GetVolumeSize() const {return m_VolumeSize;} + #if !defined(OSX64) const wxImage& GetImage() const {return m_Image;} #endif -private: std::string m_FileName; std::string m_Name; std::string m_Company;