2015-07-02 18:33:55 +00:00
|
|
|
#include "NOD/DiscGCN.hpp"
|
2015-06-28 05:43:53 +00:00
|
|
|
|
|
|
|
namespace NOD
|
|
|
|
{
|
|
|
|
|
2015-06-30 00:07:46 +00:00
|
|
|
class PartitionGCN : public DiscBase::IPartition
|
|
|
|
{
|
|
|
|
public:
|
2015-06-30 19:38:51 +00:00
|
|
|
PartitionGCN(const DiscGCN& parent, Kind kind, uint64_t offset)
|
2015-06-30 00:07:46 +00:00
|
|
|
: IPartition(parent, kind, offset)
|
|
|
|
{
|
|
|
|
/* GCN-specific header reads */
|
2015-06-30 06:46:19 +00:00
|
|
|
std::unique_ptr<IPartReadStream> s = beginReadStream(0x420);
|
2015-06-30 00:07:46 +00:00
|
|
|
uint32_t vals[3];
|
|
|
|
s->read(vals, 12);
|
|
|
|
m_dolOff = SBig(vals[0]);
|
|
|
|
m_fstOff = SBig(vals[1]);
|
|
|
|
m_fstSz = SBig(vals[2]);
|
2015-06-30 19:38:51 +00:00
|
|
|
s->seek(0x2440 + 0x14);
|
|
|
|
s->read(vals, 8);
|
|
|
|
m_apploaderSz = SBig(vals[0]) + SBig(vals[1]);
|
2015-06-30 00:07:46 +00:00
|
|
|
|
|
|
|
/* Yay files!! */
|
|
|
|
parseFST(*s.get());
|
|
|
|
}
|
|
|
|
|
2015-06-30 06:46:19 +00:00
|
|
|
class PartReadStream : public IPartReadStream
|
2015-06-30 00:07:46 +00:00
|
|
|
{
|
|
|
|
const PartitionGCN& m_parent;
|
|
|
|
std::unique_ptr<IDiscIO::IReadStream> m_dio;
|
|
|
|
|
|
|
|
public:
|
2015-06-30 19:38:51 +00:00
|
|
|
PartReadStream(const PartitionGCN& parent, uint64_t offset)
|
2015-06-30 00:07:46 +00:00
|
|
|
: m_parent(parent)
|
|
|
|
{m_dio = m_parent.m_parent.getDiscIO().beginReadStream(offset);}
|
2015-06-30 19:38:51 +00:00
|
|
|
void seek(int64_t offset, int whence)
|
2015-06-30 00:07:46 +00:00
|
|
|
{m_dio->seek(offset, whence);}
|
2015-06-30 19:38:51 +00:00
|
|
|
uint64_t read(void* buf, uint64_t length)
|
2015-06-30 00:07:46 +00:00
|
|
|
{return m_dio->read(buf, length);}
|
|
|
|
};
|
|
|
|
|
2015-06-30 19:38:51 +00:00
|
|
|
std::unique_ptr<IPartReadStream> beginReadStream(uint64_t offset) const
|
2015-06-30 00:07:46 +00:00
|
|
|
{
|
2015-06-30 06:46:19 +00:00
|
|
|
return std::unique_ptr<IPartReadStream>(new PartReadStream(*this, offset));
|
2015-06-30 00:07:46 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2015-06-28 05:43:53 +00:00
|
|
|
DiscGCN::DiscGCN(std::unique_ptr<IDiscIO>&& dio)
|
|
|
|
: DiscBase(std::move(dio))
|
|
|
|
{
|
2015-06-30 00:07:46 +00:00
|
|
|
/* One lone partition for GCN */
|
|
|
|
m_partitions.emplace_back(new PartitionGCN(*this, IPartition::PART_DATA, 0));
|
2015-06-28 05:43:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
bool DiscGCN::commit()
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|