Add completion percentage to ExtractionContext's callback

This commit is contained in:
Phillip Stephens 2017-05-21 03:26:22 -07:00
parent 2bc7c4e568
commit e494dbba9f
4 changed files with 11 additions and 7 deletions

View File

@ -39,8 +39,8 @@ int main(int argc, char* argv[])
logvisor::RegisterStandardExceptions();
logvisor::RegisterConsoleLogger();
nod::ExtractionContext ctx = { true, true, [&](const std::string& str){
fprintf(stderr, "%s\n", str.c_str());
nod::ExtractionContext ctx = { true, true, [&](const std::string& str, float c){
fprintf(stderr, "Current node: %s, Extraction %g%% Complete\n", str.c_str(), c);
}};
const nod::SystemChar* inDir = nullptr;
const nod::SystemChar* outDir = _S(".");

View File

@ -236,6 +236,7 @@ public:
Kind m_kind;
uint64_t m_offset;
public:
mutable size_t m_curNodeIdx = 0;
IPartition(const DiscBase& parent, Kind kind, uint64_t offset)
: m_parent(parent), m_kind(kind), m_offset(offset) {}
virtual uint64_t normalizeOffset(uint64_t anOffset) const {return anOffset;}

View File

@ -15,7 +15,7 @@ struct ExtractionContext final
{
bool verbose : 1;
bool force : 1;
std::function<void(const std::string&)> progressCB;
std::function<void(const std::string&, float)> progressCB;
};
std::unique_ptr<DiscBase> OpenDiscFromImage(const SystemChar* path);

View File

@ -97,8 +97,9 @@ bool DiscBase::IPartition::Node::extractToDirectory(const SystemString& basePath
if (m_kind == Kind::Directory)
{
++m_parent.m_curNodeIdx;
if (ctx.verbose && ctx.progressCB && !getName().empty())
ctx.progressCB(getName());
ctx.progressCB(getName(), float(m_parent.m_curNodeIdx * 100.f) / m_parent.getNodeCount());
if (Mkdir(path.c_str(), 0755) && errno != EEXIST)
{
LogModule.report(logvisor::Error, _S("unable to mkdir '%s'"), path.c_str());
@ -111,8 +112,9 @@ bool DiscBase::IPartition::Node::extractToDirectory(const SystemString& basePath
else if (m_kind == Kind::File)
{
Sstat theStat;
++m_parent.m_curNodeIdx;
if (ctx.verbose && ctx.progressCB)
ctx.progressCB(getName());
ctx.progressCB(getName(), float(m_parent.m_curNodeIdx * 100.f) / m_parent.getNodeCount());
if (ctx.force || Stat(path.c_str(), &theStat))
{
@ -129,6 +131,7 @@ bool DiscBase::IPartition::Node::extractToDirectory(const SystemString& basePath
bool DiscBase::IPartition::extractToDirectory(const SystemString& path,
const ExtractionContext& ctx)
{
m_curNodeIdx = 0;
Sstat theStat;
if (Mkdir(path.c_str(), 0755) && errno != EEXIST)
{
@ -141,7 +144,7 @@ bool DiscBase::IPartition::extractToDirectory(const SystemString& path,
if (ctx.force || Stat(apploaderPath.c_str(), &theStat))
{
if (ctx.verbose && ctx.progressCB)
ctx.progressCB("apploader.bin");
ctx.progressCB("apploader.bin", 0.f);
std::unique_ptr<uint8_t[]> buf = getApploaderBuf();
auto ws = NewFileIO(apploaderPath)->beginWriteStream();
if (!ws)
@ -154,7 +157,7 @@ bool DiscBase::IPartition::extractToDirectory(const SystemString& path,
if (ctx.force || Stat(dolPath.c_str(), &theStat))
{
if (ctx.verbose && ctx.progressCB)
ctx.progressCB("boot.dol");
ctx.progressCB("boot.dol", 0.f);
std::unique_ptr<uint8_t[]> buf = getDOLBuf();
auto ws = NewFileIO(dolPath)->beginWriteStream();
if (!ws)