diff --git a/build/visualstudio/nstool/nstool.vcxproj b/build/visualstudio/nstool/nstool.vcxproj index bd7757d..0b4e846 100644 --- a/build/visualstudio/nstool/nstool.vcxproj +++ b/build/visualstudio/nstool/nstool.vcxproj @@ -185,7 +185,9 @@ + + diff --git a/build/visualstudio/nstool/nstool.vcxproj.filters b/build/visualstudio/nstool/nstool.vcxproj.filters index a18c5e9..a6434e6 100644 --- a/build/visualstudio/nstool/nstool.vcxproj.filters +++ b/build/visualstudio/nstool/nstool.vcxproj.filters @@ -152,5 +152,11 @@ Source Files + + Source Files + + + Source Files + \ No newline at end of file diff --git a/src/not_ported/IniProcess.cpp b/src/IniProcess.cpp similarity index 76% rename from src/not_ported/IniProcess.cpp rename to src/IniProcess.cpp index d976309..86354f9 100644 --- a/src/not_ported/IniProcess.cpp +++ b/src/IniProcess.cpp @@ -10,6 +10,7 @@ nstool::IniProcess::IniProcess() : + mModuleName("nstool::IniProcess"), mFile(), mCliOutputMode(true, false, false, false), mVerify(false), @@ -27,7 +28,7 @@ void nstool::IniProcess::process() displayHeader(); displayKipList(); } - if (mDoExtractKip) + if (mKipExtractPath.isSet()) { extractKipList(); } @@ -48,29 +49,35 @@ void nstool::IniProcess::setVerifyMode(bool verify) mVerify = verify; } -void nstool::IniProcess::setKipExtractPath(const std::string& path) +void nstool::IniProcess::setKipExtractPath(const tc::io::Path& path) { - mDoExtractKip = true; mKipExtractPath = path; } void nstool::IniProcess::importHeader() { - tc::ByteData scratch; - - if (*mFile == nullptr) + if (mFile == nullptr) { - throw tc::Exception(kModuleName, "No file reader set."); + throw tc::Exception(mModuleName, "No file reader set."); + } + if (mFile->canRead() == false || mFile->canSeek() == false) + { + throw tc::NotSupportedException(mModuleName, "Input stream requires read/seek permissions."); } - if ((*mFile)->size() < sizeof(nn::hac::sIniHeader)) + // check if file_size is smaller than INI header size + size_t file_size = tc::io::IOUtil::castInt64ToSize(mFile->length()); + if (file_size < sizeof(nn::hac::sIniHeader)) { - throw tc::Exception(kModuleName, "Corrupt INI: file too small"); + throw tc::Exception(mModuleName, "Corrupt NSO: file too small."); } - scratch.alloc(sizeof(nn::hac::sIniHeader)); - (*mFile)->read(scratch.data(), 0, scratch.size()); + // read ini + tc::ByteData scratch = tc::ByteData(sizeof(nn::hac::sIniHeader)); + mFile->seek(0, tc::io::SeekOrigin::Begin); + mFile->read(scratch.data(), scratch.size()); + // parse ini header mHdr.fromBytes(scratch.data(), scratch.size()); } @@ -97,9 +104,9 @@ void nstool::IniProcess::importKipList() void nstool::IniProcess::displayHeader() { - std::cout << "[INI Header]" << std::endl; - std::cout << " Size: 0x" << std::hex << mHdr.getSize() << std::endl; - std::cout << " KIP Num: " << std::dec << (uint32_t)mHdr.getKipNum() << std::endl; + fmt::print("[INI Header]\n"); + fmt::print(" Size: 0x{:x}\n", mHdr.getSize()); + fmt::print(" KIP Num: {:d}\n", mHdr.getKipNum()); } void nstool::IniProcess::displayKipList() @@ -123,7 +130,7 @@ void nstool::IniProcess::extractKipList() // allocate cache memory - cache.alloc(kCacheSize); + cache = tc::ByteData(kCacheSize); // make extract dir fnd::io::makeDirectory(mKipExtractPath); diff --git a/src/IniProcess.h b/src/IniProcess.h index 59499ae..e5ee8a3 100644 --- a/src/IniProcess.h +++ b/src/IniProcess.h @@ -19,10 +19,11 @@ public: void setKipExtractPath(const tc::io::Path& path); private: - const std::string kModuleName = "IniProcess"; const std::string kKipExtention = ".kip"; const size_t kCacheSize = 0x10000; + std::string mModuleName; + std::shared_ptr mFile; CliOutputMode mCliOutputMode; bool mVerify; diff --git a/src/not_ported/KipProcess.cpp b/src/KipProcess.cpp similarity index 100% rename from src/not_ported/KipProcess.cpp rename to src/KipProcess.cpp