示例#1
0
文件: pkg.cpp 项目: GoodRon/OpenSR
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);
}
示例#2
0
文件: pkg2rpkg.cpp 项目: 4auka/OpenSR
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();
}