patch by Daco for extracting directory contents from a gcm (which also allows dumping an entire partion other than 0 from a wii disc)

plus a small fix for File::GetSize log

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4258 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
LPFaint99 2009-09-13 09:03:38 +00:00
parent 512053fa5e
commit be702ce750
5 changed files with 66 additions and 12 deletions

View File

@ -332,7 +332,7 @@ u64 GetSize(const char *filename)
// on windows it's actually _stat64 defined in commonFuncs // on windows it's actually _stat64 defined in commonFuncs
struct stat64 buf; struct stat64 buf;
if (stat64(filename, &buf) == 0) { if (stat64(filename, &buf) == 0) {
DEBUG_LOG(COMMON, "GetSize: %s: %d", filename, buf.st_size); DEBUG_LOG(COMMON, "GetSize: %s: %ld", filename, buf.st_size);
return buf.st_size; return buf.st_size;
} }

View File

@ -115,18 +115,44 @@ bool CFileSystemGCWii::ExportFile(const char* _rFullPath, const char* _rExportFi
delete[] buffer; delete[] buffer;
return false; return false;
} }
bool CFileSystemGCWii::ExportDir(const char* _rFullPath, const char* _rExportFolder) const
bool CFileSystemGCWii::ExportAllFiles(const char* _rFullPath) const
{ {
std::vector<const SFileInfo *> fst; std::vector<const SFileInfo *> fst;
char exportName[512];
GetFileList(fst); GetFileList(fst);
char exportName[512];
for (u64 i = 1; i < fst.size(); i++) //look for the dir we are going to extract
u32 index[2];
if (!_rFullPath)
{
//extract all
index[0] = 0;
index[1] = fst.size();
}
else
{
for(index[0] = 0; index[0] < fst.size();index[0]++)
{
// Note By DacoTaco : i wonder why it doesn't work with just the _rFullPath
if (fst.at(index[0])->m_FullPath == FindFileInfo(_rFullPath)->m_FullPath )
{
DEBUG_LOG(DISCIO,"Found the Dir at %u",index[0]);
break;
}
}
//now to get the index of last file
index[1] = index[0];
while(index[1] < fst.at(index[0])->m_FileSize)
{
index[1]++;
}
DEBUG_LOG(DISCIO,"Dir found from %u to %u\nextracting to:\n%s",index[0],index[1],_rExportFolder);
}
//extraction
for (int i = index[0]; i < index[1];i++)
{ {
if (fst[i]->IsDirectory()) if (fst[i]->IsDirectory())
{ {
sprintf(exportName, "%s/%s/", _rFullPath, fst[i]->m_FullPath); sprintf(exportName, "%s/%s/", _rExportFolder, fst[i]->m_FullPath);
DEBUG_LOG(DISCIO, "%s", exportName); DEBUG_LOG(DISCIO, "%s", exportName);
if (!File::Exists(exportName)) if (!File::Exists(exportName))
@ -151,7 +177,7 @@ bool CFileSystemGCWii::ExportAllFiles(const char* _rFullPath) const
} }
else else
{ {
sprintf(exportName, "%s/%s", _rFullPath, fst[i]->m_FullPath); sprintf(exportName, "%s/%s", _rExportFolder, fst[i]->m_FullPath);
DEBUG_LOG(DISCIO, "%s", exportName); DEBUG_LOG(DISCIO, "%s", exportName);
if (!File::Exists(exportName)) if (!File::Exists(exportName))
{ {

View File

@ -35,7 +35,7 @@ public:
virtual const char* GetFileName(u64 _Address) const; virtual const char* GetFileName(u64 _Address) const;
virtual u64 ReadFile(const char* _rFullPath, u8* _pBuffer, size_t _MaxBufferSize) const; virtual u64 ReadFile(const char* _rFullPath, u8* _pBuffer, size_t _MaxBufferSize) const;
virtual bool ExportFile(const char* _rFullPath, const char* _rExportFilename) const; virtual bool ExportFile(const char* _rFullPath, const char* _rExportFilename) const;
virtual bool ExportAllFiles(const char* _rFullPath) const; virtual bool ExportDir(const char* _rFullPath, const char* _rExportFilename) const;
private: private:

View File

@ -54,7 +54,7 @@ public:
virtual u64 GetFileSize(const char* _rFullPath) const = 0; virtual u64 GetFileSize(const char* _rFullPath) const = 0;
virtual u64 ReadFile(const char* _rFullPath, u8* _pBuffer, size_t _MaxBufferSize) const = 0; virtual u64 ReadFile(const char* _rFullPath, u8* _pBuffer, size_t _MaxBufferSize) const = 0;
virtual bool ExportFile(const char* _rFullPath, const char* _rExportFilename) const = 0; virtual bool ExportFile(const char* _rFullPath, const char* _rExportFilename) const = 0;
virtual bool ExportAllFiles(const char* _rFullPath) const = 0; virtual bool ExportDir(const char* _rFullPath, const char* _rExportFilename) const = 0;
virtual const char* GetFileName(u64 _Address) const = 0; virtual const char* GetFileName(u64 _Address) const = 0;
virtual const IVolume *GetVolume() const { return m_rVolume; } virtual const IVolume *GetVolume() const { return m_rVolume; }

View File

@ -563,7 +563,7 @@ void CISOProperties::OnRightClickOnTree(wxTreeEvent& event)
wxMenu popupMenu; wxMenu popupMenu;
if (m_Treectrl->ItemHasChildren(m_Treectrl->GetSelection())) if (m_Treectrl->ItemHasChildren(m_Treectrl->GetSelection()))
;//popupMenu.Append(IDM_EXTRACTDIR, _("Extract Directory...")); popupMenu.Append(IDM_EXTRACTDIR, _("Extract Directory...!experimental!"));
else else
popupMenu.Append(IDM_EXTRACTFILE, _("Extract File...")); popupMenu.Append(IDM_EXTRACTFILE, _("Extract File..."));
@ -617,6 +617,34 @@ void CISOProperties::OnExtractFile(wxCommandEvent& WXUNUSED (event))
void CISOProperties::OnExtractDir(wxCommandEvent& WXUNUSED (event)) void CISOProperties::OnExtractDir(wxCommandEvent& WXUNUSED (event))
{ {
if(!AskYesNo("%s", "Warning! this process does not yet have a progress bar.\nDolphin might appear unresponsive(depends on how big the folder is) until the extraction is complete\nContinue?"))
return;
wxString Path;
wxString Directory;
Directory = m_Treectrl->GetItemText(m_Treectrl->GetSelection());
Path = wxDirSelector(wxT("Choose the folder where to extract to"));
if (!Path || !Directory)
return;
while (m_Treectrl->GetItemParent(m_Treectrl->GetSelection()) != m_Treectrl->GetRootItem())
{
wxString temp;
temp = m_Treectrl->GetItemText(m_Treectrl->GetItemParent(m_Treectrl->GetSelection()));
Directory = temp + wxT(DIR_SEP_CHR) + Directory;
m_Treectrl->SelectItem(m_Treectrl->GetItemParent(m_Treectrl->GetSelection()));
}
if (DiscIO::IsVolumeWiiDisc(OpenISO))
{
int partitionNum = wxAtoi(Directory.SubString(10, 11));
Directory.Remove(0, 12); // Remove "Partition x/"
WiiDisc.at(partitionNum).FileSystem->ExportDir(Directory.mb_str(), Path.mb_str());
}
else
pFileSystem->ExportDir(Directory.mb_str(), Path.mb_str());
} }
void CISOProperties::OnExtractAll(wxCommandEvent& WXUNUSED (event)) void CISOProperties::OnExtractAll(wxCommandEvent& WXUNUSED (event))
@ -631,7 +659,7 @@ void CISOProperties::OnExtractAll(wxCommandEvent& WXUNUSED (event))
if (dialog.ShowModal() == wxID_OK) if (dialog.ShowModal() == wxID_OK)
{ {
std::string sPath(dialog.GetPath().mb_str()); std::string sPath(dialog.GetPath().mb_str());
pFileSystem->ExportAllFiles(sPath.c_str()); pFileSystem->ExportDir(NULL,sPath.c_str());
} }
} }