2014-02-15 01:06:12 +01:00
|
|
|
#include "stdafx.h"
|
2014-06-02 19:27:24 +02:00
|
|
|
#include "Emu/ConLog.h"
|
|
|
|
|
#include "Emu/Memory/Memory.h"
|
|
|
|
|
#include "Emu/System.h"
|
|
|
|
|
#include "Emu/FS/vfsFile.h"
|
2014-02-15 01:06:12 +01:00
|
|
|
#include "TRP.h"
|
|
|
|
|
|
|
|
|
|
TRPLoader::TRPLoader(vfsStream& f) : trp_f(f)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2014-03-17 20:34:19 +01:00
|
|
|
TRPLoader::~TRPLoader()
|
|
|
|
|
{
|
|
|
|
|
Close();
|
|
|
|
|
}
|
|
|
|
|
|
2014-02-15 01:06:12 +01:00
|
|
|
bool TRPLoader::Install(std::string dest, bool show)
|
|
|
|
|
{
|
2014-03-17 20:34:19 +01:00
|
|
|
if(!trp_f.IsOpened())
|
|
|
|
|
return false;
|
2014-02-16 02:51:04 +01:00
|
|
|
|
|
|
|
|
if (!dest.empty() && dest.back() != '/')
|
|
|
|
|
dest += '/';
|
|
|
|
|
|
2014-03-19 16:19:35 +01:00
|
|
|
Emu.GetVFS().CreateDir(dest);
|
2014-02-15 01:06:12 +01:00
|
|
|
for (const TRPEntry& entry : m_entries)
|
|
|
|
|
{
|
2014-04-25 18:57:00 +02:00
|
|
|
char* buffer = new char [(u32)entry.size];
|
2014-02-16 16:19:06 +01:00
|
|
|
Emu.GetVFS().CreateFile(dest+entry.name);
|
2014-02-15 01:06:12 +01:00
|
|
|
vfsFile file(dest+entry.name, vfsWrite);
|
|
|
|
|
trp_f.Seek(entry.offset);
|
|
|
|
|
trp_f.Read(buffer, entry.size);
|
|
|
|
|
file.Write(buffer, entry.size);
|
|
|
|
|
file.Close();
|
|
|
|
|
delete[] buffer;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool TRPLoader::LoadHeader(bool show)
|
|
|
|
|
{
|
2014-03-17 20:34:19 +01:00
|
|
|
if(!trp_f.IsOpened())
|
|
|
|
|
return false;
|
|
|
|
|
|
2014-02-15 01:06:12 +01:00
|
|
|
trp_f.Seek(0);
|
|
|
|
|
if (trp_f.Read(&m_header, sizeof(TRPHeader)) != sizeof(TRPHeader))
|
|
|
|
|
return false;
|
|
|
|
|
|
2014-02-16 02:51:04 +01:00
|
|
|
if (m_header.trp_magic != 0xDCA24D00)
|
2014-02-15 01:06:12 +01:00
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
if (show)
|
|
|
|
|
ConLog.Write("TRP version: %x", m_header.trp_version);
|
|
|
|
|
|
|
|
|
|
m_entries.clear();
|
|
|
|
|
m_entries.resize(m_header.trp_files_count);
|
|
|
|
|
|
|
|
|
|
for(u32 i=0; i<m_header.trp_files_count; i++)
|
|
|
|
|
{
|
|
|
|
|
if (trp_f.Read(&m_entries[i], sizeof(TRPEntry)) != sizeof(TRPEntry))
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
if (show)
|
2014-04-01 02:33:55 +02:00
|
|
|
ConLog.Write("TRP entry #%d: %s", m_entries[i].name);
|
2014-02-15 01:06:12 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
2014-03-17 20:34:19 +01:00
|
|
|
|
2014-04-28 05:41:51 +02:00
|
|
|
bool TRPLoader::ContainsEntry(const char *filename)
|
2014-03-17 20:34:19 +01:00
|
|
|
{
|
|
|
|
|
for (const TRPEntry& entry : m_entries) {
|
|
|
|
|
if (!strcmp(entry.name, filename))
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2014-04-28 05:41:51 +02:00
|
|
|
void TRPLoader::RemoveEntry(const char *filename)
|
2014-03-17 20:34:19 +01:00
|
|
|
{
|
|
|
|
|
std::vector<TRPEntry>::iterator i = m_entries.begin();
|
|
|
|
|
while (i != m_entries.end()) {
|
|
|
|
|
if (!strcmp(i->name, filename))
|
|
|
|
|
i = m_entries.erase(i);
|
|
|
|
|
else
|
|
|
|
|
i++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2014-04-28 05:41:51 +02:00
|
|
|
void TRPLoader::RenameEntry(const char *oldname, const char *newname)
|
2014-03-17 20:34:19 +01:00
|
|
|
{
|
|
|
|
|
for (const TRPEntry& entry : m_entries) {
|
|
|
|
|
if (!strcmp(entry.name, oldname))
|
|
|
|
|
memcpy((void*)entry.name, newname, 32);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool TRPLoader::Close()
|
|
|
|
|
{
|
|
|
|
|
return trp_f.Close();
|
|
|
|
|
}
|