Files
fluxengine/lib/fluxsource/fl2fluxsource.cc
David Given 89688394f8 Replace the upgradefluxfile builtin with a seperate upgrade-flux-file tool.
This allows us to remove all the SQL stuff from the main program, and restores
the ability to upgrade from version 2 SQL files.
2022-02-04 21:27:24 +01:00

61 lines
1.5 KiB
C++

#include "globals.h"
#include "fluxmap.h"
#include "lib/fluxsource/fluxsource.pb.h"
#include "lib/fl2.pb.h"
#include "fluxsource/fluxsource.h"
#include "proto.h"
#include "fmt/format.h"
#include <fstream>
class Fl2FluxSource : public FluxSource
{
public:
Fl2FluxSource(const Fl2FluxSourceProto& config):
_config(config)
{
std::ifstream ifs(_config.filename(), std::ios::in | std::ios::binary);
if (!ifs.is_open())
Error() << fmt::format("cannot open input file '{}': {}",
_config.filename(), strerror(errno));
if (!_proto.ParseFromIstream(&ifs))
Error() << "unable to read input file";
}
public:
std::unique_ptr<Fluxmap> readFlux(int cylinder, int head)
{
for (const auto& track : _proto.track())
{
if ((track.cylinder() == cylinder) && (track.head() == head))
return std::make_unique<Fluxmap>(track.flux());
}
return std::make_unique<Fluxmap>();
}
void recalibrate() {}
private:
void check_for_error(std::ifstream& ifs)
{
if (ifs.fail())
Error() << fmt::format("FL2 read I/O error: {}", strerror(errno));
}
private:
const Fl2FluxSourceProto& _config;
FluxFileProto _proto;
};
std::unique_ptr<FluxSource> FluxSource::createFl2FluxSource(const Fl2FluxSourceProto& config)
{
char buffer[16];
std::ifstream(config.filename(), std::ios::in | std::ios::binary).read(buffer, 16);
if (strncmp(buffer, "SQLite format 3", 16) == 0)
Error() << "this flux file is too old; please use the upgrade-flux-file to upgrade it";
return std::unique_ptr<FluxSource>(new Fl2FluxSource(config));
}