void extractPKG(const std::string &pkgFile, const std::string &outDir) { std::ifstream pkg(pkgFile); if (!pkg.is_open()) { std::cerr << "Cannot open pkg archive " << pkgFile << ": " << strerror(errno) << std::endl; return; } PKGItem *root = loadPKG(pkg); if (!root) { std::cerr << "Cannot load pkg archive " << pkgFile << ": " << strerror(errno) << std::endl; return; } extract(root, pkg, outDir); }
int pkg2rpkg(const std::string& inputFile, const std::string& outputFile, Rangers::RPKGCompression compression) { ifstream pkgfile(inputFile.c_str(), ios::binary | ios::in); std::map<RPKGEntry*, PKGItem*> itemMap; PKGItem *root = loadPKG(pkgfile); if (root->childCount != 1) { std::cout << "Incorrect input file" << endl; return -1; } countFiles(L"", root, itemMap); //FIXME: OH SHI~ std::vector<RPKGEntry> files; std::vector<PKGItem> pkgfiles; for (std::map<RPKGEntry*, PKGItem*>::iterator i = itemMap.begin(); i != itemMap.end(); i++) { files.push_back(*(i->first)); pkgfiles.push_back(*(i->second)); } int c = itemMap.size(); uint32_t headerSize = calculateRPKGHeaderSize(files); ofstream outfile(outputFile.c_str(), ios::binary | ios::out); //FIXME: Better way to fill file for (int i = 0; i < headerSize + 8; i++) outfile.put(0); for (int i = 0; i < files.size(); i++) { wcout << files[i].name << endl; unsigned char *data = extractFile(pkgfiles[i], pkgfile); appendRPKGFile(outfile, files[i], (const char*)data, pkgfiles[i].size, compression); delete data; } outfile.seekp(0, ios_base::beg); writeRPKGHeader(outfile, files); cleanup(root); delete root; outfile.close(); pkgfile.close(); }