hashPs3 function
Future<String?>
hashPs3(
- String path, {
- RcFileReader fileReader = const DefaultRcFileReader(),
- RcCdReader cdReader = const CompositeCdReader(),
Hashes a PlayStation 3 disc image or extracted/installed EBOOT.BIN.
Implementation
Future<String?> hashPs3(
String path, {
RcFileReader fileReader = const DefaultRcFileReader(),
RcCdReader cdReader = const CompositeCdReader(),
}) async {
final lowerPath = path.toLowerCase();
if (lowerPath.endsWith('.iso') || lowerPath.endsWith('.chd')) {
final track = await cdReader.openTrack(path, 1);
if (track == null) return null;
try {
final param = await cdReader.findFile(track, ['PS3_GAME', 'PARAM.SFO']);
final eboot =
await cdReader.findFile(track, ['PS3_GAME', 'USRDIR', 'EBOOT.BIN']);
if (param == null || eboot == null) return null;
final paramBytes = await cdReader.readFile(track, param);
final ebootBytes = await cdReader.readFile(track, eboot);
return _hashPair(paramBytes, ebootBytes);
} finally {
await cdReader.closeTrack(track);
}
}
final normalized = path.replaceAll(r'\', '/');
final upper = normalized.toUpperCase();
final ps3GameIndex = upper.indexOf('PS3_GAME/USRDIR/');
final usrDirIndex = upper.indexOf('USRDIR/');
late final String sfoPath;
if (ps3GameIndex >= 0) {
sfoPath = '${normalized.substring(0, ps3GameIndex + 9)}PARAM.SFO';
} else if (usrDirIndex >= 0) {
sfoPath = '${normalized.substring(0, usrDirIndex)}PARAM.SFO';
} else {
final slash = normalized.lastIndexOf('/');
sfoPath = '${slash < 0 ? '' : normalized.substring(0, slash + 1)}PARAM.SFO';
}
return _hashFiles(sfoPath, path, fileReader);
}