def decompress_rom_file(self, file, decomp_file): validCRC = [ [0xEC, 0x70, 0x11, 0xB7, 0x76, 0x16, 0xD7, 0x2B], # Compressed [0x70, 0xEC, 0xB7, 0x11, 0x16, 0x76, 0x2B, 0xD7], # Byteswap compressed [0x93, 0x52, 0x2E, 0x7B, 0xE5, 0x06, 0xD4, 0x27], # Decompressed ] # Validate ROM file file_name = os.path.splitext(file) romCRC = list(self.buffer[0x10:0x18]) if romCRC not in validCRC: # Bad CRC validation raise RuntimeError('ROM file %s is not a valid OoT 1.0 US ROM.' % file) elif len(self.buffer) < 0x2000000 or len(self.buffer) > ( 0x4000000) or file_name[1] not in ['.z64', '.n64']: # ROM is too big, or too small, or not a bad type raise RuntimeError('ROM file %s is not a valid OoT 1.0 US ROM.' % file) elif len(self.buffer) == 0x2000000: # If Input ROM is compressed, then Decompress it subcall = [] if is_bundled(): sub_dir = "." else: sub_dir = "Decompress" if platform.system() == 'Windows': if 8 * struct.calcsize("P") == 64: subcall = [sub_dir + "\\Decompress.exe", file, decomp_file] else: subcall = [ sub_dir + "\\Decompress32.exe", file, decomp_file ] elif platform.system() == 'Linux': if platform.uname()[4] == 'aarch64' or platform.uname( )[4] == 'arm64': subcall = [ sub_dir + "/Decompress_ARM64", file, decomp_file ] else: subcall = [sub_dir + "/Decompress", file, decomp_file] elif platform.system() == 'Darwin': subcall = [sub_dir + "/Decompress.out", file, decomp_file] else: raise RuntimeError( 'Unsupported operating system for decompression. Please supply an already decompressed ROM.' ) subprocess.call(subcall, **subprocess_args()) self.read_rom(decomp_file) else: # ROM file is a valid and already uncompressed pass
def run_process(window, logger, args): process = subprocess.Popen(args, **subprocess_args(True)) filecount = None while True: line = process.stdout.readline() if line != b'': find_index = line.find(b'files remaining') if find_index > -1: files = int(line[:find_index].strip()) if filecount == None: filecount = files window.update_progress(65 + 30 * (1 - files / filecount)) logger.info(line.decode('utf-8').strip('\n')) else: break