The-NodeBox-Generator/src/util/SimpleFileCombiner.cpp

116 lines
3.3 KiB
C++

#include "SimpleFileCombiner.hpp"
#include <iostream>
#include <fstream>
#include <sstream>
std::vector<char> ReadAllBytes(char const* filename)
{
std::ifstream ifs(filename, std::ios::binary|std::ios::ate);
if (!ifs) {
std::cerr << "Error! Unable to open file '" << filename << "' in SimpleFileCombiner/ReadAllBytes" << std::endl;
return std::vector<char>(0);
}
std::ifstream::pos_type pos = ifs.tellg();
std::vector<char> result(pos);
ifs.seekg(0, std::ios::beg);
ifs.read(&result[0], pos);
return result;
}
bool SimpleFileCombiner::write(std::string filename) {
std::ofstream output(filename.c_str(), std::ios::binary|std::ios::out);
if (!output) {
errcode = EERR_IO;
return false;
}
output.write("NBEFP", 5);
output << (char)files.size();
unsigned int start = files.size() * sizeofdef + 6;
for (std::list<SimpleFileCombiner::File>::const_iterator it = files.begin();
it != files.end();
++it) {
SimpleFileCombiner::File file = *it;
std::string name = file.name;
unsigned int size = file.bytes.size();
std::cerr << "(SFC) Writing " << name.c_str() << ": " << start << " (" << size << ")" << std::endl;
while (name.size() < 50) {
name += " ";
}
output << name.c_str();
output.write(static_cast<char*>(static_cast<void*>(&start)), sizeof(unsigned int));
output.write(static_cast<char*>(static_cast<void*>(&size)), sizeof(unsigned int));
start += size;
}
for (std::list<SimpleFileCombiner::File>::const_iterator it = files.begin();
it != files.end();
++it) {
SimpleFileCombiner::File file = *it;
output.write(&file.bytes[0], file.bytes.size());
}
output.close();
return true;
}
bool SimpleFileCombiner::add(const char* readfrom, std::string file)
{
files.push_back(File(file, ReadAllBytes(readfrom)));
return true;
}
std::list<std::string> SimpleFileCombiner::read(const char* file, std::string dir)
{
// Start reading
std::ifstream ifs(file, std::ios::binary|std::ios::ate);
if (!ifs) {
errcode = EERR_IO;
return std::list<std::string>();
}
std::string start(5, '\0');
ifs.seekg(0, std::ios::beg);
ifs.read(static_cast<char*>(static_cast<void*>(&start[0])), 5);
if (start != "NBEFP") {
errcode = EERR_WRONG_FILE;
return std::list<std::string>();
}
// Read header
char amount = 0;
ifs.seekg(5, std::ios::beg);
ifs.read(&amount, 1);
std::list<std::string> result;
// Loop through files
for (int f = 0; f < (int)amount; f++) {
std::string name(50, '\0');
ifs.seekg(f * sizeofdef + 6, std::ios::beg);
ifs.read(static_cast<char*>(static_cast<void*>(&name[0])), 50);
name = trim(name);
result.push_back(name);
// Get start location
unsigned int start = 0;
ifs.seekg(f * sizeofdef + 56, std::ios::beg);
ifs.read(static_cast<char*>(static_cast<void*>(&start)), sizeof(unsigned int));
// Get size
unsigned int size = 0;
ifs.seekg(f * sizeofdef + 60, std::ios::beg);
ifs.read(static_cast<char*>(static_cast<void*>(&size)), sizeof(unsigned int));
std::cerr << "(SFC) Reading " << name.c_str() << ": " << start << " (" << size << ")" << std::endl;
// Read and save data
std::string data(size, '\0');
ifs.seekg(start, std::ios::beg);
ifs.read(static_cast<char*>(static_cast<void*>(&data[0])), size);
std::ofstream output((dir + "/" + name).c_str(), std::ios::binary|std::ios::out);
output.write(static_cast<char*>(static_cast<void*>(&data[0])), size);
output.close();
}
return result;
}