properly open/close the file to avoid rapid open/close cycles
ES_OPENCONTENT and ES_CLOSECONTENT now call Open and Close respectively, as the old code did.
This commit is contained in:
parent
8a6d9e1e0b
commit
a449ef4e11
|
@ -220,7 +220,7 @@ u32 CWII_IPC_HLE_Device_es::OpenTitleContent(u32 CFD, u64 TitleID, u16 Index)
|
||||||
Access.m_Size = pContent->m_Size;
|
Access.m_Size = pContent->m_Size;
|
||||||
Access.m_TitleID = TitleID;
|
Access.m_TitleID = TitleID;
|
||||||
|
|
||||||
|
pContent->m_Data->Open();
|
||||||
|
|
||||||
m_ContentAccessMap[CFD] = Access;
|
m_ContentAccessMap[CFD] = Access;
|
||||||
return CFD;
|
return CFD;
|
||||||
|
@ -425,6 +425,14 @@ IPCCommandResult CWII_IPC_HLE_Device_es::IOCtlV(u32 _CommandAddress)
|
||||||
return GetDefaultReply();
|
return GetDefaultReply();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const DiscIO::CNANDContentLoader& ContentLoader = AccessContentDevice(itr->second.m_TitleID);
|
||||||
|
// ContentLoader should never be invalid; we shouldn't be here if ES_OPENCONTENT failed before.
|
||||||
|
if (ContentLoader.IsValid())
|
||||||
|
{
|
||||||
|
const DiscIO::SNANDContent* pContent = ContentLoader.GetContentByIndex(itr->second.m_Index);
|
||||||
|
pContent->m_Data->Close();
|
||||||
|
}
|
||||||
|
|
||||||
m_ContentAccessMap.erase(itr);
|
m_ContentAccessMap.erase(itr);
|
||||||
|
|
||||||
Memory::Write_U32(0, _CommandAddress + 0x4);
|
Memory::Write_U32(0, _CommandAddress + 0x4);
|
||||||
|
|
|
@ -91,34 +91,49 @@ std::string CSharedContent::AddSharedContent(const u8* hash)
|
||||||
return filename;
|
return filename;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CNANDContentDataFile::EnsureOpen()
|
||||||
|
{
|
||||||
|
if (!m_file)
|
||||||
|
m_file = std::make_unique<File::IOFile>(m_filename, "rb");
|
||||||
|
else if (!m_file->IsOpen())
|
||||||
|
m_file->Open(m_filename, "rb");
|
||||||
|
}
|
||||||
|
void CNANDContentDataFile::Open()
|
||||||
|
{
|
||||||
|
EnsureOpen();
|
||||||
|
}
|
||||||
const std::vector<u8> CNANDContentDataFile::Get()
|
const std::vector<u8> CNANDContentDataFile::Get()
|
||||||
{
|
{
|
||||||
std::vector<u8> result;
|
std::vector<u8> result;
|
||||||
File::IOFile file(m_filename, "rb");
|
EnsureOpen();
|
||||||
if (!file.IsGood())
|
if (!m_file->IsGood())
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
u64 size = file.GetSize();
|
u64 size = m_file->GetSize();
|
||||||
if (size == 0)
|
if (size == 0)
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
result.resize(size);
|
result.resize(size);
|
||||||
file.ReadBytes(result.data(), result.size());
|
m_file->ReadBytes(result.data(), result.size());
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CNANDContentDataFile::GetRange(u32 start, u32 size, u8* buffer)
|
bool CNANDContentDataFile::GetRange(u32 start, u32 size, u8* buffer)
|
||||||
{
|
{
|
||||||
File::IOFile file(m_filename, "rb");
|
EnsureOpen();
|
||||||
if (!file.IsGood())
|
if (!m_file->IsGood())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!file.Seek(start, SEEK_SET))
|
if (!m_file->Seek(start, SEEK_SET))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return file.ReadBytes(buffer, static_cast<size_t>(size));
|
return m_file->ReadBytes(buffer, static_cast<size_t>(size));
|
||||||
|
}
|
||||||
|
void CNANDContentDataFile::Close()
|
||||||
|
{
|
||||||
|
if (m_file && m_file->IsOpen())
|
||||||
|
m_file->Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -20,8 +20,10 @@ bool AddTicket(u64 title_id, const std::vector<u8>& ticket);
|
||||||
class CNANDContentData
|
class CNANDContentData
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
virtual void Open() { };
|
||||||
virtual const std::vector<u8> Get() = 0;
|
virtual const std::vector<u8> Get() = 0;
|
||||||
virtual bool GetRange(u32 start, u32 size, u8* buffer) = 0;
|
virtual bool GetRange(u32 start, u32 size, u8* buffer) = 0;
|
||||||
|
virtual void Close() { };
|
||||||
};
|
};
|
||||||
|
|
||||||
class CNANDContentDataFile final : public CNANDContentData
|
class CNANDContentDataFile final : public CNANDContentData
|
||||||
|
@ -29,10 +31,15 @@ class CNANDContentDataFile final : public CNANDContentData
|
||||||
public:
|
public:
|
||||||
CNANDContentDataFile(const std::string& filename) : m_filename(filename) { };
|
CNANDContentDataFile(const std::string& filename) : m_filename(filename) { };
|
||||||
|
|
||||||
|
void Open() override;
|
||||||
const std::vector<u8> Get() override;
|
const std::vector<u8> Get() override;
|
||||||
bool GetRange(u32 start, u32 size, u8* buffer) override;
|
bool GetRange(u32 start, u32 size, u8* buffer) override;
|
||||||
|
void Close() override;
|
||||||
private:
|
private:
|
||||||
|
void EnsureOpen();
|
||||||
|
|
||||||
const std::string m_filename;
|
const std::string m_filename;
|
||||||
|
std::unique_ptr<File::IOFile> m_file;
|
||||||
};
|
};
|
||||||
class CNANDContentDataBuffer final : public CNANDContentData
|
class CNANDContentDataBuffer final : public CNANDContentData
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue