rpcsx/rpcs3/Loader/TRP.cpp

131 lines
2 KiB
C++
Raw Normal View History

#include "stdafx.h"
#include "Emu/System.h"
2014-08-26 01:55:37 +02:00
#include "Emu/FS/VFS.h"
#include "Emu/FS/vfsFile.h"
#include "TRP.h"
TRPLoader::TRPLoader(vfsStream& f) : trp_f(f)
{
}
TRPLoader::~TRPLoader()
{
Close();
}
bool TRPLoader::Install(std::string dest, bool show)
{
if (!trp_f.IsOpened())
2015-07-26 10:14:56 +02:00
{
return false;
2015-07-26 10:14:56 +02:00
}
if (!dest.empty() && dest.back() != '/')
2015-07-26 10:14:56 +02:00
{
dest += '/';
2015-07-26 10:14:56 +02:00
}
2015-07-15 15:21:41 +02:00
if (!Emu.GetVFS().ExistsDir(dest))
{
Emu.GetVFS().CreateDir(dest);
}
for (const TRPEntry& entry : m_entries)
{
char* buffer = new char [(u32)entry.size];
trp_f.Seek(entry.offset);
trp_f.Read(buffer, entry.size);
vfsFile(dest + entry.name, fom::rewrite).Write(buffer, entry.size);
delete[] buffer;
}
return true;
}
bool TRPLoader::LoadHeader(bool show)
{
2015-07-26 10:14:56 +02:00
if (!trp_f.IsOpened())
{
return false;
2015-07-26 10:14:56 +02:00
}
trp_f.Seek(0);
2015-07-26 10:14:56 +02:00
if (trp_f.Read(&m_header, sizeof(TRPHeader)) != sizeof(TRPHeader))
2015-07-26 10:14:56 +02:00
{
return false;
2015-07-26 10:14:56 +02:00
}
if (m_header.trp_magic != 0xDCA24D00)
2015-07-26 10:14:56 +02:00
{
return false;
2015-07-26 10:14:56 +02:00
}
if (show)
2015-07-26 10:14:56 +02:00
{
2014-09-29 17:38:04 +02:00
LOG_NOTICE(LOADER, "TRP version: 0x%x", m_header.trp_version);
2015-07-26 10:14:56 +02:00
}
m_entries.clear();
m_entries.resize(m_header.trp_files_count);
2015-07-26 10:14:56 +02:00
for (u32 i = 0; i < m_header.trp_files_count; i++)
{
if (trp_f.Read(&m_entries[i], sizeof(TRPEntry)) != sizeof(TRPEntry))
2015-07-26 10:14:56 +02:00
{
return false;
2015-07-26 10:14:56 +02:00
}
if (show)
2015-07-26 10:14:56 +02:00
{
LOG_NOTICE(LOADER, "TRP entry #%d: %s", m_entries[i].name);
2015-07-26 10:14:56 +02:00
}
}
return true;
}
bool TRPLoader::ContainsEntry(const char *filename)
{
2015-07-26 10:14:56 +02:00
for (const TRPEntry& entry : m_entries)
{
if (!strcmp(entry.name, filename))
2015-07-26 10:14:56 +02:00
{
return true;
2015-07-26 10:14:56 +02:00
}
}
return false;
}
void TRPLoader::RemoveEntry(const char *filename)
{
std::vector<TRPEntry>::iterator i = m_entries.begin();
2015-07-26 10:14:56 +02:00
while (i != m_entries.end())
{
if (!strcmp(i->name, filename))
2015-07-26 10:14:56 +02:00
{
i = m_entries.erase(i);
2015-07-26 10:14:56 +02:00
}
else
2015-07-26 10:14:56 +02:00
{
i++;
2015-07-26 10:14:56 +02:00
}
}
}
void TRPLoader::RenameEntry(const char *oldname, const char *newname)
{
2015-07-26 10:14:56 +02:00
for (const TRPEntry& entry : m_entries)
{
if (!strcmp(entry.name, oldname))
2015-07-26 10:14:56 +02:00
{
memcpy((void*)entry.name, newname, 32);
2015-07-26 10:14:56 +02:00
}
}
}
2016-01-06 00:52:48 +01:00
void TRPLoader::Close()
{
2016-01-06 00:52:48 +01:00
trp_f.Close();
}