From 454ba7ce66ff451428b992abc0954c7ee6ee3699 Mon Sep 17 00:00:00 2001 From: Ben Carter Date: Thu, 27 Feb 2025 00:51:47 -0500 Subject: [PATCH] fix: improve file addition to MPQ archives --- examples/add-files.js | 7 +++++- examples/test.mpq | Bin 16444 -> 16559 bytes lib/index.js | 44 ++----------------------------------- mpqcli/src/main.cpp | 7 +++--- mpqcli/src/mpq_handler.cpp | 5 +++-- mpqcli/src/mpq_handler.hpp | 2 +- 6 files changed, 16 insertions(+), 49 deletions(-) diff --git a/examples/add-files.js b/examples/add-files.js index b741597..364e3ee 100644 --- a/examples/add-files.js +++ b/examples/add-files.js @@ -17,10 +17,15 @@ fs.writeFileSync(path.join(customPath, 'test2.txt'), 'Another test file'); // Create an MPQ from our directory const outputMpq = path.join(__dirname, 'test.mpq'); -console.log('Creating new MPQ archive from directory...'); +console.log('Creating new MPQ archive...'); const mpqPath = mpq.createArchive(testDir, 2, outputMpq); console.log(`Created MPQ at: ${mpqPath}`); +// Add files to the archive +console.log('\nAdding files to archive...'); +mpq.addFile(mpqPath, path.join(customPath, 'test1.txt'), 'custom/path/test1.txt'); +mpq.addFile(mpqPath, path.join(customPath, 'test2.txt'), 'custom/path/test2.txt'); + // List files in the archive to verify console.log('\nFiles in the archive:'); const files = mpq.listFiles(mpqPath); diff --git a/examples/test.mpq b/examples/test.mpq index 1ca0e8ba134fb6d4e6c96936c28425ff78b878d8..c2f9ddd0e67852559af3f7c0413447af41e00f7c 100644 GIT binary patch delta 15253 zcmV;GJ8HzdfB~<80e?+UQ5q}&006H*000310|0*j004hL00004000930000000000 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ⅈ`V|xCDMFRdz%W82{2}^-LJl(^l@1jE7+^_PA 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 delta 15137 zcmV++JKn^vfdRaL0W3{WQ5q}&002Bd000310{|=l001mN00004000310000000000 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 [file_path]" << std::endl; + std::cout << "Usage: mpqcli [file_path] [target_path]" << std::endl; std::cout << "Commands:" << std::endl; std::cout << " list - List contents of MPQ file" << std::endl; std::cout << " extract - Extract file from MPQ" << std::endl; - std::cout << " add - Add file to MPQ" << std::endl; + std::cout << " add - Add file to MPQ (optional target_path)" << std::endl; std::cout << " create - Create new MPQ archive (v1 or v2)" << std::endl; return 1; } @@ -24,7 +24,8 @@ int main(int argc, char* argv[]) { handler.extractFile(argv[3]); } else if (command == "add" && argc > 3) { - handler.addFile(argv[3]); + std::string targetPath = argc > 4 ? argv[4] : ""; + handler.addFile(argv[3], targetPath); } else if (command == "create") { int version = (argc > 3 && std::string(argv[3]) == "-v2") ? 2 : 1; diff --git a/mpqcli/src/mpq_handler.cpp b/mpqcli/src/mpq_handler.cpp index 4dbe2ff..8774d0f 100644 --- a/mpqcli/src/mpq_handler.cpp +++ b/mpqcli/src/mpq_handler.cpp @@ -63,14 +63,15 @@ void MPQHandler::extractFile(const std::string& filePath) { SFileCloseArchive(hMpq); } -void MPQHandler::addFile(const std::string& filePath) { +void MPQHandler::addFile(const std::string& filePath, const std::string& targetPath) { HANDLE hMpq = NULL; if (!SFileOpenArchive(mpqPath.c_str(), 0, 0, &hMpq)) { std::cerr << "Failed to open MPQ file" << std::endl; return; } - if (!SFileAddFileEx(hMpq, filePath.c_str(), filePath.c_str(), + const char* archivePath = targetPath.empty() ? filePath.c_str() : targetPath.c_str(); + if (!SFileAddFileEx(hMpq, filePath.c_str(), archivePath, MPQ_FILE_COMPRESS | MPQ_FILE_REPLACEEXISTING, MPQ_COMPRESSION_ZLIB, MPQ_COMPRESSION_NEXT_SAME)) { std::cerr << "Failed to add file to MPQ" << std::endl; diff --git a/mpqcli/src/mpq_handler.hpp b/mpqcli/src/mpq_handler.hpp index e7e7177..0b695ed 100644 --- a/mpqcli/src/mpq_handler.hpp +++ b/mpqcli/src/mpq_handler.hpp @@ -8,7 +8,7 @@ public: void listFiles(); void extractFile(const std::string& filePath); - void addFile(const std::string& filePath); + void addFile(const std::string& filePath, const std::string& targetPath = ""); void createArchive(const std::string& path, int version); private: