| 20 | FdiImageReader(const ImageReaderProto& config): ImageReader(config) {} |
| 21 | |
| 22 | std::unique_ptr<Image> readImage() override |
| 23 | { |
| 24 | std::ifstream inputFile( |
| 25 | _config.filename(), std::ios::in | std::ios::binary); |
| 26 | if (!inputFile.is_open()) |
| 27 | error("cannot open input file"); |
| 28 | |
| 29 | Bytes header(32); |
| 30 | inputFile.read((char*)header.begin(), header.size()); |
| 31 | ByteReader headerReader(header); |
| 32 | if (headerReader.seek(0).read_le32() != 0) |
| 33 | error("FDI: could not find FDI header, is this a FDI file?"); |
| 34 | |
| 35 | // we currently don't use fddType but it could be used to automatically |
| 36 | // select profile parameters in the future |
| 37 | // |
| 38 | int fddType = headerReader.seek(4).read_le32(); |
| 39 | int headerSize = headerReader.seek(0x08).read_le32(); |
| 40 | int sectorSize = headerReader.seek(0x10).read_le32(); |
| 41 | int sectorsPerTrack = headerReader.seek(0x14).read_le32(); |
| 42 | int sides = headerReader.seek(0x18).read_le32(); |
| 43 | int tracks = headerReader.seek(0x1c).read_le32(); |
| 44 | |
| 45 | inputFile.seekg(headerSize); |
| 46 | |
| 47 | std::unique_ptr<Image> image(new Image); |
| 48 | int trackCount = 0; |
| 49 | for (int track = 0; track < tracks; track++) |
| 50 | { |
| 51 | if (inputFile.eof()) |
| 52 | break; |
| 53 | |
| 54 | for (int side = 0; side < sides; side++) |
| 55 | { |
| 56 | std::vector<unsigned> sectors; |
| 57 | for (int i = 0; i < sectorsPerTrack; i++) |
| 58 | sectors.push_back(i + 1); |
| 59 | |
| 60 | for (int sectorId : sectors) |
| 61 | { |
| 62 | Bytes data(sectorSize); |
| 63 | inputFile.read((char*)data.begin(), data.size()); |
| 64 | |
| 65 | const auto& sector = image->put(track, side, sectorId); |
| 66 | sector->status = Sector::OK; |
| 67 | sector->data = data; |
| 68 | } |
| 69 | } |
| 70 | |
| 71 | trackCount++; |
| 72 | } |
| 73 | |
| 74 | auto layout = _extraConfig.mutable_layout(); |
| 75 | if (globalConfig()->encoder().format_case() == |
| 76 | EncoderProto::FormatCase::FORMAT_NOT_SET) |
| 77 | { |
| 78 | auto ibm = _extraConfig.mutable_encoder()->mutable_ibm(); |
| 79 | auto trackdata = ibm->add_trackdata(); |