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:
David Given
2024-11-29 22:30:33 +01:00
parent 2bda78fb40
commit 0fcb2075e0
13 changed files with 51 additions and 84 deletions

View File

@@ -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)

View File

@@ -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);
}

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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);
}

View File

@@ -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;

View File

@@ -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;

View File

@@ -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)

View File

@@ -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>();

View File

@@ -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());

View File

@@ -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 {

View File

@@ -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)