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

116 lines
3.3 KiB
C++
Raw Permalink Normal View History

#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) {
2014-07-26 11:28:11 -07:00
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;
2015-02-02 10:40:35 -08:00
return false;
}
2014-07-22 08:42:38 -07:00
output.write("NBEFP", 5);
output << (char)files.size();
2014-07-22 08:42:38 -07:00
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;
2014-07-26 11:34:27 -07:00
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();
2015-02-02 10:40:35 -08:00
output.write(static_cast<char*>(static_cast<void*>(&start)), sizeof(unsigned int));
output.write(static_cast<char*>(static_cast<void*>(&size)), sizeof(unsigned int));
2014-07-26 11:27:02 -07:00
start += size;
2015-02-02 10:40:35 -08:00
}
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());
2015-02-02 10:40:35 -08:00
}
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);
2014-07-22 08:42:38 -07:00
if (!ifs) {
errcode = EERR_IO;
return std::list<std::string>();
2014-07-22 08:42:38 -07:00
}
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;
2014-07-22 08:42:38 -07:00
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++) {
2014-07-22 08:21:33 -07:00
std::string name(50, '\0');
2014-07-22 08:42:38 -07:00
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;
2014-07-22 09:43:35 -07:00
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;
2014-07-22 08:42:38 -07:00
ifs.seekg(f * sizeofdef + 60, std::ios::beg);
ifs.read(static_cast<char*>(static_cast<void*>(&size)), sizeof(unsigned int));
2014-07-26 11:28:11 -07:00
std::cerr << "(SFC) Reading " << name.c_str() << ": " << start << " (" << size << ")" << std::endl;
// Read and save data
2014-07-29 10:31:30 -07:00
std::string data(size, '\0');
ifs.seekg(start, std::ios::beg);
2014-07-29 10:31:30 -07:00
ifs.read(static_cast<char*>(static_cast<void*>(&data[0])), size);
std::ofstream output((dir + "/" + name).c_str(), std::ios::binary|std::ios::out);
2014-07-29 10:31:30 -07:00
output.write(static_cast<char*>(static_cast<void*>(&data[0])), size);
output.close();
}
return result;
}