hashPs3 function

Future<String?> hashPs3(
  1. String path, {
  2. RcFileReader fileReader = const DefaultRcFileReader(),
  3. 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);
}