diff --git a/Source/Core/DiscIO/Src/FileSystemGCWii.cpp b/Source/Core/DiscIO/Src/FileSystemGCWii.cpp index 439317d746..31efdb0ec4 100644 --- a/Source/Core/DiscIO/Src/FileSystemGCWii.cpp +++ b/Source/Core/DiscIO/Src/FileSystemGCWii.cpp @@ -159,8 +159,17 @@ void CFileSystemGCWii::GetStringFromOffset(u64 _Offset, char* Filename) const m_rVolume.Read(_Offset, 255, (u8*)Filename); } +size_t CFileSystemGCWii::GetFileList(std::vector *_rFilenames) +{ + (*_rFilenames).resize(m_FileInfoVector.size()); + for (size_t i = 0; i < m_FileInfoVector.size(); i++) + { + (*_rFilenames)[i] = m_FileInfoVector[i]; + } + return m_FileInfoVector.size(); +} -const CFileSystemGCWii::SFileInfo* +const SFileInfo* CFileSystemGCWii::FindFileInfo(const char* _rFullPath) const { for (size_t i = 0; i < m_FileInfoVector.size(); i++) diff --git a/Source/Core/DiscIO/Src/FileSystemGCWii.h b/Source/Core/DiscIO/Src/FileSystemGCWii.h index caadabe45d..0584c4e80f 100644 --- a/Source/Core/DiscIO/Src/FileSystemGCWii.h +++ b/Source/Core/DiscIO/Src/FileSystemGCWii.h @@ -48,17 +48,6 @@ class CFileSystemGCWii private: - // file info of an FST entry - struct SFileInfo - { - u32 m_NameOffset; - u64 m_Offset; - u32 m_FileSize; - char m_FullPath[512]; - - bool IsDirectory() {return((m_NameOffset& 0xFF000000) != 0 ? true : false);} - }; - typedef std::vectorCFileInfoVector; CFileInfoVector m_FileInfoVector; @@ -68,6 +57,8 @@ class CFileSystemGCWii u32 Read32(u64 _Offset) const; + virtual size_t GetFileList(std::vector *_rFilenames); + void GetStringFromOffset(u64 _Offset, char* Filename) const; const SFileInfo* FindFileInfo(const char* _rFullPath) const; diff --git a/Source/Core/DiscIO/Src/Filesystem.h b/Source/Core/DiscIO/Src/Filesystem.h index 98ac81cf0e..b2532a3206 100644 --- a/Source/Core/DiscIO/Src/Filesystem.h +++ b/Source/Core/DiscIO/Src/Filesystem.h @@ -33,7 +33,7 @@ class IFileSystem virtual bool IsInitialized() = 0; -// virtual size_t GetFileList(std::vector _rFilenames) = 0; + virtual size_t GetFileList(std::vector *_rFilenames) = 0; virtual size_t GetFileSize(const char* _rFullPath) = 0; diff --git a/Source/Core/DiscIO/Src/Volume.h b/Source/Core/DiscIO/Src/Volume.h index 6fb958d965..c6448dfbbb 100644 --- a/Source/Core/DiscIO/Src/Volume.h +++ b/Source/Core/DiscIO/Src/Volume.h @@ -19,9 +19,20 @@ #define _VOLUME_H #include +#include #include "Common.h" +// file info of an FST entry +struct SFileInfo +{ + u32 m_NameOffset; + u64 m_Offset; + u32 m_FileSize; + char m_FullPath[512]; + + bool IsDirectory() {return((m_NameOffset& 0xFF000000) != 0 ? true : false);} +}; namespace DiscIO { class IVolume diff --git a/Source/Core/DolphinWX/Src/FilesystemViewer.cpp b/Source/Core/DolphinWX/Src/FilesystemViewer.cpp index d0f1fda455..89770e85e7 100644 --- a/Source/Core/DolphinWX/Src/FilesystemViewer.cpp +++ b/Source/Core/DolphinWX/Src/FilesystemViewer.cpp @@ -17,8 +17,8 @@ #include "Globals.h" -//#include "VolumeCreator.h" -//#include "Filesystem.h" +#include "VolumeCreator.h" +#include "Filesystem.h" //#include "BannerLoader.h" #include "FilesystemViewer.h" @@ -33,18 +33,26 @@ BEGIN_EVENT_TABLE(CFilesystemViewer, wxDialog) EVT_MENU(IDM_REPLACEFILE, CFilesystemViewer::OnReplaceFile) EVT_MENU(IDM_RENAMEFILE, CFilesystemViewer::OnRenameFile) END_EVENT_TABLE() +DiscIO::IVolume* OpenIso = NULL; +DiscIO::IFileSystem* pFileSystem = NULL; CFilesystemViewer::CFilesystemViewer(const std::string fileName, wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& position, const wxSize& size, long style) : wxDialog(parent, id, title, position, size, style) { - /*DiscIO::IVolume* pVolume = DiscIO::CreateVolumeFromFilename(fileName); - DiscIO::IFileSystem* pFileSystem = DiscIO::CreateFileSystem(*pVolume); - pFileSystem->*/ + OpenIso = DiscIO::CreateVolumeFromFilename(fileName); + pFileSystem = DiscIO::CreateFileSystem(*OpenIso); + std::vector Our_Files; + pFileSystem->GetFileList(&Our_Files); CreateGUIControls(); + + for(int a = 0;a < Our_Files.size();++a) + m_Treectrl->AppendItem(RootId, wxString::FromAscii(Our_Files[a].m_FullPath));//printf("%d dir? %s '%s'\n", a, Our_Files[a].IsDirectory() ? "True" : "False", Our_Files[a].m_FullPath); } CFilesystemViewer::~CFilesystemViewer() { + delete pFileSystem; + delete OpenIso; } void CFilesystemViewer::CreateGUIControls() @@ -127,7 +135,7 @@ void CFilesystemViewer::CreateGUIControls() m_Treectrl = new wxTreeCtrl(this, ID_TREECTRL, wxDefaultPosition, wxSize(350, 450)/*wxDefaultSize*/, wxTR_DEFAULT_STYLE, wxDefaultValidator); sbTreectrl->Add(m_Treectrl, 1, wxEXPAND); - m_Treectrl->AddRoot(wxT("Root"), -1, -1, 0); + RootId = m_Treectrl->AddRoot(wxT("Root"), -1, -1, 0); ///////////// wxGridBagSizer* sMain; @@ -188,7 +196,23 @@ void CFilesystemViewer::OnBannerImageSave(wxCommandEvent& WXUNUSED (event)) void CFilesystemViewer::OnExtractFile(wxCommandEvent& WXUNUSED (event)) { - + wxString Path; + wxString File; + Path = wxFileSelector( + _T("Export File"), + wxEmptyString, wxEmptyString, wxEmptyString, + wxString::Format + ( + _T("All files (%s)|%s"), + wxFileSelectorDefaultWildcardStr + ), + wxFD_SAVE, + this); + + File = m_Treectrl->GetItemText(m_Treectrl->GetSelection()); + if (!Path || !File) + return; + pFileSystem->ExportFile(File.mb_str(), Path.mb_str()); } void CFilesystemViewer::OnReplaceFile(wxCommandEvent& WXUNUSED (event)) diff --git a/Source/Core/DolphinWX/Src/FilesystemViewer.h b/Source/Core/DolphinWX/Src/FilesystemViewer.h index 634d2cc624..040b76768e 100644 --- a/Source/Core/DolphinWX/Src/FilesystemViewer.h +++ b/Source/Core/DolphinWX/Src/FilesystemViewer.h @@ -76,6 +76,7 @@ class CFilesystemViewer : public wxDialog wxTextCtrl *m_Maker; wxTextCtrl *m_Comment; wxTextCtrl *m_Banner; + wxTreeItemId RootId; wxChoice *m_Lang; wxButton *m_SaveBNR; diff --git a/Source/Core/DolphinWX/Src/GameListCtrl.cpp b/Source/Core/DolphinWX/Src/GameListCtrl.cpp index c236c734e3..2715f3b4bc 100644 --- a/Source/Core/DolphinWX/Src/GameListCtrl.cpp +++ b/Source/Core/DolphinWX/Src/GameListCtrl.cpp @@ -472,7 +472,7 @@ void CGameListCtrl::OnRightClick(wxMouseEvent& event) popupMenu.Append(IDM_EDITPATCHFILE, wxString::FromAscii(menu_text.c_str())); //Pretty much everything in wxwidgets is a wxString, try to convert to those first! popupMenu.Append(IDM_OPENCONTAININGFOLDER, wxString::FromAscii("Open &containing folder")); popupMenu.Append(IDM_SETDEFAULTGCM, wxString::FromAscii("Set as &default ISO")); - //popupMenu.Append(IDM_FILESYSTEMVIEWER, wxString::FromAscii("Open in ISO viewer/dumper")); + popupMenu.Append(IDM_FILESYSTEMVIEWER, wxString::FromAscii("Open in ISO viewer/dumper")); // F|RES: compression doesn't work and will be rewritten ... if it is fixed the gui is ready :D if (selected_iso->IsCompressed())