#include "stdafx.h" #include "VFS.h" #include "Emu/HDD/HDD.h" int sort_devices(const void* _a, const void* _b) { const vfsDevice& a = **(const vfsDevice**)_a; const vfsDevice& b = **(const vfsDevice**)_b; if(a.GetPs3Path().Len() > b.GetPs3Path().Len()) return 1; if(a.GetPs3Path().Len() < b.GetPs3Path().Len()) return -1; return 0; } void VFS::Mount(const wxString& ps3_path, const wxString& local_path, vfsDevice* device) { UnMount(ps3_path); device->SetPath(ps3_path, local_path); m_devices.Add(device); if(m_devices.GetCount() > 1) { std::qsort(m_devices.GetPtr(), m_devices.GetCount(), sizeof(vfsDevice*), sort_devices); } } void VFS::UnMount(const wxString& ps3_path) { for(u32 i=0; iGetNew(); stream->Open(path, mode); } return stream; } void VFS::Create(const wxString& ps3_path) { wxString path; if(vfsDevice* dev = GetDevice(ps3_path, path)) { dev->Create(path); } } void VFS::Close(vfsStream*& device) { delete device; device = nullptr; } vfsDevice* VFS::GetDevice(const wxString& ps3_path, wxString& path) { u32 max_eq; s32 max_i=-1; for(u32 i=0; i max_eq) { max_eq = eq; max_i = i; } } if(max_i < 0) return nullptr; path = vfsDevice::GetWinPath(m_devices[max_i].GetLocalPath(), ps3_path(max_eq, ps3_path.Len() - max_eq)); return &m_devices[max_i]; } vfsDevice* VFS::GetDeviceLocal(const wxString& local_path, wxString& path) { u32 max_eq; s32 max_i=-1; for(u32 i=0; i max_eq) { max_eq = eq; max_i = i; } } if(max_i < 0) return nullptr; path = vfsDevice::GetPs3Path(m_devices[max_i].GetPs3Path(), local_path(max_eq, local_path.Len() - max_eq)); return &m_devices[max_i]; } void VFS::Init(const wxString& path) { Array entries; SaveLoadDevices(entries, true); for(uint i=0; i& res, bool is_load) { IniEntry entries_count; entries_count.Init("count", "VFSManager"); int count = 0; if(is_load) { count = entries_count.LoadValue(count); if(!count) { int idx; idx = res.Move(new VFSManagerEntry()); res[idx].path = "$(EmulatorDir)\\dev_hdd0\\"; res[idx].mount = "/dev_hdd0/"; res[idx].device = vfsDevice_LocalFile; idx = res.Move(new VFSManagerEntry()); res[idx].path = "$(EmulatorDir)\\dev_hdd1\\"; res[idx].mount = "/dev_hdd1/"; res[idx].device = vfsDevice_LocalFile; idx = res.Move(new VFSManagerEntry()); res[idx].path = "$(EmulatorDir)\\dev_flash\\"; res[idx].mount = "/dev_flash/"; res[idx].device = vfsDevice_LocalFile; idx = res.Move(new VFSManagerEntry()); res[idx].path = "$(EmulatorDir)\\dev_usb000\\"; res[idx].mount = "/dev_usb000/"; res[idx].device = vfsDevice_LocalFile; idx = res.Move(new VFSManagerEntry()); res[idx].path = "$(EmulatorDir)\\dev_usb000\\"; res[idx].mount = "/dev_usb/"; res[idx].device = vfsDevice_LocalFile; idx = res.Move(new VFSManagerEntry()); res[idx].path = "$(GameDir)"; res[idx].mount = "/app_home/"; res[idx].device = vfsDevice_LocalFile; idx = res.Move(new VFSManagerEntry()); res[idx].path = "$(GameDir)\\..\\"; res[idx].mount = "/dev_bdvd/"; res[idx].device = vfsDevice_LocalFile; idx = res.Move(new VFSManagerEntry()); res[idx].path = ""; res[idx].mount = "/host_root/"; res[idx].device = vfsDevice_LocalFile; idx = res.Move(new VFSManagerEntry()); res[idx].path = "$(GameDir)"; res[idx].mount = "/"; res[idx].device = vfsDevice_LocalFile; return; } res.SetCount(count); } else { count = res.GetCount(); entries_count.SaveValue(res.GetCount()); } for(int i=0; i entry_path; IniEntry entry_device_path; IniEntry entry_mount; IniEntry entry_device; entry_path.Init(wxString::Format("path[%d]", i), "VFSManager"); entry_device_path.Init(wxString::Format("device_path[%d]", i), "VFSManager"); entry_mount.Init(wxString::Format("mount[%d]", i), "VFSManager"); entry_device.Init(wxString::Format("device[%d]", i), "VFSManager"); if(is_load) { new (res + i) VFSManagerEntry(); res[i].path = strdup(entry_path.LoadValue(wxEmptyString).c_str()); res[i].device_path = strdup(entry_device_path.LoadValue(wxEmptyString).c_str()); res[i].mount = strdup(entry_mount.LoadValue(wxEmptyString).c_str()); res[i].device = (vfsDeviceType)entry_device.LoadValue(vfsDevice_LocalFile); } else { entry_path.SaveValue(res[i].path); entry_device_path.SaveValue(res[i].device_path); entry_mount.SaveValue(res[i].mount); entry_device.SaveValue(res[i].device); } } }