mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-01-30 21:32:50 +00:00
merging vfs changes because I need to fix wxstring reads
This commit is contained in:
commit
b9abb1e075
@ -65,11 +65,11 @@ void PPUThread::InitRegs()
|
|||||||
SetPc(pc);
|
SetPc(pc);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
const s32 thread_num = Emu.GetCPU().GetThread NumById(GetType(), GetId());
|
const s32 thread_num = Emu.GetCPU().GetThreadNumById(GetType(), GetId());
|
||||||
|
|
||||||
if(thread_num < 0)
|
if(thread_num < 0)
|
||||||
{
|
{
|
||||||
ConLog.Error("GetThread NumById failed.");
|
ConLog.Error("GetThreadNumById failed.");
|
||||||
Emu.Pause();
|
Emu.Pause();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -27,15 +27,20 @@ bool vfsDirBase::IsOpened() const
|
|||||||
return !m_cwd.IsEmpty();
|
return !m_cwd.IsEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
const Array<DirEntryInfo>& vfsDirBase::GetEntryes() const
|
bool vfsDirBase::IsExists(const wxString& path) const
|
||||||
{
|
{
|
||||||
return m_entryes;
|
return wxDirExists(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
const Array<DirEntryInfo>& vfsDirBase::GetEntries() const
|
||||||
|
{
|
||||||
|
return m_entries;
|
||||||
}
|
}
|
||||||
|
|
||||||
void vfsDirBase::Close()
|
void vfsDirBase::Close()
|
||||||
{
|
{
|
||||||
m_cwd = wxEmptyString;
|
m_cwd = wxEmptyString;
|
||||||
m_entryes.Clear();
|
m_entries.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
wxString vfsDirBase::GetPath() const
|
wxString vfsDirBase::GetPath() const
|
||||||
|
@ -31,7 +31,7 @@ class vfsDirBase
|
|||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
wxString m_cwd;
|
wxString m_cwd;
|
||||||
Array<DirEntryInfo> m_entryes;
|
Array<DirEntryInfo> m_entries;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
vfsDirBase(const wxString& path);
|
vfsDirBase(const wxString& path);
|
||||||
@ -39,13 +39,13 @@ public:
|
|||||||
|
|
||||||
virtual bool Open(const wxString& path);
|
virtual bool Open(const wxString& path);
|
||||||
virtual bool IsOpened() const;
|
virtual bool IsOpened() const;
|
||||||
virtual const Array<DirEntryInfo>& GetEntryes() const;
|
virtual bool IsExists(const wxString& path) const;
|
||||||
|
virtual const Array<DirEntryInfo>& GetEntries() const;
|
||||||
virtual void Close();
|
virtual void Close();
|
||||||
virtual wxString GetPath() const;
|
virtual wxString GetPath() const;
|
||||||
|
|
||||||
virtual bool Create(const wxString& path)=0;
|
virtual bool Create(const wxString& path)=0;
|
||||||
//virtual bool Create(const DirEntryInfo& info)=0;
|
//virtual bool Create(const DirEntryInfo& info)=0;
|
||||||
virtual bool IsExists(const wxString& path) const=0;
|
|
||||||
virtual bool Rename(const wxString& from, const wxString& to)=0;
|
virtual bool Rename(const wxString& from, const wxString& to)=0;
|
||||||
virtual bool Remove(const wxString& path)=0;
|
virtual bool Remove(const wxString& path)=0;
|
||||||
};
|
};
|
@ -2,7 +2,9 @@
|
|||||||
#include "vfsLocalDir.h"
|
#include "vfsLocalDir.h"
|
||||||
#include <direct.h>
|
#include <direct.h>
|
||||||
|
|
||||||
vfsLocalDir::vfsLocalDir(const wxString& path) : vfsDirBase(path)
|
vfsLocalDir::vfsLocalDir(const wxString& path)
|
||||||
|
: vfsDirBase(path)
|
||||||
|
, m_pos(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -25,7 +27,7 @@ bool vfsLocalDir::Open(const wxString& path)
|
|||||||
{
|
{
|
||||||
wxString dir_path = path + wxFILE_SEP_PATH + name;
|
wxString dir_path = path + wxFILE_SEP_PATH + name;
|
||||||
|
|
||||||
DirEntryInfo& info = m_entryes[m_entryes.Move(new DirEntryInfo())];
|
DirEntryInfo& info = m_entries[m_entries.Move(new DirEntryInfo())];
|
||||||
info.name = name;
|
info.name = name;
|
||||||
|
|
||||||
info.flags |= wxDirExists(dir_path) ? DirEntry_TypeDir : DirEntry_TypeFile;
|
info.flags |= wxDirExists(dir_path) ? DirEntry_TypeDir : DirEntry_TypeFile;
|
||||||
@ -37,16 +39,19 @@ bool vfsLocalDir::Open(const wxString& path)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const DirEntryInfo* vfsLocalDir::Read()
|
||||||
|
{
|
||||||
|
if (m_pos >= m_entries.GetCount())
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return &m_entries[m_pos++];
|
||||||
|
}
|
||||||
|
|
||||||
bool vfsLocalDir::Create(const wxString& path)
|
bool vfsLocalDir::Create(const wxString& path)
|
||||||
{
|
{
|
||||||
return wxFileName::Mkdir(path, 0777, wxPATH_MKDIR_FULL);
|
return wxFileName::Mkdir(path, 0777, wxPATH_MKDIR_FULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool vfsLocalDir::IsExists(const wxString& path) const
|
|
||||||
{
|
|
||||||
return wxDirExists(path);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool vfsLocalDir::Rename(const wxString& from, const wxString& to)
|
bool vfsLocalDir::Rename(const wxString& from, const wxString& to)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
|
@ -3,14 +3,17 @@
|
|||||||
|
|
||||||
class vfsLocalDir : public vfsDirBase
|
class vfsLocalDir : public vfsDirBase
|
||||||
{
|
{
|
||||||
|
private:
|
||||||
|
u32 m_pos;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
vfsLocalDir(const wxString& path = wxEmptyString);
|
vfsLocalDir(const wxString& path = wxEmptyString);
|
||||||
virtual ~vfsLocalDir();
|
virtual ~vfsLocalDir();
|
||||||
|
|
||||||
virtual bool Open(const wxString& path) override;
|
virtual bool Open(const wxString& path) override;
|
||||||
|
const DirEntryInfo* Read();
|
||||||
|
|
||||||
virtual bool Create(const wxString& path) override;
|
virtual bool Create(const wxString& path) override;
|
||||||
virtual bool IsExists(const wxString& path) const override;
|
|
||||||
virtual bool Rename(const wxString& from, const wxString& to) override;
|
virtual bool Rename(const wxString& from, const wxString& to) override;
|
||||||
virtual bool Remove(const wxString& path) override;
|
virtual bool Remove(const wxString& path) override;
|
||||||
};
|
};
|
@ -228,7 +228,7 @@ extern int cellFsRead(u32 fd, u32 buf_addr, u64 nbytes, mem64_t nread);
|
|||||||
extern int cellFsWrite(u32 fd, u32 buf_addr, u64 nbytes, mem64_t nwrite);
|
extern int cellFsWrite(u32 fd, u32 buf_addr, u64 nbytes, mem64_t nwrite);
|
||||||
extern int cellFsClose(u32 fd);
|
extern int cellFsClose(u32 fd);
|
||||||
extern int cellFsOpendir(u32 path_addr, mem32_t fd);
|
extern int cellFsOpendir(u32 path_addr, mem32_t fd);
|
||||||
extern int cellFsReaddir(u32 fd, u32 dir_addr, mem64_t nread);
|
extern int cellFsReaddir(u32 fd, mem_ptr_t<CellFsDirent> dir, mem64_t nread);
|
||||||
extern int cellFsClosedir(u32 fd);
|
extern int cellFsClosedir(u32 fd);
|
||||||
extern int cellFsStat(u32 path_addr, mem_ptr_t<CellFsStat> sb);
|
extern int cellFsStat(u32 path_addr, mem_ptr_t<CellFsStat> sb);
|
||||||
extern int cellFsFstat(u32 fd, mem_ptr_t<CellFsStat> sb);
|
extern int cellFsFstat(u32 fd, mem_ptr_t<CellFsStat> sb);
|
||||||
|
@ -132,21 +132,54 @@ int cellFsClose(u32 fd)
|
|||||||
int cellFsOpendir(u32 path_addr, mem32_t fd)
|
int cellFsOpendir(u32 path_addr, mem32_t fd)
|
||||||
{
|
{
|
||||||
const wxString& path = Memory.ReadString(path_addr);
|
const wxString& path = Memory.ReadString(path_addr);
|
||||||
sys_fs.Error("cellFsOpendir(path_addr: 0x%x(%s), fd_addr: 0x%x)", path_addr, path.mb_str(), fd.GetAddr());
|
sys_fs.Warning("cellFsOpendir(path=\"%s\", fd_addr=0x%x)", path.mb_str(), fd.GetAddr());
|
||||||
if(!Memory.IsGoodAddr(path_addr) || !fd.IsGood()) return CELL_EFAULT;
|
|
||||||
|
|
||||||
|
if(!Memory.IsGoodAddr(path_addr) || !fd.IsGood())
|
||||||
|
return CELL_EFAULT;
|
||||||
|
|
||||||
|
wxString localPath;
|
||||||
|
Emu.GetVFS().GetDevice(path, localPath);
|
||||||
|
vfsLocalDir* dir = new vfsLocalDir(localPath);
|
||||||
|
if(!dir->Open(localPath))
|
||||||
|
return CELL_ENOENT;
|
||||||
|
|
||||||
|
fd = sys_fs.GetNewId(dir);
|
||||||
return CELL_OK;
|
return CELL_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int cellFsReaddir(u32 fd, u32 dir_addr, mem64_t nread)
|
int cellFsReaddir(u32 fd, mem_ptr_t<CellFsDirent> dir, mem64_t nread)
|
||||||
{
|
{
|
||||||
sys_fs.Error("cellFsReaddir(fd: %d, dir_addr: 0x%x, nread_addr: 0x%x)", fd, dir_addr, nread.GetAddr());
|
sys_fs.Log("cellFsReaddir(fd=%d, dir_addr=0x%x, nread_addr=0x%x)", fd, dir.GetAddr(), nread.GetAddr());
|
||||||
|
|
||||||
|
vfsLocalDir* directory;
|
||||||
|
if(!sys_fs.CheckId(fd, directory))
|
||||||
|
return CELL_ESRCH;
|
||||||
|
if(!dir.IsGood() || !nread.IsGood())
|
||||||
|
return CELL_EFAULT;
|
||||||
|
|
||||||
|
const DirEntryInfo* info = directory->Read();
|
||||||
|
if(info)
|
||||||
|
{
|
||||||
|
nread = 1;
|
||||||
|
Memory.WriteString(dir.GetAddr()+2, info->name.mb_str());
|
||||||
|
dir->d_namlen = info->name.Length();
|
||||||
|
dir->d_type = (info->flags & 0x1) ? CELL_FS_TYPE_REGULAR : CELL_FS_TYPE_DIRECTORY;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nread = 0;
|
||||||
|
}
|
||||||
|
|
||||||
return CELL_OK;
|
return CELL_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int cellFsClosedir(u32 fd)
|
int cellFsClosedir(u32 fd)
|
||||||
{
|
{
|
||||||
sys_fs.Error("cellFsClosedir(fd: %d)", fd);
|
sys_fs.Log("cellFsClosedir(fd=%d)", fd);
|
||||||
|
|
||||||
|
if(!Emu.GetIdManager().RemoveID(fd))
|
||||||
|
return CELL_ESRCH;
|
||||||
|
|
||||||
return CELL_OK;
|
return CELL_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -231,11 +264,12 @@ int cellFsFstat(u32 fd, mem_ptr_t<CellFsStat> sb)
|
|||||||
int cellFsMkdir(u32 path_addr, u32 mode)
|
int cellFsMkdir(u32 path_addr, u32 mode)
|
||||||
{
|
{
|
||||||
const wxString& ps3_path = Memory.ReadString(path_addr);
|
const wxString& ps3_path = Memory.ReadString(path_addr);
|
||||||
wxString path;
|
sys_fs.Log("cellFsMkdir(path=\"%s\", mode=0x%x)", ps3_path.mb_str(), mode);
|
||||||
Emu.GetVFS().GetDevice(ps3_path, path);
|
|
||||||
sys_fs.Log("cellFsMkdir(path: %s, mode: 0x%x)", path.mb_str(), mode);
|
wxString localPath;
|
||||||
if(wxDirExists(path)) return CELL_EEXIST;
|
Emu.GetVFS().GetDevice(ps3_path, localPath);
|
||||||
if(!wxMkdir(path)) return CELL_EBUSY;
|
if(wxDirExists(localPath)) return CELL_EEXIST;
|
||||||
|
if(!wxMkdir(localPath)) return CELL_EBUSY;
|
||||||
return CELL_OK;
|
return CELL_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -248,7 +282,7 @@ int cellFsRename(u32 from_addr, u32 to_addr)
|
|||||||
Emu.GetVFS().GetDevice(ps3_from, from);
|
Emu.GetVFS().GetDevice(ps3_from, from);
|
||||||
Emu.GetVFS().GetDevice(ps3_to, to);
|
Emu.GetVFS().GetDevice(ps3_to, to);
|
||||||
|
|
||||||
sys_fs.Log("cellFsRename(from: %s, to: %s)", from.mb_str(), to.mb_str());
|
sys_fs.Log("cellFsRename(from=\"%s\", to=\"%s\")", ps3_from.mb_str(), ps3_to.mb_str());
|
||||||
if(!wxFileExists(from)) return CELL_ENOENT;
|
if(!wxFileExists(from)) return CELL_ENOENT;
|
||||||
if(wxFileExists(to)) return CELL_EEXIST;
|
if(wxFileExists(to)) return CELL_EEXIST;
|
||||||
if(!wxRenameFile(from, to)) return CELL_EBUSY; // (TODO: RenameFile(a,b) = CopyFile(a,b) + RemoveFile(a), therefore file "a" will not be removed if it is opened)
|
if(!wxRenameFile(from, to)) return CELL_EBUSY; // (TODO: RenameFile(a,b) = CopyFile(a,b) + RemoveFile(a), therefore file "a" will not be removed if it is opened)
|
||||||
@ -258,20 +292,23 @@ int cellFsRename(u32 from_addr, u32 to_addr)
|
|||||||
int cellFsRmdir(u32 path_addr)
|
int cellFsRmdir(u32 path_addr)
|
||||||
{
|
{
|
||||||
const wxString& ps3_path = Memory.ReadString(path_addr);
|
const wxString& ps3_path = Memory.ReadString(path_addr);
|
||||||
wxString path;
|
sys_fs.Log("cellFsRmdir(path=\"%s\")", ps3_path.mb_str());
|
||||||
Emu.GetVFS().GetDevice(ps3_path, path);
|
|
||||||
sys_fs.Log("cellFsRmdir(path: %s)", path.mb_str());
|
wxString localPath;
|
||||||
if(!wxDirExists(path)) return CELL_ENOENT;
|
Emu.GetVFS().GetDevice(ps3_path, localPath);
|
||||||
if(!wxRmdir(path)) return CELL_EBUSY; // (TODO: Under certain conditions it is not able to delete the folder)
|
if(!wxDirExists(localPath)) return CELL_ENOENT;
|
||||||
|
if(!wxRmdir(localPath)) return CELL_EBUSY; // (TODO: Under certain conditions it is not able to delete the folder)
|
||||||
return CELL_OK;
|
return CELL_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int cellFsUnlink(u32 path_addr)
|
int cellFsUnlink(u32 path_addr)
|
||||||
{
|
{
|
||||||
const wxString& ps3_path = Memory.ReadString(path_addr);
|
const wxString& ps3_path = Memory.ReadString(path_addr);
|
||||||
wxString path;
|
sys_fs.Warning("cellFsUnlink(path=\"%s\")", ps3_path.mb_str());
|
||||||
Emu.GetVFS().GetDevice(ps3_path, path);
|
|
||||||
sys_fs.Error("cellFsUnlink(path: %s)", path.mb_str());
|
wxString localPath;
|
||||||
|
Emu.GetVFS().GetDevice(ps3_path, localPath);
|
||||||
|
wxRemoveFile(localPath);
|
||||||
return CELL_OK;
|
return CELL_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,7 +12,6 @@
|
|||||||
|
|
||||||
#include <wx/wfstream.h>
|
#include <wx/wfstream.h>
|
||||||
#include <wx/dir.h>
|
#include <wx/dir.h>
|
||||||
//#include <wx/generic/progdlgg.h>
|
|
||||||
#include <wx/spinctrl.h>
|
#include <wx/spinctrl.h>
|
||||||
#include <wx/datetime.h>
|
#include <wx/datetime.h>
|
||||||
#include <wx/filepicker.h>
|
#include <wx/filepicker.h>
|
||||||
@ -207,7 +206,9 @@ enum Status
|
|||||||
#include "Emu/System.h"
|
#include "Emu/System.h"
|
||||||
#include "Emu/Cell/PPUThread.h"
|
#include "Emu/Cell/PPUThread.h"
|
||||||
|
|
||||||
|
#include "Emu/FS/vfsDirBase.h"
|
||||||
#include "Emu/FS/vfsFileBase.h"
|
#include "Emu/FS/vfsFileBase.h"
|
||||||
|
#include "Emu/FS/vfsLocalDir.h"
|
||||||
#include "Emu/FS/vfsLocalFile.h"
|
#include "Emu/FS/vfsLocalFile.h"
|
||||||
#include "Emu/FS/vfsFile.h"
|
#include "Emu/FS/vfsFile.h"
|
||||||
#include "Emu/FS/vfsStream.h"
|
#include "Emu/FS/vfsStream.h"
|
||||||
|
@ -1 +1 @@
|
|||||||
Subproject commit 00e8b466ce3a56735533dfd701d1d7ea7eaa2601
|
Subproject commit ff08d8205adf6793f3d02d4c1be4e8ea35944ee4
|
Loading…
x
Reference in New Issue
Block a user