| 90 | Jv3ImageReader(const ImageReaderProto& config): ImageReader(config) {} |
| 91 | |
| 92 | std::unique_ptr<Image> readImage() override |
| 93 | { |
| 94 | std::ifstream inputFile( |
| 95 | _config.filename(), std::ios::in | std::ios::binary); |
| 96 | if (!inputFile.is_open()) |
| 97 | error("cannot open input file"); |
| 98 | |
| 99 | inputFile.seekg(0, std::ios::end); |
| 100 | unsigned inputFileSize = inputFile.tellg(); |
| 101 | unsigned headerPtr = 0; |
| 102 | std::unique_ptr<Image> image(new Image); |
| 103 | for (;;) |
| 104 | { |
| 105 | unsigned dataPtr = headerPtr + 2901 * 3 + 1; |
| 106 | if (dataPtr >= inputFileSize) |
| 107 | break; |
| 108 | |
| 109 | for (unsigned i = 0; i < 2901; i++) |
| 110 | { |
| 111 | SectorHeader header = {0, 0, 0xff}; |
| 112 | inputFile.seekg(headerPtr); |
| 113 | inputFile.read((char*)&header, 3); |
| 114 | unsigned sectorSize = getSectorSize(header.flags); |
| 115 | if ((header.flags & JV3_FREEF) != JV3_FREEF) |
| 116 | { |
| 117 | Bytes data(sectorSize); |
| 118 | inputFile.seekg(dataPtr); |
| 119 | inputFile.read((char*)data.begin(), sectorSize); |
| 120 | |
| 121 | unsigned head = !!(header.flags & JV3_SIDE); |
| 122 | const auto& sector = |
| 123 | image->put(header.track, head, header.sector); |
| 124 | sector->status = Sector::OK; |
| 125 | sector->data = data; |
| 126 | } |
| 127 | |
| 128 | headerPtr += 3; |
| 129 | dataPtr += sectorSize; |
| 130 | } |
| 131 | |
| 132 | /* dataPtr is now pointing at the beginning of the next chunk. */ |
| 133 | |
| 134 | headerPtr = dataPtr; |
| 135 | } |
| 136 | |
| 137 | image->calculateSize(); |
| 138 | return image; |
| 139 | } |
| 140 | }; |
| 141 | |
| 142 | std::unique_ptr<ImageReader> ImageReader::createJv3ImageReader( |
nothing calls this directly
no test coverage detected