61 lines
1.6 KiB
C++
61 lines
1.6 KiB
C++
#include "logbook.h"
|
|
|
|
namespace germanairlinesva_logbook
|
|
{
|
|
Logbook::Logbook()
|
|
{
|
|
if (germanairlinesva_util::fileExists(
|
|
XPLANE_PLUGIN_DIRECTORY LOGBOOK)) {
|
|
this->fromFile(XPLANE_PLUGIN_DIRECTORY LOGBOOK);
|
|
} else {
|
|
char header[] = {'V', 'G', 'A', 'L', '\0', 1};
|
|
this->file.resize(6);
|
|
std::memcpy(file.data(), &header, 6);
|
|
}
|
|
}
|
|
|
|
void Logbook::fromFile(const std::string &file)
|
|
{
|
|
std::ifstream in(file, std::ifstream::binary);
|
|
|
|
// File Header
|
|
char ident[5];
|
|
in.read(ident, 5);
|
|
if (strcmp(ident, "VGAL") != 0) {
|
|
throw std::invalid_argument("Wrong file");
|
|
}
|
|
std::uint8_t version;
|
|
in.read(reinterpret_cast<char *>(&version), 1);
|
|
|
|
if (version == 1) {
|
|
return this->readVersion1(in);
|
|
}
|
|
}
|
|
|
|
void Logbook::readVersion1(std::ifstream &in)
|
|
{
|
|
in.seekg(0, std::fstream::end);
|
|
std::streampos fileSize = in.tellg();
|
|
in.seekg(0, std::ios::beg);
|
|
|
|
this->file.resize(fileSize);
|
|
in.read(reinterpret_cast<char *>(this->file.data()), fileSize);
|
|
in.close();
|
|
}
|
|
|
|
void Logbook::addEntry(LogbookEntry entry)
|
|
{
|
|
std::size_t size = file.size();
|
|
file.resize(file.size() + entry.getBinaryLength());
|
|
std::uint8_t *bufPtr = file.data() + size;
|
|
std::memcpy(bufPtr, entry.getBinaryData(), entry.getBinaryLength());
|
|
}
|
|
|
|
void Logbook::toFile()
|
|
{
|
|
std::ofstream out(XPLANE_PLUGIN_DIRECTORY LOGBOOK,
|
|
std::fstream::binary);
|
|
out.write(reinterpret_cast<char *>(this->file.data()), this->file.size());
|
|
out.close();
|
|
}
|
|
} // namespace germanairlinesva_logbook
|