mirror of
https://github.com/mupen64plus/mupen64plus-ui-python.git
synced 2025-04-02 10:51:53 -04:00
move romreader to separate file
This commit is contained in:
parent
8c393c96aa
commit
20ecf25ca0
2 changed files with 142 additions and 121 deletions
|
@ -15,17 +15,12 @@
|
|||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import os
|
||||
import ctypes
|
||||
import fnmatch
|
||||
|
||||
from PyQt5.QtGui import *
|
||||
from PyQt5.QtWidgets import *
|
||||
from PyQt5.QtCore import *
|
||||
from PyQt5.QtCore import Qt
|
||||
from PyQt5.QtGui import QPixmap
|
||||
from PyQt5.QtWidgets import QMainWindow, QDesktopWidget, QListWidgetItem, QGraphicsPixmapItem
|
||||
|
||||
from m64py.utils import sl
|
||||
from m64py.core.defs import m64p_rom_header
|
||||
from m64py.frontend.log import log
|
||||
from m64py.archive import Archive, EXT_FILTER
|
||||
from m64py.frontend.romreader import ROMReader
|
||||
from m64py.ui.romlist_ui import Ui_ROMList
|
||||
|
||||
try:
|
||||
|
@ -184,115 +179,3 @@ class ROMList(QMainWindow, Ui_ROMList):
|
|||
self.snapshotView.scene().addItem(snapshot_item)
|
||||
self.title_item = title_item
|
||||
self.snapshot_item = snapshot_item
|
||||
|
||||
|
||||
class ROMReader(QThread):
|
||||
"""ROM reader thread"""
|
||||
|
||||
def __init__(self, parent):
|
||||
"""Constructor."""
|
||||
QThread.__init__(self, parent)
|
||||
self.parent = parent
|
||||
self.roms = []
|
||||
self.rom_path = None
|
||||
|
||||
def set_path(self, path):
|
||||
"""Sets ROM directory path."""
|
||||
self.rom_path = path
|
||||
|
||||
def get_roms(self):
|
||||
"""Returns ROM list."""
|
||||
return self.roms
|
||||
|
||||
def get_files(self):
|
||||
"""Returns list of files found in path."""
|
||||
files = []
|
||||
types = EXT_FILTER.split()
|
||||
for filename in os.listdir(self.rom_path):
|
||||
for ext in types:
|
||||
if fnmatch.fnmatch(filename, ext):
|
||||
files.append(filename)
|
||||
return files
|
||||
|
||||
def get_rom_crc(self, archive, fname):
|
||||
rom_header = m64p_rom_header()
|
||||
ctypes.memmove(
|
||||
ctypes.byref(rom_header),
|
||||
archive.read(fname, ctypes.sizeof(rom_header)),
|
||||
ctypes.sizeof(rom_header))
|
||||
crc1_pre = sl(rom_header.CRC1)
|
||||
crc2_pre = sl(rom_header.CRC2)
|
||||
|
||||
regs = 0
|
||||
regs |= rom_header.init_PI_BSB_DOM1_LAT_REG << 24
|
||||
regs |= rom_header.init_PI_BSB_DOM1_PGS_REG << 16
|
||||
regs |= rom_header.init_PI_BSB_DOM1_PWD_REG << 8
|
||||
regs |= rom_header.init_PI_BSB_DOM1_PGS_REG2
|
||||
|
||||
if regs == 0x80371240:
|
||||
# native *.z64
|
||||
crc1 = crc1_pre
|
||||
crc2 = crc2_pre
|
||||
elif regs == 0x37804012:
|
||||
# byteswapped [BADC] *.v64
|
||||
crc1 = 0
|
||||
crc1 |= ((crc1_pre >> 0) & 0xff) << 8
|
||||
crc1 |= ((crc1_pre >> 8) & 0xff) << 0
|
||||
crc1 |= ((crc1_pre >> 16) & 0xff) << 24
|
||||
crc1 |= ((crc1_pre >> 24) & 0xff) << 16
|
||||
crc2 = 0
|
||||
crc2 |= ((crc2_pre >> 0) & 0xff) << 8
|
||||
crc2 |= ((crc2_pre >> 8) & 0xff) << 0
|
||||
crc2 |= ((crc2_pre >> 16) & 0xff) << 24
|
||||
crc2 |= ((crc2_pre >> 24) & 0xff) << 16
|
||||
elif regs == 0x40123780:
|
||||
# wordswapped [DCBA] *.n64
|
||||
crc1 = 0
|
||||
crc1 |= ((crc1_pre >> 0) & 0xff) << 24
|
||||
crc1 |= ((crc1_pre >> 8) & 0xff) << 16
|
||||
crc1 |= ((crc1_pre >> 16) & 0xff) << 8
|
||||
crc1 |= ((crc1_pre >> 24) & 0xff) << 0
|
||||
crc2 = 0
|
||||
crc2 |= ((crc2_pre >> 0) & 0xff) << 24
|
||||
crc2 |= ((crc2_pre >> 8) & 0xff) << 16
|
||||
crc2 |= ((crc2_pre >> 16) & 0xff) << 8
|
||||
crc2 |= ((crc2_pre >> 24) & 0xff) << 0
|
||||
else:
|
||||
return None
|
||||
return (crc1, crc2)
|
||||
|
||||
def read_files(self):
|
||||
"""Reads files."""
|
||||
self.roms = []
|
||||
files = self.get_files()
|
||||
num_files = len(files)
|
||||
for filenum, filename in enumerate(files):
|
||||
fullpath = os.path.join(self.rom_path, filename)
|
||||
try:
|
||||
archive = Archive(fullpath)
|
||||
for fname in archive.namelist:
|
||||
crc_tuple = self.get_rom_crc(archive, fname)
|
||||
if crc_tuple:
|
||||
rom_settings = self.parent.core.get_rom_settings(
|
||||
crc_tuple[0], crc_tuple[1])
|
||||
if rom_settings:
|
||||
crc = "%X%X" % (crc_tuple[0], crc_tuple[1])
|
||||
self.roms.append((crc, rom_settings.goodname, fullpath, fname))
|
||||
archive.close()
|
||||
except Exception as err:
|
||||
log.warn(str(err))
|
||||
continue
|
||||
percent = float(filenum) / float(num_files) * 100
|
||||
self.parent.progressBar.valueChanged.emit(percent)
|
||||
self.exit()
|
||||
|
||||
def stop(self):
|
||||
"""Stops thread."""
|
||||
if self.isRunning():
|
||||
self.terminate()
|
||||
self.wait()
|
||||
|
||||
def run(self):
|
||||
"""Starts thread."""
|
||||
self.read_files()
|
||||
self.exec_()
|
||||
|
|
138
src/m64py/frontend/romreader.py
Normal file
138
src/m64py/frontend/romreader.py
Normal file
|
@ -0,0 +1,138 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Author: Milan Nikolic <gen2brain@gmail.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import os
|
||||
import ctypes
|
||||
import fnmatch
|
||||
|
||||
from PyQt5.QtCore import QThread
|
||||
|
||||
from m64py.utils import sl
|
||||
from m64py.core.defs import m64p_rom_header
|
||||
from m64py.frontend.log import log
|
||||
from m64py.archive import Archive, EXT_FILTER
|
||||
|
||||
|
||||
class ROMReader(QThread):
|
||||
"""ROM reader thread"""
|
||||
|
||||
def __init__(self, parent):
|
||||
"""Constructor."""
|
||||
QThread.__init__(self, parent)
|
||||
self.parent = parent
|
||||
self.roms = []
|
||||
self.rom_path = None
|
||||
|
||||
def set_path(self, path):
|
||||
"""Sets ROM directory path."""
|
||||
self.rom_path = path
|
||||
|
||||
def get_roms(self):
|
||||
"""Returns ROM list."""
|
||||
return self.roms
|
||||
|
||||
def get_files(self):
|
||||
"""Returns list of files found in path."""
|
||||
files = []
|
||||
types = EXT_FILTER.split()
|
||||
for filename in os.listdir(self.rom_path):
|
||||
for ext in types:
|
||||
if fnmatch.fnmatch(filename, ext):
|
||||
files.append(filename)
|
||||
return files
|
||||
|
||||
def get_rom_crc(self, archive, fname):
|
||||
rom_header = m64p_rom_header()
|
||||
ctypes.memmove(
|
||||
ctypes.byref(rom_header),
|
||||
archive.read(fname, ctypes.sizeof(rom_header)),
|
||||
ctypes.sizeof(rom_header))
|
||||
crc1_pre = sl(rom_header.CRC1)
|
||||
crc2_pre = sl(rom_header.CRC2)
|
||||
|
||||
regs = 0
|
||||
regs |= rom_header.init_PI_BSB_DOM1_LAT_REG << 24
|
||||
regs |= rom_header.init_PI_BSB_DOM1_PGS_REG << 16
|
||||
regs |= rom_header.init_PI_BSB_DOM1_PWD_REG << 8
|
||||
regs |= rom_header.init_PI_BSB_DOM1_PGS_REG2
|
||||
|
||||
if regs == 0x80371240:
|
||||
# native *.z64
|
||||
crc1 = crc1_pre
|
||||
crc2 = crc2_pre
|
||||
elif regs == 0x37804012:
|
||||
# byteswapped [BADC] *.v64
|
||||
crc1 = 0
|
||||
crc1 |= ((crc1_pre >> 0) & 0xff) << 8
|
||||
crc1 |= ((crc1_pre >> 8) & 0xff) << 0
|
||||
crc1 |= ((crc1_pre >> 16) & 0xff) << 24
|
||||
crc1 |= ((crc1_pre >> 24) & 0xff) << 16
|
||||
crc2 = 0
|
||||
crc2 |= ((crc2_pre >> 0) & 0xff) << 8
|
||||
crc2 |= ((crc2_pre >> 8) & 0xff) << 0
|
||||
crc2 |= ((crc2_pre >> 16) & 0xff) << 24
|
||||
crc2 |= ((crc2_pre >> 24) & 0xff) << 16
|
||||
elif regs == 0x40123780:
|
||||
# wordswapped [DCBA] *.n64
|
||||
crc1 = 0
|
||||
crc1 |= ((crc1_pre >> 0) & 0xff) << 24
|
||||
crc1 |= ((crc1_pre >> 8) & 0xff) << 16
|
||||
crc1 |= ((crc1_pre >> 16) & 0xff) << 8
|
||||
crc1 |= ((crc1_pre >> 24) & 0xff) << 0
|
||||
crc2 = 0
|
||||
crc2 |= ((crc2_pre >> 0) & 0xff) << 24
|
||||
crc2 |= ((crc2_pre >> 8) & 0xff) << 16
|
||||
crc2 |= ((crc2_pre >> 16) & 0xff) << 8
|
||||
crc2 |= ((crc2_pre >> 24) & 0xff) << 0
|
||||
else:
|
||||
return None
|
||||
return (crc1, crc2)
|
||||
|
||||
def read_files(self):
|
||||
"""Reads files."""
|
||||
self.roms = []
|
||||
files = self.get_files()
|
||||
num_files = len(files)
|
||||
for filenum, filename in enumerate(files):
|
||||
fullpath = os.path.join(self.rom_path, filename)
|
||||
try:
|
||||
archive = Archive(fullpath)
|
||||
for fname in archive.namelist:
|
||||
crc_tuple = self.get_rom_crc(archive, fname)
|
||||
if crc_tuple:
|
||||
rom_settings = self.parent.core.get_rom_settings(
|
||||
crc_tuple[0], crc_tuple[1])
|
||||
if rom_settings:
|
||||
crc = "%X%X" % (crc_tuple[0], crc_tuple[1])
|
||||
self.roms.append((crc, rom_settings.goodname, fullpath, fname))
|
||||
archive.close()
|
||||
except Exception as err:
|
||||
log.warn(str(err))
|
||||
continue
|
||||
percent = float(filenum) / float(num_files) * 100
|
||||
self.parent.progressBar.valueChanged.emit(percent)
|
||||
self.exit()
|
||||
|
||||
def stop(self):
|
||||
"""Stops thread."""
|
||||
if self.isRunning():
|
||||
self.terminate()
|
||||
self.wait()
|
||||
|
||||
def run(self):
|
||||
"""Starts thread."""
|
||||
self.read_files()
|
||||
self.exec_()
|
Loading…
Add table
Reference in a new issue