71 lines
2.5 KiB
Python
71 lines
2.5 KiB
Python
import os
|
|
import subprocess
|
|
from logging import getLogger
|
|
|
|
from PyQt5.QtCore import pyqtSignal, QObject
|
|
|
|
from rare.lgndr.core import LegendaryCore
|
|
from rare.models.pathspec import PathSpec
|
|
from .worker import Worker
|
|
|
|
logger = getLogger("WineResolver")
|
|
|
|
|
|
class WineResolver(Worker):
|
|
class Signals(QObject):
|
|
result_ready = pyqtSignal(str)
|
|
|
|
def __init__(self, core: LegendaryCore, path: str, app_name: str):
|
|
super(WineResolver, self).__init__()
|
|
self.signals = WineResolver.Signals()
|
|
self.wine_env = os.environ.copy()
|
|
self.wine_env.update(core.get_app_environment(app_name))
|
|
self.wine_env["WINEDLLOVERRIDES"] = "winemenubuilder=d;mscoree=d;mshtml=d;"
|
|
self.wine_env["DISPLAY"] = ""
|
|
|
|
self.wine_binary = core.lgd.config.get(
|
|
app_name,
|
|
"wine_executable",
|
|
fallback=core.lgd.config.get("default", "wine_executable", fallback="wine"),
|
|
)
|
|
self.winepath_binary = os.path.join(os.path.dirname(self.wine_binary), "winepath")
|
|
self.path = PathSpec(core, app_name).cook(path)
|
|
|
|
def run_real(self):
|
|
if "WINEPREFIX" not in self.wine_env or not os.path.exists(self.wine_env["WINEPREFIX"]):
|
|
# pylint: disable=E1136
|
|
self.signals.result_ready[str].emit("")
|
|
return
|
|
if not os.path.exists(self.wine_binary) or not os.path.exists(self.winepath_binary):
|
|
# pylint: disable=E1136
|
|
self.signals.result_ready[str].emit("")
|
|
return
|
|
path = self.path.strip().replace("/", "\\")
|
|
# lk: if path does not exist form
|
|
cmd = [self.wine_binary, "cmd", "/c", "echo", path]
|
|
# lk: if path exists and needs a case-sensitive interpretation form
|
|
# cmd = [self.wine_binary, 'cmd', '/c', f'cd {path} & cd']
|
|
proc = subprocess.Popen(
|
|
cmd,
|
|
stdout=subprocess.PIPE,
|
|
stderr=subprocess.PIPE,
|
|
env=self.wine_env,
|
|
shell=False,
|
|
text=True,
|
|
)
|
|
out, err = proc.communicate()
|
|
# Clean wine output
|
|
out = out.strip().strip('"')
|
|
proc = subprocess.Popen(
|
|
[self.winepath_binary, "-u", out],
|
|
stdout=subprocess.PIPE,
|
|
stderr=subprocess.PIPE,
|
|
env=self.wine_env,
|
|
shell=False,
|
|
text=True,
|
|
)
|
|
out, err = proc.communicate()
|
|
real_path = os.path.realpath(out.strip())
|
|
# pylint: disable=E1136
|
|
self.signals.result_ready[str].emit(real_path)
|
|
return
|