nod/lib/DiscBase.cpp

47 lines
1.1 KiB
C++
Raw Normal View History

2015-06-26 20:01:15 +00:00
#include "DiscBase.hpp"
namespace NOD
{
2015-06-28 05:43:53 +00:00
DiscBase::DiscBase(std::unique_ptr<IDiscIO>&& dio)
: m_discIO(std::move(dio)), m_header(*m_discIO.get())
{
}
2015-06-30 00:07:46 +00:00
void DiscBase::IPartition::parseFST(IPartReadStream& s)
2015-06-29 05:35:25 +00:00
{
2015-06-30 00:07:46 +00:00
std::unique_ptr<uint8_t[]> fst(new uint8_t[m_fstSz]);
s.seek(m_fstOff);
s.read(fst.get(), m_fstSz);
const FSTNode* nodes = (FSTNode*)fst.get();
/* Root node indicates the count of all contained nodes */
uint32_t nodeCount = nodes[0].getLength();
const char* names = (char*)fst.get() + 12 * nodeCount;
m_nodes.clear();
m_nodes.reserve(nodeCount);
/* Construct nodes */
for (uint32_t n=0 ; n<nodeCount ; ++n)
{
const FSTNode& node = nodes[n];
m_nodes.emplace_back(*this, node, n ? names + node.getNameOffset() : "<root>");
}
/* Setup dir-child iterators */
for (std::vector<Node>::iterator it=m_nodes.begin();
it != m_nodes.end();
++it)
{
Node& node = *it;
if (node.m_kind == Node::NODE_DIRECTORY)
{
node.m_childrenBegin = it + 1;
node.m_childrenEnd = m_nodes.begin() + node.m_discLength;
}
}
2015-06-29 05:35:25 +00:00
}
2015-06-26 20:01:15 +00:00
}