validation of track/sector/block parameters
This commit is contained in:
parent
8ca3e27fc4
commit
27496433eb
|
@ -20,6 +20,7 @@
|
||||||
package io.github.applecommander.acx.arggroup;
|
package io.github.applecommander.acx.arggroup;
|
||||||
|
|
||||||
import com.webcodepro.applecommander.storage.Disk;
|
import com.webcodepro.applecommander.storage.Disk;
|
||||||
|
import com.webcodepro.applecommander.storage.physical.ImageOrder;
|
||||||
|
|
||||||
import picocli.CommandLine.ArgGroup;
|
import picocli.CommandLine.ArgGroup;
|
||||||
import picocli.CommandLine.Option;
|
import picocli.CommandLine.Option;
|
||||||
|
@ -29,7 +30,7 @@ public class CoordinateSelection {
|
||||||
private CoordinateSelection.SectorCoordinateSelection sectorCoordinate;
|
private CoordinateSelection.SectorCoordinateSelection sectorCoordinate;
|
||||||
@ArgGroup(exclusive = false)
|
@ArgGroup(exclusive = false)
|
||||||
private CoordinateSelection.BlockCoordinateSelection blockCoordinate;
|
private CoordinateSelection.BlockCoordinateSelection blockCoordinate;
|
||||||
|
|
||||||
public boolean includesBootSector() {
|
public boolean includesBootSector() {
|
||||||
if (sectorCoordinate != null) {
|
if (sectorCoordinate != null) {
|
||||||
return sectorCoordinate.isBootSector();
|
return sectorCoordinate.isBootSector();
|
||||||
|
@ -39,7 +40,7 @@ public class CoordinateSelection {
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte[] read(Disk disk) {
|
public byte[] read(Disk disk) {
|
||||||
if (sectorCoordinate != null) {
|
if (sectorCoordinate != null) {
|
||||||
return sectorCoordinate.read(disk);
|
return sectorCoordinate.read(disk);
|
||||||
|
@ -49,7 +50,7 @@ public class CoordinateSelection {
|
||||||
}
|
}
|
||||||
return disk.readSector(0, 0);
|
return disk.readSector(0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void write(Disk disk, byte[] data) {
|
public void write(Disk disk, byte[] data) {
|
||||||
if (sectorCoordinate != null) {
|
if (sectorCoordinate != null) {
|
||||||
sectorCoordinate.write(disk, data);
|
sectorCoordinate.write(disk, data);
|
||||||
|
@ -59,35 +60,67 @@ public class CoordinateSelection {
|
||||||
}
|
}
|
||||||
disk.writeSector(0, 0, data);
|
disk.writeSector(0, 0, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class SectorCoordinateSelection {
|
public static class SectorCoordinateSelection {
|
||||||
@Option(names = { "-t", "--track" }, required = true, description = "Track number.")
|
@Option(names = { "-t", "--track" }, required = true, description = "Track number.")
|
||||||
private Integer track;
|
private Integer track;
|
||||||
@Option(names = { "-s", "--sector" }, required = true, description = "Sector number.")
|
@Option(names = { "-s", "--sector" }, required = true, description = "Sector number.")
|
||||||
private Integer sector;
|
private Integer sector;
|
||||||
|
|
||||||
public boolean isBootSector() {
|
public boolean isBootSector() {
|
||||||
return track == 0 && sector == 0;
|
return track == 0 && sector == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void validateTrackAndSector(Disk disk) throws IllegalArgumentException {
|
||||||
|
final int tracksPerDisk = disk.getImageOrder().getTracksPerDisk();
|
||||||
|
final int sectorsPerTrack = disk.getImageOrder().getSectorsPerTrack();
|
||||||
|
|
||||||
|
if (track < 0 || track >= tracksPerDisk) {
|
||||||
|
String errormsg = String.format("The track number(%d) is out of range(0-%d) on this image.", track, tracksPerDisk-1);
|
||||||
|
throw new IllegalArgumentException(errormsg);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sector < 0 || sector >= sectorsPerTrack) {
|
||||||
|
String errormsg = String.format("The sector number(%d) is out of range(0-%d) on this image.", sector, sectorsPerTrack-1);
|
||||||
|
throw new IllegalArgumentException(errormsg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public byte[] read(Disk disk) {
|
public byte[] read(Disk disk) {
|
||||||
|
validateTrackAndSector(disk);
|
||||||
return disk.readSector(track, sector);
|
return disk.readSector(track, sector);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void write(Disk disk, byte[] data) {
|
public void write(Disk disk, byte[] data) {
|
||||||
|
validateTrackAndSector(disk);
|
||||||
disk.writeSector(track, sector, data);
|
disk.writeSector(track, sector, data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public static class BlockCoordinateSelection {
|
public static class BlockCoordinateSelection {
|
||||||
@Option(names = { "-b", "--block" }, description = "Block number.")
|
@Option(names = { "-b", "--block" }, description = "Block number.")
|
||||||
private Integer block;
|
private Integer block;
|
||||||
|
|
||||||
public boolean isBootBlock() {
|
public boolean isBootBlock() {
|
||||||
return block == 0;
|
return block == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void validateBlockNum(Disk disk) throws IllegalArgumentException {
|
||||||
|
final int blocksOnDevice = disk.getImageOrder().getBlocksOnDevice();
|
||||||
|
|
||||||
|
if (block < 0 || block >= blocksOnDevice) {
|
||||||
|
String errormsg = String.format("The block number(%d) is out of range(0-%d) on this image.", block, blocksOnDevice-1);
|
||||||
|
throw new IllegalArgumentException(errormsg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public byte[] read(Disk disk) {
|
public byte[] read(Disk disk) {
|
||||||
|
validateBlockNum(disk);
|
||||||
return disk.readBlock(block);
|
return disk.readBlock(block);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void write(Disk disk, byte[] data) {
|
public void write(Disk disk, byte[] data) {
|
||||||
|
validateBlockNum(disk);
|
||||||
disk.writeBlock(block, data);
|
disk.writeBlock(block, data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue