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