mirror of
https://github.com/davidgiven/fluxengine.git
synced 2025-10-24 11:11:02 -07:00
Move filesystem_track_ordering from ImageReaderProto/ImageWriterProto to
ImgInputOutputProto; it now only applies to img files. Make it honour the appropriate track layout setting too.
This commit is contained in:
@@ -734,7 +734,7 @@ void readDiskCommand(
|
||||
if (globalConfig()->decoder().has_write_csv_to())
|
||||
writer.writeCsv(
|
||||
*diskflux->image, globalConfig()->decoder().write_csv_to());
|
||||
writer.writeMappedImage(*diskflux->image);
|
||||
writer.writeImage(*diskflux->image);
|
||||
}
|
||||
|
||||
void rawReadDiskCommand(FluxSource& fluxsource, FluxSink& fluxsink)
|
||||
|
||||
@@ -63,26 +63,3 @@ std::unique_ptr<ImageReader> ImageReader::create(const ImageReaderProto& config)
|
||||
}
|
||||
|
||||
ImageReader::ImageReader(const ImageReaderProto& config): _config(config) {}
|
||||
|
||||
std::unique_ptr<Image> ImageReader::readMappedImage()
|
||||
{
|
||||
auto rawImage = readImage();
|
||||
|
||||
if (!_config.filesystem_track_order())
|
||||
return rawImage;
|
||||
|
||||
log("READER: converting from filesystem sector order to disk order");
|
||||
std::set<std::shared_ptr<const Sector>> sectors;
|
||||
for (const auto& e : *rawImage)
|
||||
{
|
||||
auto trackLayout =
|
||||
Layout::getLayoutOfTrack(e->logicalTrack, e->logicalSide);
|
||||
auto newSector = std::make_shared<Sector>();
|
||||
*newSector = *e;
|
||||
newSector->logicalSector =
|
||||
trackLayout->filesystemToNaturalSectorMap.at(e->logicalSector);
|
||||
sectors.insert(newSector);
|
||||
}
|
||||
|
||||
return std::make_unique<Image>(sectors);
|
||||
}
|
||||
|
||||
@@ -51,15 +51,10 @@ public:
|
||||
return _extraConfig;
|
||||
}
|
||||
|
||||
/* Directly reads the image. */
|
||||
/* Reads the image. */
|
||||
|
||||
virtual std::unique_ptr<Image> readImage() = 0;
|
||||
|
||||
/* Reads the image, and then applies any optional mapping to go from
|
||||
* filesystem ordering to disk ordering. */
|
||||
|
||||
std::unique_ptr<Image> readMappedImage();
|
||||
|
||||
protected:
|
||||
const ImageReaderProto& _config;
|
||||
ConfigProto _extraConfig;
|
||||
|
||||
@@ -2,7 +2,12 @@ syntax = "proto2";
|
||||
|
||||
import "lib/config/common.proto";
|
||||
|
||||
message ImgInputOutputProto {}
|
||||
message ImgInputOutputProto {
|
||||
optional bool filesystem_sector_order = 1 [
|
||||
(help) = "read/write sector image in filesystem order",
|
||||
default = false
|
||||
];
|
||||
}
|
||||
|
||||
message DiskCopyInputProto {}
|
||||
message ImdInputProto {}
|
||||
@@ -15,16 +20,12 @@ message FdiInputProto {}
|
||||
message D88InputProto {}
|
||||
message NfdInputProto {}
|
||||
|
||||
// NEXT_TAG: 15
|
||||
// NEXT_TAG: 14
|
||||
message ImageReaderProto
|
||||
{
|
||||
optional string filename = 1 [ (help) = "filename of input sector image" ];
|
||||
optional bool filesystem_track_order = 13 [
|
||||
(help) = "read/write sector image in filesystem order",
|
||||
default = false
|
||||
];
|
||||
|
||||
optional ImageReaderWriterType type = 14
|
||||
optional ImageReaderWriterType type = 13
|
||||
[default = IMAGETYPE_NOT_SET, (help) = "input image type"];
|
||||
|
||||
optional ImgInputOutputProto img = 2;
|
||||
|
||||
@@ -31,9 +31,11 @@ public:
|
||||
"IMG: bad configuration; did you remember to set the "
|
||||
"tracks, sides and trackdata fields in the layout?");
|
||||
|
||||
bool in_filesystem_order = _config.img().filesystem_sector_order();
|
||||
std::unique_ptr<Image> image(new Image);
|
||||
for (const auto& p :
|
||||
Layout::getTrackOrdering(layout.filesystem_track_order()))
|
||||
for (const auto& p : Layout::getTrackOrdering(
|
||||
in_filesystem_order ? layout.filesystem_track_order()
|
||||
: layout.image_track_order()))
|
||||
{
|
||||
int track = p.first;
|
||||
int side = p.second;
|
||||
@@ -47,6 +49,9 @@ public:
|
||||
Bytes data(trackLayout->sectorSize);
|
||||
inputFile.read((char*)data.begin(), data.size());
|
||||
|
||||
if (in_filesystem_order)
|
||||
sectorId =
|
||||
trackLayout->filesystemToNaturalSectorMap.at(sectorId);
|
||||
const auto& sector = image->put(track, side, sectorId);
|
||||
sector->status = Sector::OK;
|
||||
sector->data = data;
|
||||
|
||||
@@ -173,27 +173,3 @@ void ImageWriter::printMap(const Image& image)
|
||||
<< std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
void ImageWriter::writeMappedImage(const Image& image)
|
||||
{
|
||||
if (_config.filesystem_track_order())
|
||||
{
|
||||
log("WRITER: converting from disk sector order to filesystem order");
|
||||
|
||||
std::set<std::shared_ptr<const Sector>> sectors;
|
||||
for (const auto& e : image)
|
||||
{
|
||||
auto trackLayout =
|
||||
Layout::getLayoutOfTrack(e->logicalTrack, e->logicalSide);
|
||||
auto newSector = std::make_shared<Sector>();
|
||||
*newSector = *e;
|
||||
newSector->logicalSector =
|
||||
trackLayout->naturalToFilesystemSectorMap.at(e->logicalSector);
|
||||
sectors.insert(newSector);
|
||||
}
|
||||
|
||||
writeImage(Image(sectors));
|
||||
}
|
||||
else
|
||||
writeImage(image);
|
||||
}
|
||||
|
||||
@@ -37,11 +37,8 @@ public:
|
||||
void writeCsv(const Image& sectors, const std::string& filename);
|
||||
|
||||
/* Writes a raw image. */
|
||||
virtual void writeImage(const Image& sectors) = 0;
|
||||
|
||||
/* Writes an image applying any optional mapping from disk sector numbering
|
||||
* to filesystem sector numbering. */
|
||||
void writeMappedImage(const Image& sectors);
|
||||
virtual void writeImage(const Image& sectors) = 0;
|
||||
|
||||
protected:
|
||||
const ImageWriterProto& _config;
|
||||
|
||||
@@ -67,12 +67,8 @@ message ImdOutputProto
|
||||
message ImageWriterProto
|
||||
{
|
||||
optional string filename = 1 [ (help) = "filename of output sector image" ];
|
||||
optional bool filesystem_track_order = 10 [
|
||||
(help) = "read/write sector image in filesystem order",
|
||||
default = false
|
||||
];
|
||||
|
||||
optional ImageReaderWriterType type = 11
|
||||
optional ImageReaderWriterType type = 10
|
||||
[ default = IMAGETYPE_NOT_SET, (help) = "image writer type" ];
|
||||
|
||||
optional ImgInputOutputProto img = 2;
|
||||
|
||||
@@ -31,8 +31,12 @@ public:
|
||||
if (!outputFile.is_open())
|
||||
error("cannot open output file");
|
||||
|
||||
bool in_filesystem_order = _config.img().filesystem_sector_order();
|
||||
for (const auto& p : Layout::getTrackOrdering(
|
||||
layout.filesystem_track_order(), tracks, sides))
|
||||
in_filesystem_order ? layout.filesystem_track_order()
|
||||
: layout.image_track_order(),
|
||||
tracks,
|
||||
sides))
|
||||
{
|
||||
int track = p.first;
|
||||
int side = p.second;
|
||||
@@ -40,6 +44,10 @@ public:
|
||||
auto trackLayout = Layout::getLayoutOfTrack(track, side);
|
||||
for (int sectorId : trackLayout->naturalSectorOrder)
|
||||
{
|
||||
if (in_filesystem_order)
|
||||
sectorId =
|
||||
trackLayout->filesystemToNaturalSectorMap.at(sectorId);
|
||||
|
||||
const auto& sector = image.get(track, side, sectorId);
|
||||
if (sector)
|
||||
sector->data.slice(0, trackLayout->sectorSize)
|
||||
|
||||
@@ -44,14 +44,14 @@ public:
|
||||
|
||||
void flushChanges() override
|
||||
{
|
||||
_writer->writeMappedImage(*_image);
|
||||
_writer->writeImage(*_image);
|
||||
_changed = false;
|
||||
}
|
||||
|
||||
void discardChanges() override
|
||||
{
|
||||
if (_reader)
|
||||
_image = _reader->readMappedImage();
|
||||
_image = _reader->readImage();
|
||||
else
|
||||
{
|
||||
_image = std::make_shared<Image>();
|
||||
|
||||
@@ -68,7 +68,7 @@ int mainWrite(int argc, const char* argv[])
|
||||
flags.parseFlagsWithConfigFiles(argc, argv, formats);
|
||||
|
||||
auto reader = ImageReader::create(globalConfig());
|
||||
std::shared_ptr<Image> image = reader->readMappedImage();
|
||||
std::shared_ptr<Image> image = reader->readImage();
|
||||
|
||||
auto encoder = Arch::createEncoder(globalConfig());
|
||||
auto fluxSink = FluxSink::create(globalConfig());
|
||||
|
||||
@@ -137,11 +137,15 @@ option_group {
|
||||
|
||||
config {
|
||||
image_reader {
|
||||
filesystem_track_order: true
|
||||
img {
|
||||
filesystem_sector_order: true
|
||||
}
|
||||
}
|
||||
|
||||
image_writer {
|
||||
filesystem_track_order: true
|
||||
img {
|
||||
filesystem_sector_order: true
|
||||
}
|
||||
}
|
||||
|
||||
filesystem {
|
||||
@@ -180,11 +184,15 @@ option_group {
|
||||
|
||||
config {
|
||||
image_reader {
|
||||
filesystem_track_order: true
|
||||
img {
|
||||
filesystem_sector_order: true
|
||||
}
|
||||
}
|
||||
|
||||
image_writer {
|
||||
filesystem_track_order: true
|
||||
img {
|
||||
filesystem_sector_order: true
|
||||
}
|
||||
}
|
||||
|
||||
filesystem {
|
||||
@@ -222,11 +230,15 @@ option_group {
|
||||
|
||||
config {
|
||||
image_reader {
|
||||
filesystem_track_order: true
|
||||
img {
|
||||
filesystem_sector_order: true
|
||||
}
|
||||
}
|
||||
|
||||
image_writer {
|
||||
filesystem_track_order: true
|
||||
img {
|
||||
filesystem_sector_order: true
|
||||
}
|
||||
}
|
||||
|
||||
filesystem {
|
||||
|
||||
@@ -142,7 +142,7 @@ public:
|
||||
[this]()
|
||||
{
|
||||
auto image =
|
||||
GetContext().GetImageReader()->readMappedImage();
|
||||
GetContext().GetImageReader()->readImage();
|
||||
auto* encoder = GetContext().GetEncoder();
|
||||
auto* fluxSink = GetContext().GetFluxSink();
|
||||
|
||||
@@ -260,7 +260,7 @@ public:
|
||||
QueueJob(
|
||||
[image, this]()
|
||||
{
|
||||
GetContext().GetImageWriter()->writeMappedImage(*image);
|
||||
GetContext().GetImageWriter()->writeImage(*image);
|
||||
});
|
||||
}
|
||||
catch (const ErrorException& e)
|
||||
|
||||
Reference in New Issue
Block a user