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